wavy 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.
- checksums.yaml +7 -0
- data/bin/wavy +5 -0
- data/lib/wavy/core.rb +75 -0
- data/lib/wavy/help.rb +8 -0
- data/lib/wavy/models/imports.rb +37 -0
- data/lib/wavy/models/mixins.rb +30 -0
- data/lib/wavy/models/template.rb +34 -0
- data/lib/wavy/models.rb +8 -0
- data/lib/wavy/nodes/import.rb +23 -0
- data/lib/wavy/nodes/mixin.rb +47 -0
- data/lib/wavy/nodes.rb +7 -0
- data/lib/wavy/parsers/import.rb +45 -0
- data/lib/wavy/parsers/mixin.rb +71 -0
- data/lib/wavy/parsers.rb +12 -0
- data/lib/wavy/utils/filesys.rb +41 -0
- data/lib/wavy/utils.rb +6 -0
- data/lib/wavy/version.rb +13 -0
- data/lib/wavy.rb +58 -0
- metadata +61 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c5959e7b31a7565a63bdec8802465c0fb4389527
|
4
|
+
data.tar.gz: 3011bef5bf3f58bd30903199ef885c0e04de76b5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: dfba4d12c8b77b39955fe16d488644962767985d8dafb861123158365dbec2984ccca18dda71d6cbbb137a6d3783494633093fc977e8263293d2249384f9c41c
|
7
|
+
data.tar.gz: 81241688917074d656d9608e9f6697efd5e652866dad8221d86c1ca68a5043c4a77a661ce5dfc64449481a3d7d409c36c735ffaaa27c73401d179f5139ca4a23
|
data/bin/wavy
ADDED
data/lib/wavy/core.rb
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'wavy/utils'
|
2
|
+
require 'wavy/nodes'
|
3
|
+
require 'wavy/models'
|
4
|
+
require 'wavy/parsers'
|
5
|
+
|
6
|
+
module Wavy
|
7
|
+
|
8
|
+
# File suffix
|
9
|
+
FILE_SUFFIX = ".wavy"
|
10
|
+
|
11
|
+
# Find and read files
|
12
|
+
FILE_IMPORTER = Wavy::Utils::FileSys
|
13
|
+
|
14
|
+
class Core
|
15
|
+
|
16
|
+
String @root_path
|
17
|
+
|
18
|
+
String @view
|
19
|
+
String @config
|
20
|
+
String @filename
|
21
|
+
|
22
|
+
# Creates a new Core
|
23
|
+
#
|
24
|
+
# @param (String) config Main configuration file
|
25
|
+
# @param (String) view Template to compile
|
26
|
+
# @param (Boolean|String) Path to save output
|
27
|
+
def initialize(config, view, save)
|
28
|
+
@view = view
|
29
|
+
@config = config
|
30
|
+
@save = save
|
31
|
+
@config_root = File.expand_path(File.dirname(@config))
|
32
|
+
@filename = File.basename(@view)
|
33
|
+
end
|
34
|
+
|
35
|
+
# Reads configuration and view files. Begins parsing.
|
36
|
+
def compile()
|
37
|
+
begin
|
38
|
+
@config = FILE_IMPORTER.load(@config, true)
|
39
|
+
Wavy::Parsers::Import.load(@config, @config_root)
|
40
|
+
Wavy::Parsers::Import.extract
|
41
|
+
|
42
|
+
@view = FILE_IMPORTER.load(@view)
|
43
|
+
render(@view)
|
44
|
+
rescue Exception => e
|
45
|
+
puts e.message
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# Saves parsed template.
|
50
|
+
#
|
51
|
+
# @param (String) view Content of the view
|
52
|
+
def render(view)
|
53
|
+
output = Wavy::Models::Template.new(view).parse
|
54
|
+
|
55
|
+
if @save != false
|
56
|
+
filename = @filename.gsub("#{FILE_SUFFIX}", "")
|
57
|
+
path = File.expand_path(@save)
|
58
|
+
path = path + "/" + filename
|
59
|
+
|
60
|
+
begin
|
61
|
+
file = File.open(path, "w")
|
62
|
+
file.write(output)
|
63
|
+
rescue IOError => e
|
64
|
+
raise 'Could not save file.'
|
65
|
+
ensure
|
66
|
+
file.close unless file == nil
|
67
|
+
end
|
68
|
+
else
|
69
|
+
puts output
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
data/lib/wavy/help.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
module Wavy
|
2
|
+
|
3
|
+
module Models
|
4
|
+
|
5
|
+
class Imports
|
6
|
+
|
7
|
+
@data = {}
|
8
|
+
|
9
|
+
# Add an import to the data model.
|
10
|
+
#
|
11
|
+
# @param (String) id Unique name of the import
|
12
|
+
# @param (Tree::ImportNode) node Import node object
|
13
|
+
# @param (String) file File path
|
14
|
+
def self.add(id, node, file = '')
|
15
|
+
if file == ''
|
16
|
+
file = id
|
17
|
+
end
|
18
|
+
|
19
|
+
if !@data[id]
|
20
|
+
@data[id] = node
|
21
|
+
else
|
22
|
+
puts file + ' is being imported more than once.'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# Get all of the import definitions.
|
27
|
+
#
|
28
|
+
# @return (Object) @data Object of imports
|
29
|
+
def self.get()
|
30
|
+
return @data
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Wavy
|
2
|
+
|
3
|
+
module Models
|
4
|
+
|
5
|
+
class Mixins
|
6
|
+
|
7
|
+
@data = {}
|
8
|
+
|
9
|
+
# Add a mixin to the data model.
|
10
|
+
#
|
11
|
+
# @param (String) id Unique name of the import
|
12
|
+
# @param (Tree::MixinNode) node Mixin node object
|
13
|
+
def self.add(id, node)
|
14
|
+
if !@data[id]
|
15
|
+
@data[id] = node
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# Get all of the mixin definitions.
|
20
|
+
#
|
21
|
+
# @return (Object) @data Object of mixins
|
22
|
+
def self.get()
|
23
|
+
return @data
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Wavy
|
2
|
+
|
3
|
+
module Models
|
4
|
+
|
5
|
+
class Template
|
6
|
+
|
7
|
+
# (String) Original template content
|
8
|
+
attr_reader :content
|
9
|
+
|
10
|
+
# (String) Compiled template content
|
11
|
+
attr_reader :compiled
|
12
|
+
|
13
|
+
# Creates a new view template
|
14
|
+
#
|
15
|
+
# @return (String) content The view content (string/html)
|
16
|
+
def initialize(content)
|
17
|
+
@content = content
|
18
|
+
@compiled = ""
|
19
|
+
end
|
20
|
+
|
21
|
+
# Parse the template.
|
22
|
+
#
|
23
|
+
# @return (String) @compiled Compiled output
|
24
|
+
def parse
|
25
|
+
@compiled = Wavy::Parsers::Mixin.parse(@content)
|
26
|
+
|
27
|
+
return @compiled
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
data/lib/wavy/models.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
module Wavy
|
2
|
+
|
3
|
+
module Nodes
|
4
|
+
|
5
|
+
class Import
|
6
|
+
|
7
|
+
# (String) Content of import file
|
8
|
+
attr_reader :content
|
9
|
+
|
10
|
+
# Creates a new Import node
|
11
|
+
#
|
12
|
+
# @param (String) path Path to file
|
13
|
+
# @param (String) content Content of file
|
14
|
+
def initialize(path, content)
|
15
|
+
@path = path
|
16
|
+
@content = content
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Wavy
|
2
|
+
|
3
|
+
module Nodes
|
4
|
+
|
5
|
+
class Mixin
|
6
|
+
|
7
|
+
# (Array) Params of mixin
|
8
|
+
attr_reader :params
|
9
|
+
|
10
|
+
# (String) Content within mixin
|
11
|
+
attr_reader :content
|
12
|
+
|
13
|
+
# Creates a new Mixin node
|
14
|
+
#
|
15
|
+
# @param (String) name Name of mixin
|
16
|
+
# @param (String) params Specified arguments
|
17
|
+
# @param (String) content Content of mixin
|
18
|
+
def initialize(name, params, content)
|
19
|
+
@name = name
|
20
|
+
@params = get_params(params)
|
21
|
+
@content = content
|
22
|
+
end
|
23
|
+
|
24
|
+
# Converts string of mixin parameters to an array.
|
25
|
+
#
|
26
|
+
# @return (Array) params Array of clean parameters
|
27
|
+
def get_params(args)
|
28
|
+
params = []
|
29
|
+
|
30
|
+
args = args.split(",")
|
31
|
+
|
32
|
+
args.each do |arg|
|
33
|
+
arg = arg.strip
|
34
|
+
if arg.index('$') == 0
|
35
|
+
arg[0] = ''
|
36
|
+
params.push(arg)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
return params
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
data/lib/wavy/nodes.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
module Wavy
|
2
|
+
|
3
|
+
module Parsers
|
4
|
+
|
5
|
+
class Import
|
6
|
+
|
7
|
+
# Creates a new Core
|
8
|
+
#
|
9
|
+
# @param (String) content Content of the file
|
10
|
+
# @param (String) root Root path of the file
|
11
|
+
def self.load(content, root)
|
12
|
+
pattern = /^(@import)\s\"(.*)\"/
|
13
|
+
matches = content.scan(pattern)
|
14
|
+
|
15
|
+
if matches.length > 0
|
16
|
+
matches.each do |match|
|
17
|
+
file_path = match[1]
|
18
|
+
path = root + "/" + file_path + FILE_SUFFIX
|
19
|
+
|
20
|
+
file_content = FILE_IMPORTER.load(path)
|
21
|
+
import_node = Wavy::Nodes::Import.new(path, file_content)
|
22
|
+
|
23
|
+
current_root = File.expand_path(File.dirname(path))
|
24
|
+
|
25
|
+
self.load(file_content, current_root)
|
26
|
+
|
27
|
+
Wavy::Models::Imports.add(path, import_node)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# Extracts all user defintions
|
33
|
+
def self.extract()
|
34
|
+
files = Wavy::Models::Imports.get
|
35
|
+
|
36
|
+
files.each do |key, value|
|
37
|
+
Wavy::Parsers::Mixin.defined(value.content)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module Wavy
|
2
|
+
|
3
|
+
module Parsers
|
4
|
+
|
5
|
+
class Mixin
|
6
|
+
|
7
|
+
# Finds all user-defined mixins.
|
8
|
+
#
|
9
|
+
# @param (String) data Content
|
10
|
+
def self.defined(data)
|
11
|
+
pattern = /^(@mixin)\s(.*)\((.*)\.*\)\s{((?:[^{}]|{\$([^}]*)}|{{([^}]*)}})*)}/
|
12
|
+
matches = data.scan(pattern)
|
13
|
+
|
14
|
+
if matches.length > 0
|
15
|
+
matches.each do |match|
|
16
|
+
mixin_node = Wavy::Nodes::Mixin.new(match[1], match[2], match[3])
|
17
|
+
|
18
|
+
Wavy::Models::Mixins.add(match[1], mixin_node)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# Finds all included mixins.
|
24
|
+
#
|
25
|
+
# @param (String) data Content
|
26
|
+
#
|
27
|
+
# @return (String) data Parsed content
|
28
|
+
def self.parse(template)
|
29
|
+
# Search for mixin includes
|
30
|
+
pattern = /(@include)\s(.*)\((.*)\)/
|
31
|
+
matches = template.scan(pattern)
|
32
|
+
|
33
|
+
mixins = Wavy::Models::Mixins.get
|
34
|
+
|
35
|
+
# Go through and parse each include
|
36
|
+
if matches.length > 0
|
37
|
+
matches.each do |match|
|
38
|
+
if(mixins[match[1]])
|
39
|
+
mixin = mixins[match[1]]
|
40
|
+
params = match[2].split(",");
|
41
|
+
content = mixin.content
|
42
|
+
|
43
|
+
# Replace variables
|
44
|
+
mixin.params.each_with_index do |param, index|
|
45
|
+
if params[index]
|
46
|
+
new_param = params[index].strip.gsub(/\'/, "")
|
47
|
+
else
|
48
|
+
new_param = ""
|
49
|
+
end
|
50
|
+
|
51
|
+
content = content.gsub("{$#{param}}", new_param)
|
52
|
+
end
|
53
|
+
|
54
|
+
# Search for includes within mixins
|
55
|
+
content = parse(content)
|
56
|
+
|
57
|
+
# Find mixin string to replace
|
58
|
+
find = "@include #{match[1]}(#{match[2]})"
|
59
|
+
template = template.gsub(find, content)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
return template
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
data/lib/wavy/parsers.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
module Wavy
|
2
|
+
|
3
|
+
module Utils
|
4
|
+
|
5
|
+
class FileSys
|
6
|
+
|
7
|
+
# Check and load file
|
8
|
+
#
|
9
|
+
# @param (String) name File path
|
10
|
+
# @param (Boolean) partial_check Also check for "_" on file
|
11
|
+
def self.load(name, partial_check = true)
|
12
|
+
if File.exists?(name)
|
13
|
+
open(name).read
|
14
|
+
else
|
15
|
+
if partial_check
|
16
|
+
load_partial(name)
|
17
|
+
else
|
18
|
+
raise 'File not found.'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# Check if a file with "_" exists
|
24
|
+
#
|
25
|
+
# @param (String) name File path
|
26
|
+
def self.load_partial(name)
|
27
|
+
a = name.split("/")
|
28
|
+
new_name = "_" + a[-1]
|
29
|
+
a = a.first a.size - 1
|
30
|
+
|
31
|
+
if a.length > 1
|
32
|
+
new_name = a.join("/") + "/" + new_name
|
33
|
+
end
|
34
|
+
|
35
|
+
load(new_name, false)
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
data/lib/wavy/utils.rb
ADDED
data/lib/wavy/version.rb
ADDED
data/lib/wavy.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'wavy/version'
|
2
|
+
require 'wavy/help'
|
3
|
+
|
4
|
+
module Wavy
|
5
|
+
|
6
|
+
class << self
|
7
|
+
|
8
|
+
end
|
9
|
+
|
10
|
+
# Compile specified view(s)
|
11
|
+
#
|
12
|
+
# @param (String) config Main configuration file
|
13
|
+
# @param (String) view Template to compile
|
14
|
+
# @param (Boolean|String) Path to save output
|
15
|
+
def self.compile(config, view, save = false)
|
16
|
+
core = Core.new(config, view, save).compile
|
17
|
+
end
|
18
|
+
|
19
|
+
# Execute compile method via bash
|
20
|
+
#
|
21
|
+
# @param (ARGV) args Arguments
|
22
|
+
def self.execute(args)
|
23
|
+
begin
|
24
|
+
if args[0]
|
25
|
+
case args[0]
|
26
|
+
when "--help", "-h"
|
27
|
+
puts "#{WAVY_HELP_OUTPUT}"
|
28
|
+
when "--version", "-v"
|
29
|
+
puts Wavy::Version.get
|
30
|
+
else
|
31
|
+
config = args[0]
|
32
|
+
|
33
|
+
if args[1]
|
34
|
+
view = args[1]
|
35
|
+
else
|
36
|
+
raise 'Missing template.'
|
37
|
+
end
|
38
|
+
|
39
|
+
if !args[2]
|
40
|
+
save = false
|
41
|
+
else
|
42
|
+
save = args[2]
|
43
|
+
end
|
44
|
+
|
45
|
+
compile(config, view, save)
|
46
|
+
end
|
47
|
+
else
|
48
|
+
raise 'Missing main configuration file.'
|
49
|
+
end
|
50
|
+
rescue Exception => e
|
51
|
+
puts e.message
|
52
|
+
abort
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
require 'wavy/core'
|
metadata
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: wavy
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Matthew Govaere
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-08-05 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Wavy is a simple templating engine for HTML.
|
14
|
+
email: matthew.govaere@gmail.com
|
15
|
+
executables:
|
16
|
+
- wavy
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- bin/wavy
|
21
|
+
- lib/wavy.rb
|
22
|
+
- lib/wavy/core.rb
|
23
|
+
- lib/wavy/help.rb
|
24
|
+
- lib/wavy/models.rb
|
25
|
+
- lib/wavy/models/imports.rb
|
26
|
+
- lib/wavy/models/mixins.rb
|
27
|
+
- lib/wavy/models/template.rb
|
28
|
+
- lib/wavy/nodes.rb
|
29
|
+
- lib/wavy/nodes/import.rb
|
30
|
+
- lib/wavy/nodes/mixin.rb
|
31
|
+
- lib/wavy/parsers.rb
|
32
|
+
- lib/wavy/parsers/import.rb
|
33
|
+
- lib/wavy/parsers/mixin.rb
|
34
|
+
- lib/wavy/utils.rb
|
35
|
+
- lib/wavy/utils/filesys.rb
|
36
|
+
- lib/wavy/version.rb
|
37
|
+
homepage: http://wavy.it
|
38
|
+
licenses:
|
39
|
+
- MIT
|
40
|
+
metadata: {}
|
41
|
+
post_install_message:
|
42
|
+
rdoc_options: []
|
43
|
+
require_paths:
|
44
|
+
- lib
|
45
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - '>='
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0'
|
50
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
requirements: []
|
56
|
+
rubyforge_project:
|
57
|
+
rubygems_version: 2.4.1
|
58
|
+
signing_key:
|
59
|
+
specification_version: 4
|
60
|
+
summary: A simple templating engine for HTML.
|
61
|
+
test_files: []
|