faml 0.2.16 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,17 +0,0 @@
1
- module Faml
2
- module ParserUtils
3
- module_function
4
-
5
- def balance(scanner, start, finish, depth = 1)
6
- re = /(#{Regexp.escape(start)}|#{Regexp.escape(finish)})/
7
- while depth > 0 && scanner.scan_until(re)
8
- if scanner.matched == start
9
- depth += 1
10
- else
11
- depth -= 1
12
- end
13
- end
14
- depth
15
- end
16
- end
17
- end
@@ -1,23 +0,0 @@
1
- module Faml
2
- module RubyMultiline
3
- def self.read(line_parser, current_text)
4
- buf = []
5
- while is_ruby_multiline?(current_text)
6
- current_text = line_parser.next_line
7
- buf << current_text
8
- end
9
- buf
10
- end
11
-
12
- # `text' is a Ruby multiline block if it:
13
- # - ends with a comma
14
- # - but not "?," which is a character literal
15
- # (however, "x?," is a method call and not a literal)
16
- # - and not "?\," which is a character literal
17
- def self.is_ruby_multiline?(text)
18
- text && text.length > 1 && text[-1] == ?, &&
19
- !((text[-3, 2] =~ /\W\?/) || text[-3, 2] == "?\\")
20
- end
21
- private_class_method :is_ruby_multiline?
22
- end
23
- end
@@ -1,106 +0,0 @@
1
- require 'faml/ast'
2
- require 'faml/ruby_multiline'
3
- require 'faml/syntax_error'
4
-
5
- module Faml
6
- class ScriptParser
7
- def initialize(line_parser)
8
- @line_parser = line_parser
9
- end
10
-
11
- def parse(text)
12
- case text[0]
13
- when '=', '~'
14
- parse_script(text)
15
- when '&'
16
- parse_sanitized(text)
17
- when '!'
18
- parse_unescape(text)
19
- else
20
- parse_text(text)
21
- end
22
- end
23
-
24
- private
25
-
26
- def parse_script(text)
27
- if text[1] == '='
28
- create_node(Ast::Text) { |t| t.text = text[2 .. -1].strip }
29
- else
30
- node = create_node(Ast::Script)
31
- script = text[1 .. -1].lstrip
32
- if script.empty?
33
- syntax_error!('No Ruby code to evaluate')
34
- end
35
- node.script = [script, *RubyMultiline.read(@line_parser, script)].join("\n")
36
- node
37
- end
38
- end
39
-
40
- def parse_sanitized(text)
41
- case
42
- when text.start_with?('&==')
43
- create_node(Ast::Text) { |t| t.text = text[3 .. -1].lstrip }
44
- when text[1] == '=' || text[1] == '~'
45
- node = create_node(Ast::Script)
46
- script = text[2 .. -1].lstrip
47
- if script.empty?
48
- syntax_error!('No Ruby code to evaluate')
49
- end
50
- node.script = [script, *RubyMultiline.read(@line_parser, script)].join("\n")
51
- node.preserve = text[1] == '~'
52
- node
53
- else
54
- create_node(Ast::Text) { |t| t.text = text[1 .. -1].strip }
55
- end
56
- end
57
-
58
- def parse_unescape(text)
59
- case
60
- when text.start_with?('!==')
61
- create_node(Ast::Text) do |t|
62
- t.text = text[3 .. -1].lstrip
63
- t.escape_html = false
64
- end
65
- when text[1] == '=' || text[1] == '~'
66
- node = create_node(Ast::Script)
67
- node.escape_html = false
68
- script = text[2 .. -1].lstrip
69
- if script.empty?
70
- syntax_error!('No Ruby code to evaluate')
71
- end
72
- node.script = [script, *RubyMultiline.read(@line_parser, script)].join("\n")
73
- node.preserve = text[1] == '~'
74
- node
75
- else
76
- create_node(Ast::Text) do |t|
77
- t.text = text[1 .. -1].lstrip
78
- t.escape_html = false
79
- end
80
- end
81
- end
82
-
83
- def parse_text(text)
84
- text = text.lstrip
85
- if text.empty?
86
- nil
87
- else
88
- create_node(Ast::Text) { |t| t.text = text }
89
- end
90
- end
91
-
92
- def syntax_error!(message)
93
- raise SyntaxError.new(message, @line_parser.lineno)
94
- end
95
-
96
- def create_node(klass, &block)
97
- klass.new.tap do |node|
98
- node.filename = @line_parser.filename
99
- node.lineno = @line_parser.lineno
100
- if block
101
- block.call(node)
102
- end
103
- end
104
- end
105
- end
106
- end
@@ -1,6 +0,0 @@
1
- require 'faml/error'
2
-
3
- module Faml
4
- class SyntaxError < Error
5
- end
6
- end
@@ -1,47 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe 'Indent', type: :render do
4
- it 'raises error if indent is wrong' do
5
- expect { render_string(<<HAML) }.to raise_error(Faml::IndentTracker::IndentMismatch) { |e|
6
- %div
7
- %div
8
- %div
9
- %div
10
- HAML
11
- expect(e.current_level).to eq(2)
12
- expect(e.indent_levels).to eq([0])
13
- expect(e.lineno).to eq(4)
14
- }
15
- end
16
-
17
- it 'raises error if the current indent is deeper than the previous one' do
18
- expect { render_string(<<HAML) }.to raise_error(Faml::IndentTracker::InconsistentIndent) { |e|
19
- %div
20
- %div
21
- %div
22
- HAML
23
- expect(e.previous_size).to eq(2)
24
- expect(e.current_size).to eq(4)
25
- expect(e.lineno).to eq(3)
26
- }
27
- end
28
-
29
- it 'raises error if the current indent is shallower than the previous one' do
30
- expect { render_string(<<HAML) }.to raise_error(Faml::IndentTracker::InconsistentIndent) { |e|
31
- %div
32
- %div
33
- %div
34
- HAML
35
- expect(e.previous_size).to eq(4)
36
- expect(e.current_size).to eq(2)
37
- expect(e.lineno).to eq(3)
38
- }
39
- end
40
-
41
- it 'raises error if indented with hard tabs' do
42
- expect { render_string(<<HAML) }.to raise_error(Faml::IndentTracker::HardTabNotAllowed)
43
- %p
44
- %a
45
- HAML
46
- end
47
- end