easy_html_generator 1.0.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
- data/CONTRIBUTING.md +44 -0
- data/LICENSE +22 -0
- data/README.md +332 -0
- data/bin/ehg +52 -0
- data/lib/easy_html_generator.rb +100 -0
- data/lib/easy_html_generator/checksum.rb +39 -0
- data/lib/easy_html_generator/config.rb +147 -0
- data/lib/easy_html_generator/generator.rb +25 -0
- data/lib/easy_html_generator/generator/base.rb +83 -0
- data/lib/easy_html_generator/generator/combine.rb +28 -0
- data/lib/easy_html_generator/generator/compile/coffee.rb +30 -0
- data/lib/easy_html_generator/generator/compile/haml.rb +70 -0
- data/lib/easy_html_generator/generator/compile/haml/context.rb +52 -0
- data/lib/easy_html_generator/generator/compile/haml/helper/activesupport_override.rb +48 -0
- data/lib/easy_html_generator/generator/compile/haml/helper/asset_helper.rb +78 -0
- data/lib/easy_html_generator/generator/compile/haml/layout.rb +35 -0
- data/lib/easy_html_generator/generator/compile/sass.rb +47 -0
- data/lib/easy_html_generator/generator/copy.rb +44 -0
- data/lib/easy_html_generator/generator/delete.rb +20 -0
- data/lib/easy_html_generator/generator/minimize/css.rb +28 -0
- data/lib/easy_html_generator/generator/minimize/html.rb +32 -0
- data/lib/easy_html_generator/generator/minimize/images.rb +33 -0
- data/lib/easy_html_generator/generator/minimize/js.rb +28 -0
- data/lib/easy_html_generator/generator/service/analytics.rb +34 -0
- data/lib/easy_html_generator/generator/service/bower.rb +34 -0
- data/lib/easy_html_generator/generator/service/grunt.rb +24 -0
- data/lib/easy_html_generator/generator/structure.rb +20 -0
- data/lib/easy_html_generator/generators.rb +53 -0
- data/lib/easy_html_generator/project.rb +77 -0
- data/lib/easy_html_generator/rackapp.rb +67 -0
- data/lib/easy_html_generator/workspace.rb +59 -0
- data/src/demo/assets/images/demo.png +0 -0
- data/src/demo/assets/public/robots.txt +0 -0
- data/src/demo/assets/scripts/demo.js.coffee +1 -0
- data/src/demo/assets/scripts/plain.js +0 -0
- data/src/demo/assets/styles/app.css.sass +2 -0
- data/src/demo/assets/styles/plain.css +0 -0
- data/src/demo/lib/generators/project_generator.rb +12 -0
- data/src/demo/lib/helper/projecthelper.rb +5 -0
- data/src/demo/views/index.html.haml +1 -0
- data/src/demo/views/index/_lore_ipsum.haml +1 -0
- data/src/demo/views/layout.haml +8 -0
- data/src/demo/views/plain.html +0 -0
- data/src/shared/assets/images/shared.png +0 -0
- data/src/shared/assets/scripts/shared.js.coffee +1 -0
- data/src/shared/assets/scripts/shared.plain.js +0 -0
- data/src/shared/assets/styles/mixins/_arrows.sass +32 -0
- data/src/shared/assets/styles/mixins/_bootstrap-fixes.sass +12 -0
- data/src/shared/assets/styles/mixins/_buttons.sass +32 -0
- data/src/shared/assets/styles/mixins/_css3.sass +266 -0
- data/src/shared/assets/styles/mixins/_headjs-bootstrap-mediaqueries.sass +42 -0
- data/src/shared/assets/styles/mixins/_helper.sass +70 -0
- data/src/shared/assets/styles/mixins/_normalize.sass +340 -0
- data/src/shared/assets/styles/mixins/_reset.sass +46 -0
- data/src/shared/lib/generators/shared_generator.rb +12 -0
- data/src/shared/lib/helper/shared_helper.rb +16 -0
- data/src/shared/project.yml +127 -0
- data/src/shared/views/404.yml +5 -0
- data/src/template/assets/public/robots.txt +0 -0
- data/src/template/assets/scripts/index.js.coffee +1 -0
- data/src/template/assets/styles/index.css.sass +2 -0
- data/src/template/lib/generators/project_generator.rb +12 -0
- data/src/template/lib/helper/project_helper.rb +5 -0
- data/src/template/project.yml +128 -0
- data/src/template/views/index.html.haml +4 -0
- data/src/template/views/index/_lore_ipsum.haml +2 -0
- data/src/template/views/layout.haml +9 -0
- metadata +402 -0
@@ -0,0 +1,33 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'piet'
|
3
|
+
require 'easy_html_generator/generator/base'
|
4
|
+
|
5
|
+
# this generator minifies image files from src folder and copies them
|
6
|
+
# to the dist folder
|
7
|
+
class EasyHtmlGenerator::Generator::Minimize::Images <
|
8
|
+
EasyHtmlGenerator::Generator::Base
|
9
|
+
|
10
|
+
def initialize(project, config)
|
11
|
+
super(project, config)
|
12
|
+
|
13
|
+
@config.src = project.config.paths.src.images
|
14
|
+
@config.dest = project.config.paths.dist.images
|
15
|
+
end
|
16
|
+
|
17
|
+
def do_file(src, target, *args)
|
18
|
+
return unless File.exist?(src) && File.file?(src)
|
19
|
+
log "-> do_file #{src}"
|
20
|
+
|
21
|
+
FileUtils.mkdir_p File.dirname(target)
|
22
|
+
|
23
|
+
args.push target
|
24
|
+
|
25
|
+
FileUtils.copy(src, target)
|
26
|
+
|
27
|
+
Piet.optimize(target, @config.options)
|
28
|
+
|
29
|
+
EasyHtmlGenerator::Checksum.store_file(src)
|
30
|
+
rescue StandardError
|
31
|
+
log '-> you have to install "optipng" and "jpegoptim"'.red
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'uglifier'
|
3
|
+
require 'easy_html_generator/generator/base'
|
4
|
+
|
5
|
+
# this generator minifies js files from src folder and copies them
|
6
|
+
# to the dist folder
|
7
|
+
class EasyHtmlGenerator::Generator::Minimize::Js <
|
8
|
+
EasyHtmlGenerator::Generator::Base
|
9
|
+
|
10
|
+
def initialize(project, config)
|
11
|
+
super(project, config)
|
12
|
+
|
13
|
+
@config.src = project.config.paths.src.scripts
|
14
|
+
@config.dest = project.config.paths.dist.scripts
|
15
|
+
end
|
16
|
+
|
17
|
+
def do_input(input, *_args)
|
18
|
+
self.class.compress input
|
19
|
+
end
|
20
|
+
|
21
|
+
def input_to_output_file(i)
|
22
|
+
super(i).gsub('.js', "#{@config.prefix_extension}.js")
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.compress(input)
|
26
|
+
Uglifier.compile input
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'easy_html_generator/generator/base'
|
3
|
+
|
4
|
+
# this generator adds web tracking snippets to files in the dist folder
|
5
|
+
class EasyHtmlGenerator::Generator::Service::Analytics <
|
6
|
+
EasyHtmlGenerator::Generator::Base
|
7
|
+
|
8
|
+
def generate
|
9
|
+
return unless @config.enabled
|
10
|
+
|
11
|
+
log_running
|
12
|
+
|
13
|
+
selector = File.join(@project.dist_path_to(:views),
|
14
|
+
@config.append_to_files)
|
15
|
+
Dir[selector].each do |file|
|
16
|
+
do_google file
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def do_google(file)
|
21
|
+
return unless @config.google.enabled
|
22
|
+
|
23
|
+
content = File.read(file)
|
24
|
+
return if file.include? '<!-- Google Analytics -->'
|
25
|
+
|
26
|
+
code = @config.google.code.sub('{GOOGLE_UA_ID}', @config.google.id)
|
27
|
+
|
28
|
+
code = "<!-- Google Analytics -->#{code}<!-- End Google Analytics -->"
|
29
|
+
|
30
|
+
content = content.sub('</head>', "#{code}</head>")
|
31
|
+
|
32
|
+
File.write(file, content)
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'fileutils'
|
3
|
+
require 'easy_html_generator/generator/base'
|
4
|
+
|
5
|
+
# this generator resolves and runs a bower.json
|
6
|
+
class EasyHtmlGenerator::Generator::Service::Bower <
|
7
|
+
EasyHtmlGenerator::Generator::Base
|
8
|
+
|
9
|
+
def initialize(project, config)
|
10
|
+
super(project, config)
|
11
|
+
|
12
|
+
@config.src = ''
|
13
|
+
@config.dest = ''
|
14
|
+
end
|
15
|
+
|
16
|
+
def do_file(bower_file, *_args)
|
17
|
+
input_folder = File.dirname(bower_file)
|
18
|
+
output_folder = File.join(@project.dist_path_to(:scripts), @config.target)
|
19
|
+
|
20
|
+
cmd = "cd #{input_folder} && bower install"
|
21
|
+
cmd = "if which bower >/dev/null; then echo '\e[32mrunning bower\e[0m' \
|
22
|
+
&& #{cmd}; else echo '\e[31mplease install bower \
|
23
|
+
\"npm install -g bower\" http://bower.io/ \e[0m'; fi"
|
24
|
+
|
25
|
+
log ` #{cmd} `
|
26
|
+
|
27
|
+
FileUtils.mkdir_p output_folder
|
28
|
+
|
29
|
+
EasyHtmlGenerator::Generator::Copy.copy_r(
|
30
|
+
"#{input_folder}/bower_components", output_folder, '**/*')
|
31
|
+
|
32
|
+
EasyHtmlGenerator::Checksum.store_file(bower_file)
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'easy_html_generator/generator/base'
|
3
|
+
|
4
|
+
# this generator resolves and runs a Gruntfile
|
5
|
+
class EasyHtmlGenerator::Generator::Service::Grunt <
|
6
|
+
EasyHtmlGenerator::Generator::Base
|
7
|
+
|
8
|
+
def initialize(project, config)
|
9
|
+
super(project, config)
|
10
|
+
|
11
|
+
@config.src = ''
|
12
|
+
@config.dest = ''
|
13
|
+
end
|
14
|
+
|
15
|
+
def do_file(grunt_file, *_args)
|
16
|
+
input_folder = File.dirname(grunt_file)
|
17
|
+
|
18
|
+
cmd = "cd #{input_folder} && npm install && grunt #{@config.task}"
|
19
|
+
cmd = "if which grunt >/dev/null; then echo '\e[32m | ->running grunt \
|
20
|
+
\e[0m' && #{cmd}; else echo '\e[31mplease install grunt \
|
21
|
+
\"npm install -g grunt\" http://gruntjs.com/ \e[0m'; fi"
|
22
|
+
log ` #{cmd} `
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'find'
|
3
|
+
require 'fileutils'
|
4
|
+
require 'easy_html_generator/generator/base'
|
5
|
+
|
6
|
+
# this generator creates dist paths
|
7
|
+
class EasyHtmlGenerator::Generator::Structure <
|
8
|
+
EasyHtmlGenerator::Generator::Base
|
9
|
+
|
10
|
+
def generate
|
11
|
+
return unless @config.enabled
|
12
|
+
|
13
|
+
log_running
|
14
|
+
|
15
|
+
@project.config.paths.dist.each do |_index, dir|
|
16
|
+
next if dir.empty?
|
17
|
+
FileUtils.mkdir_p("#{@project.dist_path}/#{dir}")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
# this class handles multiple generators for a project
|
4
|
+
class EasyHtmlGenerator::Generators
|
5
|
+
def initialize(project)
|
6
|
+
@project = project
|
7
|
+
@generators = load_generators
|
8
|
+
end
|
9
|
+
|
10
|
+
def generate
|
11
|
+
@generators.each do |_index, generator|
|
12
|
+
generator.generate
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def generator_class_by_name(name)
|
17
|
+
name = name.split('_').map { |n| capitalize(n) }.join('::')
|
18
|
+
capitalize(name) # if there is no _
|
19
|
+
|
20
|
+
"EasyHtmlGenerator::Generator::#{name}"
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def capitalize(input)
|
26
|
+
input.slice(0, 1).capitalize + input.slice(1..-1)
|
27
|
+
end
|
28
|
+
|
29
|
+
def load_generators
|
30
|
+
Dir[@project.src_path_to(:generators, '**/*.rb'),
|
31
|
+
EasyHtmlGenerator::SHARED_GENERATORS_PATH + '/**/*.rb']
|
32
|
+
.each { |file| load file }
|
33
|
+
|
34
|
+
result = {}
|
35
|
+
@project.config.generators.each.map do |generator|
|
36
|
+
name, config = generator.first
|
37
|
+
result[name] = generator_by_name(name.to_s, config)
|
38
|
+
end
|
39
|
+
result
|
40
|
+
end
|
41
|
+
|
42
|
+
def generator_by_name(name, config)
|
43
|
+
clazz = Object.const_get generator_class_by_name(name)
|
44
|
+
|
45
|
+
clazz.new(@project, config)
|
46
|
+
end
|
47
|
+
|
48
|
+
def method_missing(name, *args)
|
49
|
+
return super.method_missing name unless @generators.key? name
|
50
|
+
|
51
|
+
@generators[name]
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
# this class represents a project and handles generators and ressources
|
4
|
+
class EasyHtmlGenerator::Project
|
5
|
+
attr_reader :src_path, :dist_path, :name, :generators, :config
|
6
|
+
|
7
|
+
def initialize(name, src_path, dist_path, config_file)
|
8
|
+
@name = name
|
9
|
+
@src_path = src_path
|
10
|
+
@dist_path = dist_path
|
11
|
+
|
12
|
+
@config_file = config_file
|
13
|
+
load_config config_file
|
14
|
+
load_generators
|
15
|
+
end
|
16
|
+
|
17
|
+
def src_path_to(type, relative_path = '')
|
18
|
+
File.join(@src_path, @config.paths.src[type.to_sym], relative_path)
|
19
|
+
end
|
20
|
+
|
21
|
+
def dist_path_to(type, relative_path = '')
|
22
|
+
File.join(@dist_path, @config.paths.dist[type.to_sym], relative_path)
|
23
|
+
end
|
24
|
+
|
25
|
+
def uri_path_to(type, relative_path = '')
|
26
|
+
File.join('/', @name, @config.paths.dist[type.to_sym], relative_path)
|
27
|
+
end
|
28
|
+
|
29
|
+
def generate
|
30
|
+
STDERR.puts ''
|
31
|
+
STDERR.puts ' -----------------------------'.green
|
32
|
+
STDERR.puts " | compiling project #{@name}".green
|
33
|
+
STDERR.puts ' -----------------------------'.green
|
34
|
+
|
35
|
+
reaload_if_config_changed
|
36
|
+
|
37
|
+
@generators.generate
|
38
|
+
end
|
39
|
+
|
40
|
+
def list_dir(_relative_path = '/')
|
41
|
+
dir_pattern = File.join(src_path_to(:views), '*.html*')
|
42
|
+
|
43
|
+
dirs = Dir[dir_pattern].map { |file| file.sub('.html.haml', '.html') }
|
44
|
+
|
45
|
+
dirs.map { |file| file.sub(src_path_to(:views), "#{name}/") }
|
46
|
+
end
|
47
|
+
|
48
|
+
def should_generate_for?(path)
|
49
|
+
return true unless path
|
50
|
+
|
51
|
+
@config.generate_on_request_path_match.each do |pattern|
|
52
|
+
return true if pattern.match path
|
53
|
+
end
|
54
|
+
|
55
|
+
false
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def load_config(file)
|
61
|
+
@config = EasyHtmlGenerator::Config.from_file file
|
62
|
+
@config[:generate_on_request_path_match].map! { |p| Regexp.new(p) }
|
63
|
+
EasyHtmlGenerator::Checksum.store_file file
|
64
|
+
end
|
65
|
+
|
66
|
+
def load_generators
|
67
|
+
@generators = EasyHtmlGenerator::Generators.new self
|
68
|
+
end
|
69
|
+
|
70
|
+
def reaload_if_config_changed
|
71
|
+
return unless EasyHtmlGenerator::Checksum.file_changed? @config_file
|
72
|
+
STDERR.puts " | -> reloading config(#{@config_file.green})"
|
73
|
+
|
74
|
+
load_config @config_file
|
75
|
+
load_generators
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'rack'
|
3
|
+
require 'rack/abstract_format'
|
4
|
+
require 'rack/respond_to'
|
5
|
+
|
6
|
+
# this is the rack application for ehg
|
7
|
+
class EasyHtmlGenerator::Rackapp
|
8
|
+
include Rack::RespondTo
|
9
|
+
|
10
|
+
EHG_URL = 'https://github.com/creative-workflow/easy-html-generator'
|
11
|
+
LIST_BODY = "<!DOCTYPE html><html><head>
|
12
|
+
<style>*{ font-size: 20px;
|
13
|
+
font-family: Verdana, 'Lucida Sans Unicode', sans-serif;}
|
14
|
+
a,a:hover{text-decoration: none; color: #818181;}
|
15
|
+
</style></head>
|
16
|
+
<body>
|
17
|
+
{CONTENT}
|
18
|
+
<a target='_blank' href='#{EHG_URL}'>ehc on Github</a></body></html>"
|
19
|
+
|
20
|
+
def self.call(env)
|
21
|
+
Rack::RespondTo.env = env
|
22
|
+
request = Rack::Request.new(env)
|
23
|
+
|
24
|
+
case request.path_info
|
25
|
+
when '/'
|
26
|
+
list_dir
|
27
|
+
else
|
28
|
+
dispatch(request)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.respond(body, status_code = 200)
|
33
|
+
content_type = Rack::RespondTo.selected_media_type || 'text/html'
|
34
|
+
|
35
|
+
[status_code, { 'Content-Type' => "#{content_type}; charset=UTF-8" }, [body || '']]
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.dispatch(request)
|
39
|
+
file = EasyHtmlGenerator.dispatch(request)
|
40
|
+
|
41
|
+
if File.exist? file
|
42
|
+
respond(File.read(file))
|
43
|
+
else
|
44
|
+
respond("404 not found #{file}", 404)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.list_dir
|
49
|
+
content = ''
|
50
|
+
EasyHtmlGenerator.projects.each do |_name, project|
|
51
|
+
content += "<h3>#{project.name}</h3>"
|
52
|
+
project.list_dir.each do |file|
|
53
|
+
content += build_list_dir_row(file)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
content = LIST_BODY.sub('{CONTENT}', "<ul>#{content}</ul>")
|
57
|
+
|
58
|
+
respond(content)
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.build_list_dir_row(file)
|
62
|
+
f = File.path(file)
|
63
|
+
f_name = File.basename(f)
|
64
|
+
f_path = File.dirname(f)
|
65
|
+
"<li><a href='#{f_path}/#{f_name}'><b>#{f_path}</b>/#{f_name}</a></li>"
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
# this class creates project instances
|
5
|
+
class EasyHtmlGenerator::Workspace
|
6
|
+
@project_instances = {}
|
7
|
+
|
8
|
+
def self.projects
|
9
|
+
if @project_instances.empty?
|
10
|
+
project_folders.each do |path|
|
11
|
+
next if path.include? 'shared'
|
12
|
+
p = project_instance_from_path path
|
13
|
+
@project_instances[p.name.to_sym] = p
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
@project_instances
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.project_folders
|
21
|
+
Dir[File.join(EasyHtmlGenerator::SRC_PATH, '*')]
|
22
|
+
.reject { |o| !File.directory?(o) }
|
23
|
+
.map { |o| File.expand_path(o) }
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.create_project(name)
|
27
|
+
FileUtils.cp_r(
|
28
|
+
File.join(EasyHtmlGenerator::EHC_SRC_PATH, 'template'),
|
29
|
+
File.join(EasyHtmlGenerator::SRC_PATH, name))
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.init
|
33
|
+
EasyHtmlGenerator::CREATE_ON_INIT.each do |dir|
|
34
|
+
FileUtils.mkdir_p dir
|
35
|
+
end
|
36
|
+
|
37
|
+
EasyHtmlGenerator::COPY_ON_INIT.each do |src, target|
|
38
|
+
FileUtils.cp_r src, target
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.project_instance_from_path(path)
|
43
|
+
name = path.split('/').last.sub('/', '')
|
44
|
+
|
45
|
+
config_file = "#{EasyHtmlGenerator::SHARED_PATH}/project.yml"
|
46
|
+
config_file = "#{path}/project.yml" if File.exist? "#{path}/project.yml"
|
47
|
+
|
48
|
+
EasyHtmlGenerator::Project.new(
|
49
|
+
name,
|
50
|
+
"#{EasyHtmlGenerator::SRC_PATH}/#{name}",
|
51
|
+
"#{EasyHtmlGenerator::DIST_PATH}/#{name}",
|
52
|
+
config_file
|
53
|
+
)
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.project_by_name(name)
|
57
|
+
projects[name.to_sym]
|
58
|
+
end
|
59
|
+
end
|
Binary file
|