slight-lang 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/Gemfile +0 -0
- data/LICENSE +22 -0
- data/README.md +1 -0
- data/bin/repl/repl.rb +170 -0
- data/bin/repl/utils.rb +29 -0
- data/bin/slight +2 -0
- data/bin/slsh +2 -0
- data/example/component.slight.rb +2 -0
- data/example/core.rb +29 -0
- data/example/custom_engine.rb +37 -0
- data/example/default_engine.rb +28 -0
- data/example/index.slight.rb +33 -0
- data/lib/slight/config.rb +38 -0
- data/lib/slight/dsl.rb +161 -0
- data/lib/slight/engine.rb +38 -0
- data/lib/slight/template.rb +28 -0
- data/lib/slight/utils.rb +38 -0
- data/lib/slight.rb +6 -0
- data/slight.gemspec +21 -0
- metadata +66 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: aee03d439807e155008d14dfb189c1bbb51fe5e0
|
4
|
+
data.tar.gz: 8213f0db1ad28ec7b51e99194562198f7c9c9b1a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 9e2e037e06073b9a16b6216d2f6b1e34a0ae25d5e5d4d9782b97d2e657b4006b97488d150ecf668316d27350bff4902feadae944ba963378a0c4efa636f5d10e
|
7
|
+
data.tar.gz: 16c67e121dcd5355802b349dd6dc4fbfbf5d96b508d0e65d5ecdffafe7f03a5b58b49f7ebce4d161f7360cb84d93f125a997b58a626749ef6eb54e07551fb947
|
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
*.gem
|
data/Gemfile
ADDED
File without changes
|
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
The MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2016 Slight
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
22
|
+
|
data/README.md
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
# Slight
|
data/bin/repl/repl.rb
ADDED
@@ -0,0 +1,170 @@
|
|
1
|
+
$:.unshift File.expand_path('../../../lib', __FILE__)
|
2
|
+
|
3
|
+
require_relative 'utils.rb'
|
4
|
+
require 'slight'
|
5
|
+
@default_engine = Slight::Engine.new
|
6
|
+
@slout = STDOUT
|
7
|
+
|
8
|
+
at_exit{
|
9
|
+
puts "\n--bye--".light_blue
|
10
|
+
@slout.close
|
11
|
+
}
|
12
|
+
|
13
|
+
Signal.trap("INT") do
|
14
|
+
puts "Terminating...".light_blue
|
15
|
+
puts "*** Exit now ***".light_blue
|
16
|
+
exit 1
|
17
|
+
end
|
18
|
+
|
19
|
+
def main
|
20
|
+
print_logo
|
21
|
+
buff = ""
|
22
|
+
loop do
|
23
|
+
print "sl:> "
|
24
|
+
case line = STDIN.readline.sub(/[\n\r]/,'').strip
|
25
|
+
when /^\\/ # build-in commands
|
26
|
+
case line
|
27
|
+
when "\\h"
|
28
|
+
print_help
|
29
|
+
when "\\eg"
|
30
|
+
print_example
|
31
|
+
when "\\q"
|
32
|
+
puts "*** Exit now ***".light_blue
|
33
|
+
exit 0
|
34
|
+
when /\\(v|version|ver)/
|
35
|
+
puts "ver #{Slight::VERSION}\n\n"
|
36
|
+
else
|
37
|
+
puts "Invalid command. type \\h for help.".red
|
38
|
+
end
|
39
|
+
when /^@/
|
40
|
+
if buff.size == 0 then
|
41
|
+
fn = line.sub('@','')
|
42
|
+
puts "LOAD PATH=\"#{fn}\"".light_blue
|
43
|
+
sl_handler(fn, is_file=true)
|
44
|
+
buff.clear
|
45
|
+
puts ""
|
46
|
+
else
|
47
|
+
buff << line << "\n"
|
48
|
+
end
|
49
|
+
when /^>@/
|
50
|
+
fn = line.split('@')[1] || ""
|
51
|
+
case fn.strip
|
52
|
+
when "off"
|
53
|
+
unless @slout == STDOUT
|
54
|
+
puts "spool turned off".light_blue
|
55
|
+
@slout.close
|
56
|
+
@slout = STDOUT
|
57
|
+
else
|
58
|
+
puts "spool was alread turned off".red
|
59
|
+
end
|
60
|
+
when ""
|
61
|
+
puts "spool turned off. output path not set.".red
|
62
|
+
else
|
63
|
+
unless @slout == STDOUT then
|
64
|
+
puts "spool was alread turned on".red
|
65
|
+
else
|
66
|
+
puts "spool turned on".light_blue
|
67
|
+
puts "OUTPUT PATH=\"#{fn}\"".light_blue
|
68
|
+
@slout = File.open(fn, 'w+')
|
69
|
+
end
|
70
|
+
end
|
71
|
+
when ";"
|
72
|
+
if buff.size > 0 then
|
73
|
+
sl_handler(buff)
|
74
|
+
buff.clear
|
75
|
+
@slout.flush #if @slout == STDOUT
|
76
|
+
puts ""
|
77
|
+
end
|
78
|
+
else
|
79
|
+
buff << line << "\n"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def sl_handler(buff, is_file=false)
|
85
|
+
if is_file
|
86
|
+
output = @default_engine.render(buff)
|
87
|
+
else
|
88
|
+
output = @default_engine.render("console",buff)
|
89
|
+
end
|
90
|
+
|
91
|
+
if @slout == STDOUT
|
92
|
+
@slout.puts output.green
|
93
|
+
else
|
94
|
+
@slout.puts output
|
95
|
+
end
|
96
|
+
rescue Exception => err
|
97
|
+
errno = err.message.split(":")[1].to_i - 1
|
98
|
+
buff.split("\n").each_with_index do |line, i|
|
99
|
+
if i == errno then
|
100
|
+
puts "=>#{i+1} #{line}".red
|
101
|
+
else
|
102
|
+
puts " #{i+1} #{line}".yellow
|
103
|
+
end
|
104
|
+
end
|
105
|
+
puts ""
|
106
|
+
STDERR.puts err.message.red
|
107
|
+
#STDERR.puts [err.inspect, err.backtrace.join("\n")].join("\n")
|
108
|
+
end
|
109
|
+
|
110
|
+
def print_help
|
111
|
+
puts " @file => load and compile file dynamically. E.g. @/tmp/page.slight".green
|
112
|
+
puts " >@ => set output. E.g. Open: >@/tmp/output. Turn off: >@off".green
|
113
|
+
puts " \\eg => example".green
|
114
|
+
puts " \\q => exit".green
|
115
|
+
puts " \\v => show version (also: \\ver, \\version)".green
|
116
|
+
puts
|
117
|
+
end
|
118
|
+
|
119
|
+
def print_example
|
120
|
+
eg1_in=%{
|
121
|
+
html do
|
122
|
+
head do
|
123
|
+
titile "My Page"
|
124
|
+
end
|
125
|
+
body do
|
126
|
+
button "btn btn-primary" do
|
127
|
+
"Click me"
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
}
|
132
|
+
|
133
|
+
eg1_out=%{
|
134
|
+
<html>
|
135
|
+
<head>
|
136
|
+
<title>My Page</title>
|
137
|
+
</head>
|
138
|
+
<body>
|
139
|
+
<button class="btn btn-primary">Click me</button>
|
140
|
+
</body>
|
141
|
+
</html>
|
142
|
+
}.green
|
143
|
+
|
144
|
+
eg2_in=%{
|
145
|
+
div("panel panel-lg", css:"color:green"){
|
146
|
+
span{"Hello World"}
|
147
|
+
}
|
148
|
+
}
|
149
|
+
|
150
|
+
eg2_out=%{
|
151
|
+
<div class="panel panel-lg", style="color:green">
|
152
|
+
<span>Hello World</span>
|
153
|
+
</div>
|
154
|
+
}.green
|
155
|
+
|
156
|
+
puts eg1_in
|
157
|
+
puts "=>\n" + eg1_out
|
158
|
+
puts
|
159
|
+
puts eg2_in
|
160
|
+
puts "=>\n" + eg2_out
|
161
|
+
|
162
|
+
end
|
163
|
+
|
164
|
+
def print_logo
|
165
|
+
puts "**************************\n* Welcome to Slight REPL *".green
|
166
|
+
puts "**************************".green
|
167
|
+
puts "\\h for help.\n\n".green
|
168
|
+
end
|
169
|
+
|
170
|
+
main
|
data/bin/repl/utils.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# from stack overflow
|
2
|
+
class String
|
3
|
+
# colorization
|
4
|
+
def colorize(color_code); "\e[#{color_code}m#{self}\e[0m"; end
|
5
|
+
def light_blue; "\e[36m#{self}\e[0m"; end
|
6
|
+
def black; "\e[30m#{self}\e[0m"; end
|
7
|
+
def red; "\e[31m#{self}\e[0m"; end
|
8
|
+
def green; "\e[32m#{self}\e[0m"; end
|
9
|
+
def yellow; "\e[33m#{self}\e[0m"; end
|
10
|
+
def blue; "\e[34m#{self}\e[0m"; end
|
11
|
+
def magenta; "\e[35m#{self}\e[0m"; end
|
12
|
+
def cyan; "\e[36m#{self}\e[0m"; end
|
13
|
+
def gray; "\e[37m#{self}\e[0m"; end
|
14
|
+
|
15
|
+
def bg_black; "\e[40m#{self}\e[0m"; end
|
16
|
+
def bg_red; "\e[41m#{self}\e[0m"; end
|
17
|
+
def bg_green; "\e[42m#{self}\e[0m"; end
|
18
|
+
def bg_brown; "\e[43m#{self}\e[0m"; end
|
19
|
+
def bg_blue; "\e[44m#{self}\e[0m"; end
|
20
|
+
def bg_magenta; "\e[45m#{self}\e[0m"; end
|
21
|
+
def bg_cyan; "\e[46m#{self}\e[0m"; end
|
22
|
+
def bg_gray; "\e[47m#{self}\e[0m"; end
|
23
|
+
|
24
|
+
def bold; "\e[1m#{self}\e[22m"; end
|
25
|
+
def italic; "\e[3m#{self}\e[23m"; end
|
26
|
+
def underline; "\e[4m#{self}\e[24m"; end
|
27
|
+
def blink; "\e[5m#{self}\e[25m"; end
|
28
|
+
def reverse_color; "\e[7m#{self}\e[27m"; end
|
29
|
+
end
|
data/bin/slight
ADDED
data/bin/slsh
ADDED
data/example/core.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
$:.unshift File.expand_path('../../lib', __FILE__)
|
2
|
+
require 'slight/dsl'
|
3
|
+
|
4
|
+
module Slight
|
5
|
+
class DSL
|
6
|
+
def run
|
7
|
+
doctype :html
|
8
|
+
html do
|
9
|
+
head do
|
10
|
+
title "Example"
|
11
|
+
use "/css/bootstrap.css"
|
12
|
+
use "/script/jquery.js"
|
13
|
+
use "/script/angular.js"
|
14
|
+
end
|
15
|
+
body do
|
16
|
+
div "panel" do
|
17
|
+
nav "nav nav-pill", id:"NavMenu", css:"color: red" do
|
18
|
+
img! src:"/images/icon1.png"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
br
|
22
|
+
hr
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
Slight::DSL.new(STDOUT).run
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'slight/config'
|
2
|
+
require 'slight/engine'
|
3
|
+
|
4
|
+
module Slight
|
5
|
+
class PrettyRender < Filter
|
6
|
+
def self.do(src_data); end
|
7
|
+
end
|
8
|
+
|
9
|
+
class PrettyOutput < Filter
|
10
|
+
end
|
11
|
+
|
12
|
+
conf = Slight::Configuration.new do |c|
|
13
|
+
c.use PrettyRender
|
14
|
+
c.use PrettyOutput, :after
|
15
|
+
#c.set :pretty_html, true
|
16
|
+
end
|
17
|
+
|
18
|
+
custom_engine = Slight::Engine.new(conf)
|
19
|
+
io_out = STDOUT
|
20
|
+
|
21
|
+
at_exit{
|
22
|
+
io_out.close
|
23
|
+
}
|
24
|
+
|
25
|
+
begin
|
26
|
+
raise IOError, "source file was not given." if ARGV.length == 0
|
27
|
+
src_file = ARGV[0]
|
28
|
+
io_out = File.open("#{ARGV[1]}", 'w') if ARGV.size == 2
|
29
|
+
io_out.puts default_engine.render(src_file)
|
30
|
+
rescue Exception => err
|
31
|
+
STDERR.puts err.message
|
32
|
+
STDERR.puts [err.inspect, err.backtrace.join("\n")].join("\n")
|
33
|
+
exit 1
|
34
|
+
end
|
35
|
+
|
36
|
+
exit 0
|
37
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
$:.unshift File.expand_path('../../lib', __FILE__)
|
2
|
+
require 'slight'
|
3
|
+
|
4
|
+
module Slight
|
5
|
+
default_engine = Slight::Engine.new
|
6
|
+
io_out = STDOUT
|
7
|
+
|
8
|
+
at_exit{
|
9
|
+
io_out.close
|
10
|
+
}
|
11
|
+
|
12
|
+
begin
|
13
|
+
if ARGV[0] == "-v" then
|
14
|
+
io_out.puts VERSION
|
15
|
+
else
|
16
|
+
raise IOError, "source file was not given." if ARGV.length == 0
|
17
|
+
src_file = ARGV[0]
|
18
|
+
io_out = File.open("#{ARGV[1]}", 'w') if ARGV.size == 2
|
19
|
+
io_out.puts default_engine.render(src_file)
|
20
|
+
end
|
21
|
+
rescue Exception => err
|
22
|
+
STDERR.puts err.message
|
23
|
+
#STDERR.puts [err.inspect, err.backtrace.join("\n")].join("\n")
|
24
|
+
exit 1
|
25
|
+
end
|
26
|
+
|
27
|
+
exit 0
|
28
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
doctype :html
|
2
|
+
html do
|
3
|
+
head do
|
4
|
+
title "Example"
|
5
|
+
use "resource/css/bootstrap.css"
|
6
|
+
use "resource/script/jquery.js"
|
7
|
+
use "resource/script/angular.js"
|
8
|
+
end
|
9
|
+
body do
|
10
|
+
div "panel" do
|
11
|
+
nav "nav nav-pill", id:"NavMenu", css:"color: red" do
|
12
|
+
img! src:"resource/images/icon1.png"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
div css:'border 1 bold blue' do
|
16
|
+
layout_yield("#{File.dirname(__FILE__)}/component.slight.rb")
|
17
|
+
end
|
18
|
+
div css:'border 1 bold green' do
|
19
|
+
layout_yield("#{File.dirname(__FILE__)}/component.slight.rb")
|
20
|
+
end
|
21
|
+
span do
|
22
|
+
"Hello Span"
|
23
|
+
end
|
24
|
+
br
|
25
|
+
hr
|
26
|
+
end
|
27
|
+
|
28
|
+
js %{
|
29
|
+
let a =1;
|
30
|
+
console.log(a);
|
31
|
+
}
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Slight
|
2
|
+
class Configuration
|
3
|
+
def initialize(options = {}, &blk)
|
4
|
+
@options = options
|
5
|
+
@options[:cus] ||= {}
|
6
|
+
@options[:shortcutA] ||= {}
|
7
|
+
@options[:shortcutT] ||= {}
|
8
|
+
@options[:blinding] ||= {}
|
9
|
+
@options[:before_filter] ||= []
|
10
|
+
@options[:after_filter] ||= []
|
11
|
+
blk.call self
|
12
|
+
@options
|
13
|
+
end
|
14
|
+
|
15
|
+
def set(k, v); @options[:cus][k] = v; end
|
16
|
+
def get(k); @options[:cus][k]; end
|
17
|
+
def use(t, flag = :before)
|
18
|
+
if flag == :before then
|
19
|
+
@options[:before_filter].push(t)
|
20
|
+
else
|
21
|
+
@options[:after_filter].push(t)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def shortcut(type, pattern, replacement)
|
26
|
+
case(type)
|
27
|
+
when :A
|
28
|
+
@options[:shortcutA][pattern.to_sym] = replacement
|
29
|
+
when :T
|
30
|
+
@options[:shortcutT][pattern.to_sym] = replacement
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def blinding(*system_fun)
|
35
|
+
@options[:blinding] = system_fun.map(&:to_sym)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/slight/dsl.rb
ADDED
@@ -0,0 +1,161 @@
|
|
1
|
+
require 'slight/utils'
|
2
|
+
|
3
|
+
module Slight
|
4
|
+
module DSLEssential
|
5
|
+
def br; echo "<br/>\n"; end
|
6
|
+
|
7
|
+
def hr; echo "<hr/>\n"; end
|
8
|
+
|
9
|
+
def title(str); echo "<title>#{str}</title>\n"; end
|
10
|
+
|
11
|
+
def js(str)
|
12
|
+
echo "<script language=\"javascript\">\n#{str}\n</script>\n"
|
13
|
+
end
|
14
|
+
|
15
|
+
def doctype(type)
|
16
|
+
case type
|
17
|
+
when :html, :h5
|
18
|
+
echo "<!DOCTYPE html>\n"
|
19
|
+
when :h11
|
20
|
+
echo %q[<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">] + "\n"
|
21
|
+
when :strict
|
22
|
+
echo %q[<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">] + "\n"
|
23
|
+
when :frameset
|
24
|
+
echo %q[<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">] + "\n"
|
25
|
+
when :mobile
|
26
|
+
echo %q[<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.2//EN" "http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd">] + "\n"
|
27
|
+
when :basic
|
28
|
+
echo %q[<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd">] + "\n"
|
29
|
+
when :transitional
|
30
|
+
echo %q[<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">] + "\n"
|
31
|
+
when :xml
|
32
|
+
echo %q[<?xml version="1.0" encoding="utf-8" ?>] + "\n"
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
def use(uri, type=nil)
|
38
|
+
case type ||= uri.split('.')[-1]
|
39
|
+
when "js"
|
40
|
+
echo "<script type=\"text/javascript\" src=\"#{uri}\"></script>\n"
|
41
|
+
when "css"
|
42
|
+
echo "<link rel=\"stylesheet\" href=\"#{uri}\"></link>\n"
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
# load another page into current page
|
48
|
+
def layout_yield(target_src)
|
49
|
+
#eval(File.new(target_src).read, binding_scope, target_src, __LINE__ - 48)
|
50
|
+
@load_history ||= [] # prevernt recursive page load
|
51
|
+
#unless @load_history[target_src] then
|
52
|
+
@load_history.push target_src
|
53
|
+
unless @load_history.count(target_src) == 2
|
54
|
+
self.instance_eval(File.new(target_src).read, target_src, __LINE__ - 48)
|
55
|
+
else
|
56
|
+
echo "<!--recursive page loading deteced, ignore.-->"
|
57
|
+
end
|
58
|
+
@load_history.pop
|
59
|
+
nil
|
60
|
+
end
|
61
|
+
|
62
|
+
# set the placeholder in current page
|
63
|
+
#def layout_placeholder(ph_alias="default")
|
64
|
+
# echo "<!--######|PLACEHOLDER-#{ph_alias}|######-->"
|
65
|
+
#end
|
66
|
+
|
67
|
+
# attach itself to the placeholder in anther page
|
68
|
+
#def layout_attach(page, ph_alias="default")
|
69
|
+
#end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
class DSLException < ScriptError ; end
|
74
|
+
|
75
|
+
class DSL
|
76
|
+
include DSLEssential
|
77
|
+
include Utils
|
78
|
+
undef :p, :select
|
79
|
+
|
80
|
+
def initialize(io)
|
81
|
+
@output_buffer = io
|
82
|
+
#@root = page_node.new("root")
|
83
|
+
end
|
84
|
+
|
85
|
+
def puts(str); @output_buffer << html_escape(str); nil; end
|
86
|
+
|
87
|
+
def echo(str); @output_buffer << str; nil; end
|
88
|
+
|
89
|
+
def method_missing(fun, *param, &block)
|
90
|
+
__dsl__define(fun)
|
91
|
+
self.send(fun, *param, &block)
|
92
|
+
end
|
93
|
+
|
94
|
+
def binding_scope
|
95
|
+
binding
|
96
|
+
end
|
97
|
+
|
98
|
+
def resolve_shortcutA(shortcutA)
|
99
|
+
@__dsl__attr_replacements = shortcutA
|
100
|
+
end
|
101
|
+
|
102
|
+
def resolve_shortcutT(shortcutT)
|
103
|
+
@__dsl__tag_replacements = shortcutT
|
104
|
+
end
|
105
|
+
|
106
|
+
def resolve_blinding(blinding)
|
107
|
+
blinding.each do |m|
|
108
|
+
undef_method m
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
private
|
113
|
+
def __dsl__define(tag)
|
114
|
+
DSL.class_eval do
|
115
|
+
define_method(tag){|*at, &block|
|
116
|
+
__dsl__packup(tag.to_s, *at, &block)
|
117
|
+
}
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def __dsl__packup(tag, *at)
|
122
|
+
attr_replacements = @__dsl__attr_replacements||{}
|
123
|
+
tag_replacements = @__dsl__tag_replacements||{}
|
124
|
+
attrs=[]
|
125
|
+
|
126
|
+
if self_close = tag.end_with?("!") then
|
127
|
+
tag = tag[0..-2]
|
128
|
+
end
|
129
|
+
|
130
|
+
at.each do |var|
|
131
|
+
if var.class == Hash then
|
132
|
+
var.each_pair do |a, v|
|
133
|
+
unless a.to_sym == :_ then
|
134
|
+
at_new = attr_replacements.fetch(a, a)
|
135
|
+
at_new = v.class == String ? "#{at_new}=\"#{v}\"" : "#{at_new}=#{v.to_s}"
|
136
|
+
else
|
137
|
+
at_new = "#{v}"
|
138
|
+
end
|
139
|
+
attrs.push at_new
|
140
|
+
end
|
141
|
+
elsif var.class == String
|
142
|
+
attrs.push "class=\"#{var}\""
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
s_tag = tag_replacements.fetch(tag.to_sym, tag)
|
147
|
+
e_tag = s_tag.split(" ")[0]
|
148
|
+
|
149
|
+
space = attrs.length > 0 ? " " : ""
|
150
|
+
echo "<#{s_tag}#{space}#{attrs.join(" ")}"
|
151
|
+
if self_close then
|
152
|
+
echo "/>\n"
|
153
|
+
else
|
154
|
+
echo ">\n"
|
155
|
+
puts yield.to_s if block_given?
|
156
|
+
echo "</#{e_tag}>\n"
|
157
|
+
end
|
158
|
+
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'slight/config'
|
2
|
+
require 'slight/template'
|
3
|
+
module Slight
|
4
|
+
class Filter; def self.do(src_data); return src_data; end; end
|
5
|
+
class Engine
|
6
|
+
def initialize(options = {})
|
7
|
+
@options = options
|
8
|
+
Configuration.new(@options) do |c|
|
9
|
+
c.shortcut :A, :css, "style"
|
10
|
+
c.shortcut :A, :ln, "href"
|
11
|
+
c.shortcut :A, :url, "href"
|
12
|
+
c.shortcut :A, :char, "charset"
|
13
|
+
c.shortcut :A, :fn, "src"
|
14
|
+
c.shortcut :A, :lang, "language"
|
15
|
+
c.shortcut :A, :xn, "xmlns"
|
16
|
+
c.shortcut :A, :mf, "manifest"
|
17
|
+
c.shortcut :T, "_", "div"
|
18
|
+
#c.shortcut :T, "js", %q[script language="javascript"]
|
19
|
+
#c.use PrettyHtmlOutput, :after if c.get(:pretty_html)
|
20
|
+
end
|
21
|
+
@template = Template.new(@options)
|
22
|
+
end
|
23
|
+
|
24
|
+
def render(src_file, src_data = nil, local_vars={})
|
25
|
+
# src file name is mainly using for identify issues for debugging
|
26
|
+
# if data not given then read data from src file
|
27
|
+
src_data ||= File.new(src_file).read
|
28
|
+
@options[:before_filter].each do |f|
|
29
|
+
src_data = f.do(src_data)
|
30
|
+
end
|
31
|
+
src_data = @template.render(src_data, src_file, local_vars)
|
32
|
+
@options[:after_filter].each do |f|
|
33
|
+
src_data = f.do(src_data)
|
34
|
+
end
|
35
|
+
src_data
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'slight/dsl'
|
2
|
+
|
3
|
+
module Slight
|
4
|
+
class Template
|
5
|
+
def initialize(options = {})
|
6
|
+
@options = options
|
7
|
+
@output_buffer = @options[:io_out] || ""
|
8
|
+
@dsl = DSL.new(@output_buffer)
|
9
|
+
|
10
|
+
@dsl.resolve_shortcutA(@options[:shortcutA])
|
11
|
+
@dsl.resolve_shortcutT(@options[:shortcutT])
|
12
|
+
@dsl.resolve_blinding(@options[:blinding])
|
13
|
+
end
|
14
|
+
|
15
|
+
def render(src_data, src_file, local_vars = {})
|
16
|
+
@output_buffer.clear
|
17
|
+
local_vars.each_pair do |key, value|
|
18
|
+
@dsl.binding_scope.local_variable_set(key.to_sym, value)
|
19
|
+
end
|
20
|
+
begin
|
21
|
+
eval(src_data, @dsl.binding_scope, src_file, __LINE__ - 20)
|
22
|
+
rescue => ex
|
23
|
+
raise DSLException.new(ex.message)
|
24
|
+
end
|
25
|
+
@output_buffer
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/slight/utils.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# Borrow from ERB Source
|
2
|
+
# ERB::Util
|
3
|
+
module Slight
|
4
|
+
module Utils
|
5
|
+
public
|
6
|
+
# A utility method for escaping HTML tag characters in _s_.
|
7
|
+
#
|
8
|
+
# require "erb"
|
9
|
+
# include ERB::Util
|
10
|
+
#
|
11
|
+
# puts html_escape("is a > 0 & a < 10?")
|
12
|
+
#
|
13
|
+
# _Generates_
|
14
|
+
#
|
15
|
+
# is a > 0 & a < 10?
|
16
|
+
#
|
17
|
+
# [Slight] => Add: gsub(/[[:blank:]]/," ") to support space.
|
18
|
+
def html_escape(s)
|
19
|
+
s.to_s.gsub(/&/, "&").gsub(/[[:blank:]]/," ").gsub(/\"/, """).gsub(/>/, ">").gsub(/</, "<")
|
20
|
+
end
|
21
|
+
module_function :html_escape
|
22
|
+
# A utility method for encoding the String _s_ as a URL.
|
23
|
+
#
|
24
|
+
# require "erb"
|
25
|
+
# include ERB::Util
|
26
|
+
#
|
27
|
+
# puts url_encode("Programming Ruby: The Pragmatic Programmer's Guide")
|
28
|
+
#
|
29
|
+
# _Generates_
|
30
|
+
#
|
31
|
+
# Programming%20Ruby%3A%20%20The%20Pragmatic%20Programmer%27s%20Guide
|
32
|
+
#
|
33
|
+
def url_encode(s)
|
34
|
+
s.to_s.gsub(/[^a-zA-Z0-9_\-.]/n){ sprintf("%%%02X", $&.unpack("C")[0]) }
|
35
|
+
end
|
36
|
+
module_function :url_encode
|
37
|
+
end
|
38
|
+
end
|
data/lib/slight.rb
ADDED
data/slight.gemspec
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8
|
2
|
+
$:.unshift File.expand_path('../lib', __FILE__)
|
3
|
+
require 'slight'
|
4
|
+
|
5
|
+
Gem::Specification.new do |gem|
|
6
|
+
gem.authors = ["oliver.yu"]
|
7
|
+
gem.email = ["nemo1023@gmail.com"]
|
8
|
+
gem.description = %q{A light and sweet template language}
|
9
|
+
gem.summary = %q{The goal of this is to use ruby syntax and html style shotcut to write template.}
|
10
|
+
gem.homepage = "https://github.com/OliversCat/Slight"
|
11
|
+
gem.files = `git ls-files`.split($\)
|
12
|
+
#gem.files = dir('.')
|
13
|
+
#gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) unless f.end_with? ".rb" }
|
14
|
+
gem.executables = ["slsh","slight"]
|
15
|
+
#gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
16
|
+
gem.test_files = ["spec"]
|
17
|
+
gem.name = "slight-lang"
|
18
|
+
gem.require_paths = ["lib"]
|
19
|
+
gem.version = Slight::VERSION
|
20
|
+
gem.license = "MIT"
|
21
|
+
end
|
metadata
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: slight-lang
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- oliver.yu
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-11-13 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: A light and sweet template language
|
14
|
+
email:
|
15
|
+
- nemo1023@gmail.com
|
16
|
+
executables:
|
17
|
+
- slsh
|
18
|
+
- slight
|
19
|
+
extensions: []
|
20
|
+
extra_rdoc_files: []
|
21
|
+
files:
|
22
|
+
- ".gitignore"
|
23
|
+
- Gemfile
|
24
|
+
- LICENSE
|
25
|
+
- README.md
|
26
|
+
- bin/repl/repl.rb
|
27
|
+
- bin/repl/utils.rb
|
28
|
+
- bin/slight
|
29
|
+
- bin/slsh
|
30
|
+
- example/component.slight.rb
|
31
|
+
- example/core.rb
|
32
|
+
- example/custom_engine.rb
|
33
|
+
- example/default_engine.rb
|
34
|
+
- example/index.slight.rb
|
35
|
+
- lib/slight.rb
|
36
|
+
- lib/slight/config.rb
|
37
|
+
- lib/slight/dsl.rb
|
38
|
+
- lib/slight/engine.rb
|
39
|
+
- lib/slight/template.rb
|
40
|
+
- lib/slight/utils.rb
|
41
|
+
- slight.gemspec
|
42
|
+
homepage: https://github.com/OliversCat/Slight
|
43
|
+
licenses:
|
44
|
+
- MIT
|
45
|
+
metadata: {}
|
46
|
+
post_install_message:
|
47
|
+
rdoc_options: []
|
48
|
+
require_paths:
|
49
|
+
- lib
|
50
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '0'
|
60
|
+
requirements: []
|
61
|
+
rubyforge_project:
|
62
|
+
rubygems_version: 2.5.1
|
63
|
+
signing_key:
|
64
|
+
specification_version: 4
|
65
|
+
summary: The goal of this is to use ruby syntax and html style shotcut to write template.
|
66
|
+
test_files: []
|