zepto 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/zepto +37 -0
- data/lib/javascript.rb +40 -0
- data/lib/markup.rb +117 -0
- data/lib/styles.rb +38 -0
- data/lib/template.rb +35 -0
- data/lib/zepto.rb +37 -0
- metadata +49 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 8aab4839dfa78673ccdc08be29310993699f9313973b26f74724ec3e6cb3c7b6
|
4
|
+
data.tar.gz: 5a2f994e9b16d71a5bb2ea7cc4c6b329b347d9b559eadff6b30bf47db1a7358b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a4e530310922a2650d429e0bba2b538b2fad1e1c1939bfba62099875bea5a4f8a75bcc2d8485a419b896aff1dc941ed22a6d850039ef813c404f39e1692581f3
|
7
|
+
data.tar.gz: d8da739a195af8f24916df3274532622d7f022724eff57992bf9609a752f1c927038e049e94901916bca0d4e1891e3abf4938fb2090e0f1539785c1743f9bf67
|
data/bin/zepto
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "zepto"
|
4
|
+
|
5
|
+
default_config = {
|
6
|
+
"assets": "_assets",
|
7
|
+
"layout": "_layout",
|
8
|
+
"styles": "_styles",
|
9
|
+
"javascript": "_javascript",
|
10
|
+
}
|
11
|
+
|
12
|
+
config = default_config
|
13
|
+
config_file_path = "zepto.json"
|
14
|
+
|
15
|
+
# Read user config file if present and merge it with default config
|
16
|
+
if File.file?(config_file_path)
|
17
|
+
config_file = File.open(config_file_path)
|
18
|
+
user_config = JSON.load config_file
|
19
|
+
config = config.merge(Hash[user_config.map { |k, v| [k.to_sym, v] }])
|
20
|
+
end
|
21
|
+
|
22
|
+
case ARGV[0]
|
23
|
+
when "serve"
|
24
|
+
Zepto.new(config).serve
|
25
|
+
when "build"
|
26
|
+
Zepto.new(config).build
|
27
|
+
when "help"
|
28
|
+
puts %(
|
29
|
+
zepto serve: To serve the files locally in dev mode
|
30
|
+
zepto build: Building for production
|
31
|
+
zepto help: Help options
|
32
|
+
|
33
|
+
For more details visit https://github.com/Rafi993/zepto
|
34
|
+
)
|
35
|
+
else
|
36
|
+
puts "I don't understand the command. Try running 'zepto help'"
|
37
|
+
end
|
data/lib/javascript.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
require "uglifier"
|
2
|
+
|
3
|
+
class Javascript
|
4
|
+
def initialize(javascript_path)
|
5
|
+
@javascript_path = javascript_path
|
6
|
+
@javascript = {}
|
7
|
+
end
|
8
|
+
|
9
|
+
def read(path)
|
10
|
+
if File.file? path
|
11
|
+
return File.read(path)
|
12
|
+
else
|
13
|
+
raise "File #{path} does not exist"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def parse(path)
|
18
|
+
file_content = read path
|
19
|
+
return file_content
|
20
|
+
end
|
21
|
+
|
22
|
+
def minify(content)
|
23
|
+
return Uglifier.compile(content, harmony: true)
|
24
|
+
end
|
25
|
+
|
26
|
+
def walk()
|
27
|
+
for file in Dir[@javascript_path + "/**/*.js"]
|
28
|
+
@javascript[file.sub(@javascript_path + "/", "").sub(".js", "").to_sym] = minify(parse(file))
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def compile()
|
33
|
+
walk
|
34
|
+
@javascript.each do |key, content|
|
35
|
+
view_path = Pathname("dist/" + key.to_s.delete_prefix('"').delete_suffix('/"') + ".js")
|
36
|
+
view_path.dirname.mkpath
|
37
|
+
view_path.write(content)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/markup.rb
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
require "redcarpet"
|
2
|
+
require "set"
|
3
|
+
|
4
|
+
require_relative "./template.rb"
|
5
|
+
|
6
|
+
class Markup
|
7
|
+
def initialize(layout_path)
|
8
|
+
@content = {}
|
9
|
+
@templates = {}
|
10
|
+
@tags = Set.new
|
11
|
+
@layout_path = layout_path
|
12
|
+
@markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML, autolink: true, tables: true,
|
13
|
+
strikethrough: true, highlight: true,
|
14
|
+
superscript: true)
|
15
|
+
end
|
16
|
+
|
17
|
+
def read(path)
|
18
|
+
if File.file? path
|
19
|
+
return File.read(path)
|
20
|
+
else
|
21
|
+
raise "File #{path} does not exist"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def parse_markdown(path)
|
26
|
+
file_content = read path
|
27
|
+
|
28
|
+
header = file_content.match(/-{3,}(.+)-{3,}/m)
|
29
|
+
post = {}
|
30
|
+
post[:path] = path.sub("content/", "").sub(".md", "")
|
31
|
+
|
32
|
+
if header
|
33
|
+
header_data = header.captures[0].split("\n").reject! { |s| s.nil? || s.strip.empty? }
|
34
|
+
|
35
|
+
for header in header_data
|
36
|
+
key, value = header.split(":", 2)
|
37
|
+
post[key.strip.to_sym] = value.strip.delete_prefix('"').delete_suffix('"')
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
post[:content] = @markdown.render(file_content.gsub(/-{3,}(.+)-{3,}/m, ""))
|
42
|
+
|
43
|
+
tags = Set.new
|
44
|
+
# Converting tags to Set
|
45
|
+
if post.has_key? :tags
|
46
|
+
for tag in post[:tags].to_s.delete_prefix("[").delete_suffix("]").split(/,/)
|
47
|
+
tag_name = tag.strip.delete_prefix('"').delete_suffix('"').strip
|
48
|
+
tags.add(tag_name)
|
49
|
+
# Storing all tags in @tags
|
50
|
+
@tags.add(tag_name)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
post[:tags] = tags
|
54
|
+
|
55
|
+
return post
|
56
|
+
end
|
57
|
+
|
58
|
+
def walk()
|
59
|
+
for file in Dir["content/**/*.md"]
|
60
|
+
@content[file.sub("content/", "").sub(".md", "").to_sym] = parse_markdown(file)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def get_tags
|
65
|
+
return @tags
|
66
|
+
end
|
67
|
+
|
68
|
+
def get_tag(tag)
|
69
|
+
if @tags.include?(tag)
|
70
|
+
content_with_tag = []
|
71
|
+
@content.each do |key, meta_data|
|
72
|
+
if meta_data[:tags].include?(tag)
|
73
|
+
content_with_tag.push(meta_data)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
return content_with_tag
|
77
|
+
else
|
78
|
+
puts "You have not defined #{tag}"
|
79
|
+
return []
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def get_path(path)
|
84
|
+
content_with_path = []
|
85
|
+
@content.each do |key, meta_data|
|
86
|
+
puts meta_data[:path]
|
87
|
+
if meta_data[:path].start_with?(path)
|
88
|
+
content_with_path.push(meta_data)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
return content_with_path
|
92
|
+
end
|
93
|
+
|
94
|
+
def compile()
|
95
|
+
walk
|
96
|
+
@content.each do |key, meta_data|
|
97
|
+
layout = (meta_data[:layout]).delete_prefix('"').delete_suffix('"')
|
98
|
+
if layout
|
99
|
+
layout_file_path = @layout_path + "/" + layout
|
100
|
+
if File.file?(layout_file_path)
|
101
|
+
template = File.read(layout_file_path)
|
102
|
+
path = meta_data[:path]
|
103
|
+
# TODO: Need cleanup way methods are passed
|
104
|
+
@templates[path] = Template.new(template, meta_data, method(:get_tag),
|
105
|
+
method(:get_tags),
|
106
|
+
method(:get_path))
|
107
|
+
@templates[path].render
|
108
|
+
@templates[path].write
|
109
|
+
else
|
110
|
+
raise "File #{layout_file_path} is not found"
|
111
|
+
end
|
112
|
+
else
|
113
|
+
raise "You have not specified any layout for #{key}"
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
data/lib/styles.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
class Styles
|
2
|
+
def initialize(styles_path)
|
3
|
+
@styles_path = styles_path
|
4
|
+
@styles = {}
|
5
|
+
end
|
6
|
+
|
7
|
+
def read(path)
|
8
|
+
if File.file? path
|
9
|
+
return File.read(path)
|
10
|
+
else
|
11
|
+
raise "File #{path} does not exist"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def parse(path)
|
16
|
+
file_content = read path
|
17
|
+
return file_content
|
18
|
+
end
|
19
|
+
|
20
|
+
def minify(content)
|
21
|
+
return content.gsub(/\s+/, "")
|
22
|
+
end
|
23
|
+
|
24
|
+
def walk()
|
25
|
+
for file in Dir[@styles_path + "/**/*.css"]
|
26
|
+
@styles[file.sub(@styles_path + "/", "").sub(".css", "").to_sym] = minify(parse(file))
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def compile()
|
31
|
+
walk
|
32
|
+
@styles.each do |key, content|
|
33
|
+
view_path = Pathname("dist/" + key.to_s.delete_prefix('"').delete_suffix('/"') + ".css")
|
34
|
+
view_path.dirname.mkpath
|
35
|
+
view_path.write(content)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/template.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require "erb"
|
2
|
+
require "pathname"
|
3
|
+
|
4
|
+
class Template
|
5
|
+
def initialize(template, meta_data, get_tag, get_tags, get_path)
|
6
|
+
@template = template
|
7
|
+
define_singleton_method(:get_tag) do |tag|
|
8
|
+
get_tag.call(tag)
|
9
|
+
end
|
10
|
+
|
11
|
+
define_singleton_method(:get_tags) do
|
12
|
+
get_tags.call
|
13
|
+
end
|
14
|
+
|
15
|
+
define_singleton_method(:get_path) do |path|
|
16
|
+
get_path.call(path)
|
17
|
+
end
|
18
|
+
|
19
|
+
# Setting all the metadata keys as instance variables
|
20
|
+
meta_data.each do |key, val|
|
21
|
+
instance_variable_set("@#{key}", val)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def render()
|
26
|
+
renderer = ERB.new(@template)
|
27
|
+
@html = renderer.result(binding)
|
28
|
+
end
|
29
|
+
|
30
|
+
def write
|
31
|
+
view_path = Pathname("dist/" + @path.delete_prefix('"').delete_suffix('"').delete_suffix("/") + ".html")
|
32
|
+
view_path.dirname.mkpath
|
33
|
+
view_path.write(@html)
|
34
|
+
end
|
35
|
+
end
|
data/lib/zepto.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
require_relative "./markup.rb"
|
2
|
+
require_relative "./styles.rb"
|
3
|
+
require_relative "./javascript.rb"
|
4
|
+
|
5
|
+
class Zepto
|
6
|
+
def initialize(config)
|
7
|
+
@assets_path = config[:assets]
|
8
|
+
@layout = config[:layout]
|
9
|
+
@styles_path = config[:styles]
|
10
|
+
@javascript_path = config[:javascript]
|
11
|
+
end
|
12
|
+
|
13
|
+
def serve
|
14
|
+
puts "Starting server in port 3000"
|
15
|
+
end
|
16
|
+
|
17
|
+
def build
|
18
|
+
puts "Building static files"
|
19
|
+
|
20
|
+
# Building Layouts
|
21
|
+
markup = Markup.new(@layout)
|
22
|
+
markup.compile()
|
23
|
+
|
24
|
+
# Building styles
|
25
|
+
styles = Styles.new(@styles_path)
|
26
|
+
styles.compile()
|
27
|
+
|
28
|
+
# Minifying js
|
29
|
+
javascript = Javascript.new(@javascript_path)
|
30
|
+
javascript.compile()
|
31
|
+
|
32
|
+
# Copying assets in to dist/
|
33
|
+
if File.directory? @assets_path
|
34
|
+
FileUtils.cp_r @assets_path + "/.", "dist"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
metadata
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: zepto
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Rafi993
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-05-31 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Simple static site generator with battries included
|
14
|
+
email: rafi993@protonmail.com
|
15
|
+
executables:
|
16
|
+
- zepto
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- bin/zepto
|
21
|
+
- lib/javascript.rb
|
22
|
+
- lib/markup.rb
|
23
|
+
- lib/styles.rb
|
24
|
+
- lib/template.rb
|
25
|
+
- lib/zepto.rb
|
26
|
+
homepage: https://github.com/Rafi993/zepto
|
27
|
+
licenses:
|
28
|
+
- MIT
|
29
|
+
metadata: {}
|
30
|
+
post_install_message:
|
31
|
+
rdoc_options: []
|
32
|
+
require_paths:
|
33
|
+
- lib
|
34
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
35
|
+
requirements:
|
36
|
+
- - ">="
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
requirements: []
|
45
|
+
rubygems_version: 3.1.2
|
46
|
+
signing_key:
|
47
|
+
specification_version: 4
|
48
|
+
summary: Simple static site generator
|
49
|
+
test_files: []
|