malline 1.0.2 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +12 -12
- data/bin/malline +0 -0
- data/lib/malline.rb +51 -50
- data/lib/malline/adapters/rails-2.0.rb +72 -0
- data/lib/malline/adapters/rails-2.1.rb +103 -0
- data/lib/malline/erb_out.rb +6 -1
- data/lib/malline/form_builder.rb +15 -4
- data/lib/malline/plugin.rb +34 -0
- data/lib/malline/{view_xhtml.rb → plugins/xhtml.rb} +11 -5
- data/lib/malline/rails.rb +22 -21
- data/lib/malline/template.rb +67 -6
- data/lib/malline/view_proxy.rb +49 -16
- data/lib/malline/view_wrapper.rb +25 -21
- data/scripts/html2mn.rb +0 -0
- data/test/malline_test.rb +14 -35
- data/test/malline_test_helpers.rb +30 -5
- metadata +86 -78
- data/test/examples/fragment_cache.mn +0 -10
- data/test/examples/fragment_cache.target +0 -1
data/README
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
Malline 1.0
|
1
|
+
Malline 1.1.0
|
2
2
|
=============
|
3
3
|
|
4
4
|
See documentation on http://www.malline.org/
|
@@ -7,18 +7,18 @@ Copyright © 2007,2008 Riku Palomäki, riku@palomaki.fi
|
|
7
7
|
Malline is released under GNU Lesser General Public License.
|
8
8
|
|
9
9
|
|
10
|
-
Example template file images.mn:
|
10
|
+
Example Rails template file images.html.mn:
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
12
|
+
xhtml do
|
13
|
+
_render :partial => 'head'
|
14
|
+
body do
|
15
|
+
div.images! "There are some images:" do
|
16
|
+
images.each do |im|
|
17
|
+
a(:href => img_path(im)) { img :src => im.url }
|
18
|
+
span.caption im.caption
|
19
|
+
end
|
20
|
+
_"No more images"
|
19
21
|
end
|
20
|
-
|
22
|
+
div.footer! { _render :partial => 'footer' }
|
21
23
|
end
|
22
|
-
div.footer! { _render :partial => 'footer' }
|
23
24
|
end
|
24
|
-
end
|
data/bin/malline
CHANGED
File without changes
|
data/lib/malline.rb
CHANGED
@@ -17,90 +17,91 @@
|
|
17
17
|
|
18
18
|
require 'malline/view_proxy.rb'
|
19
19
|
require 'malline/view_wrapper.rb'
|
20
|
-
require 'malline/view_xhtml.rb'
|
21
20
|
require 'malline/erb_out.rb'
|
22
|
-
require 'malline/form_builder.rb'
|
23
21
|
require 'malline/template.rb'
|
22
|
+
require 'malline/plugin.rb'
|
23
|
+
require 'malline/plugins/xhtml.rb'
|
24
24
|
|
25
25
|
module Malline
|
26
|
-
|
26
|
+
# Always form ^\d+\.\d+\.\d+(-[^\s]*)?$
|
27
|
+
VERSION = '1.1.0'
|
27
28
|
|
28
|
-
#
|
29
|
+
# Malline handler, always use Malline engine with this
|
30
|
+
# handler = Malline.new @view, :strict => false
|
31
|
+
# handler.
|
29
32
|
class Base
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
+
attr_accessor :malline
|
34
|
+
|
35
|
+
# Default options, can be changed with setopt
|
36
|
+
@@options = {
|
37
|
+
:strict => true,
|
38
|
+
:xhtml => true,
|
39
|
+
:encoding => 'UTF-8',
|
40
|
+
:lang => 'en',
|
41
|
+
:form_for_proxy => true
|
42
|
+
}
|
33
43
|
|
34
44
|
# First parameter is the view object (if any)
|
35
45
|
# Last parameter is optional options hash
|
36
|
-
def initialize
|
46
|
+
def initialize *opts
|
37
47
|
@options = @@options.dup
|
38
48
|
@options.merge! opts.pop if opts.last.is_a?(Hash)
|
39
49
|
|
40
50
|
@view = opts.shift || Class.new
|
41
|
-
unless @view.is_a?(ViewWrapper)
|
42
|
-
|
43
|
-
|
44
|
-
Malline::XHTML.load_plugin self if @options[:xhtml]
|
45
|
-
else
|
46
|
-
@view.malline @options
|
47
|
-
end
|
51
|
+
@view.extend ViewWrapper unless @view.is_a?(ViewWrapper)
|
52
|
+
@malline = @view.malline @options
|
53
|
+
end
|
48
54
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
rescue NameError
|
53
|
-
end
|
54
|
-
end
|
55
|
+
# Get the current filename
|
56
|
+
def path
|
57
|
+
@view.malline.path
|
55
58
|
end
|
56
59
|
|
57
|
-
def
|
58
|
-
@view.malline.path =
|
60
|
+
def path= npath
|
61
|
+
@view.malline.path = npath
|
59
62
|
end
|
60
63
|
|
64
|
+
# for example:
|
65
|
+
# setopt :strict => false
|
66
|
+
#
|
67
|
+
# or:
|
68
|
+
# setopt :strict => false
|
69
|
+
# something
|
70
|
+
# setopt :strict => true do
|
71
|
+
# something strict
|
72
|
+
# end
|
61
73
|
def self.setopt hash
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
ensure
|
69
|
-
@@options = o
|
70
|
-
end
|
71
|
-
else
|
72
|
-
@@options.merge!(hash)
|
73
|
-
end
|
74
|
-
output
|
74
|
+
return @@options.merge!(hash) unless block_given?
|
75
|
+
old = @@options.dup
|
76
|
+
@@options.merge! hash if hash
|
77
|
+
yield
|
78
|
+
ensure
|
79
|
+
@@options = old if old
|
75
80
|
end
|
76
81
|
|
77
|
-
|
78
|
-
def render tpl = nil, local_assigns = {}, n = nil, &block
|
82
|
+
def render tpl = nil, local_assigns = {}, &block
|
79
83
|
add_local_assigns local_assigns
|
80
|
-
@view.malline_is_active = true
|
81
84
|
@view.malline.run tpl, &block
|
82
85
|
end
|
83
86
|
|
84
87
|
def self.render tpl = nil, local_assigns = {}, &block
|
85
|
-
self.new.render
|
88
|
+
self.new.render tpl, local_assigns, &block
|
86
89
|
end
|
87
90
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
end
|
95
|
-
}
|
96
|
-
end
|
91
|
+
def definetags *args
|
92
|
+
@view.malline.definetags *args
|
93
|
+
end
|
94
|
+
|
95
|
+
def definetags! *args
|
96
|
+
@view.malline.definetags! *args
|
97
97
|
end
|
98
98
|
|
99
99
|
private
|
100
|
+
# Define hash as instance variables, for example { :foo => 'bar' }
|
101
|
+
# will work as @foo == 'bar' and foo == 'bar'
|
100
102
|
def add_local_assigns l
|
101
103
|
@view.instance_eval do
|
102
104
|
l.each { |key, value| instance_variable_set "@#{key}", value }
|
103
|
-
evaluate_assigns if respond_to?(:evaluate_assigns, true)
|
104
105
|
class << self; self; end.send(:attr_accessor, *(l.keys))
|
105
106
|
end
|
106
107
|
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# Copyright © 2007,2008 Riku Palomäki
|
2
|
+
#
|
3
|
+
# This file is part of Malline.
|
4
|
+
#
|
5
|
+
# Malline is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Lesser General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# Malline is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public License
|
16
|
+
# along with Malline. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
|
18
|
+
ActionView::Base.register_template_handler 'mn', Malline::Base
|
19
|
+
module ActionView
|
20
|
+
# We need to redefine some ActionView::Base methods, Since Rails 2.0 doesn't
|
21
|
+
# offer any better way to do some things.
|
22
|
+
class Base
|
23
|
+
alias_method :orig_render_template, :render_template
|
24
|
+
# We want to save the name of the current file to @current_tpl_path,
|
25
|
+
# because then the error backtrace from Rails will include the
|
26
|
+
# name of the file. I didn't find better way to get this
|
27
|
+
def render_template template_extension, template, file_path = nil, *rest
|
28
|
+
@current_tpl_path = file_path
|
29
|
+
orig_render_template(template_extension, template, file_path, *rest)
|
30
|
+
end
|
31
|
+
|
32
|
+
alias_method :orig_compile_and_render_template, :compile_and_render_template
|
33
|
+
def compile_and_render_template handler, *rest
|
34
|
+
if self.respond_to? :is_malline?
|
35
|
+
old, @malline_is_active = is_malline?, false
|
36
|
+
output = orig_compile_and_render_template handler, *rest
|
37
|
+
@malline_is_active = old
|
38
|
+
output
|
39
|
+
else
|
40
|
+
@malline_is_active = false
|
41
|
+
orig_compile_and_render_template handler, *rest
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
alias_method :orig_delegate_render, :delegate_render
|
46
|
+
# Update the current file to malline and tell Malline to be deactivated
|
47
|
+
# if there is a non-Malline partial inside Malline template.
|
48
|
+
def delegate_render(handler, template, local_assigns)
|
49
|
+
old = is_malline?
|
50
|
+
tmp = if handler == Malline::Base
|
51
|
+
h = handler.new(self)
|
52
|
+
h.path = @current_tpl_path if @current_tpl_path
|
53
|
+
@malline_is_active = true
|
54
|
+
h.render(template, local_assigns)
|
55
|
+
else
|
56
|
+
@malline_is_active = false
|
57
|
+
orig_delegate_render(handler, template, local_assigns)
|
58
|
+
end
|
59
|
+
@malline_is_active = old
|
60
|
+
tmp
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
module Malline::ViewWrapper
|
66
|
+
# Activate Malline if we are not using ActionView::Base or if
|
67
|
+
# the current template is a Malline template
|
68
|
+
def is_malline?
|
69
|
+
@malline_is_active.nil? ? true : @malline_is_active
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# Copyright © 2007,2008 Riku Palomäki
|
2
|
+
#
|
3
|
+
# This file is part of Malline.
|
4
|
+
#
|
5
|
+
# Malline is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Lesser General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# Malline is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public License
|
16
|
+
# along with Malline. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
|
18
|
+
module Malline
|
19
|
+
# Malline template handler for Rails 2.1
|
20
|
+
#
|
21
|
+
# We use Compilable-interface, even though Malline templates really doesn't
|
22
|
+
# compile into anything, but at least template files won't always be re-read
|
23
|
+
# from files. Builder templates (.builder|.rxml) also use this interface.
|
24
|
+
class RailsHandler < ActionView::TemplateHandler
|
25
|
+
include ActionView::TemplateHandlers::Compilable
|
26
|
+
|
27
|
+
# We have three lines framework code before real template code in
|
28
|
+
# 'compiled code'
|
29
|
+
def self.line_offset
|
30
|
+
3
|
31
|
+
end
|
32
|
+
|
33
|
+
# Compiles the template, i.e. return a runnable ruby code that initializes
|
34
|
+
# a new Malline::Base objects and renders the template.
|
35
|
+
def compile template
|
36
|
+
path = template.path.gsub('\\', '\\\\\\').gsub("'", "\\\\'")
|
37
|
+
"__malline_handler = Malline::Base.new self
|
38
|
+
malline.path = '#{path}'
|
39
|
+
__malline_handler.render do
|
40
|
+
#{template.source}
|
41
|
+
end"
|
42
|
+
end
|
43
|
+
|
44
|
+
# Get the rendered fragment contents
|
45
|
+
def cache_fragment block, name = {}, options = nil
|
46
|
+
@view.fragment_for(block, name, options) do
|
47
|
+
eval("__malline_handler.rendered", block.binding)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
module Malline::ViewWrapper
|
54
|
+
# Activate Malline if we are not using ActionView::Base or if
|
55
|
+
# the current template is a Malline template
|
56
|
+
def is_malline?
|
57
|
+
!(is_a?(ActionView::Base) && ActionView::Template.handler_class_for_extension(
|
58
|
+
current_render_extension) != Malline::RailsHandler)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Rails has a bug with current_render_extension, lets fix it
|
63
|
+
if ActionView.const_defined?('Renderer')
|
64
|
+
module ActionView::Renderer
|
65
|
+
alias_method :orig_render, :render
|
66
|
+
def render *args
|
67
|
+
out = orig_render *args
|
68
|
+
@view.current_render_extension = @prev_extension
|
69
|
+
out
|
70
|
+
end
|
71
|
+
|
72
|
+
alias_method :orig_prepare!, :prepare!
|
73
|
+
def prepare! *args
|
74
|
+
@prev_extension = @view.current_render_extension
|
75
|
+
orig_prepare! *args
|
76
|
+
end
|
77
|
+
end
|
78
|
+
else
|
79
|
+
class ActionView::Template
|
80
|
+
alias_method :orig_render, :render
|
81
|
+
def render *args
|
82
|
+
out = orig_render *args
|
83
|
+
@view.current_render_extension = @prev_extension
|
84
|
+
out
|
85
|
+
end
|
86
|
+
|
87
|
+
alias_method :orig_prepare!, :prepare!
|
88
|
+
def prepare! *args
|
89
|
+
@prev_extension = @view.current_render_extension
|
90
|
+
orig_prepare! *args
|
91
|
+
end
|
92
|
+
end
|
93
|
+
class ActionView::PartialTemplate
|
94
|
+
alias_method :orig_render, :render
|
95
|
+
def render *args
|
96
|
+
out = orig_render *args
|
97
|
+
@view.current_render_extension = @prev_extension
|
98
|
+
out
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
ActionView::Template.register_template_handler 'mn', Malline::RailsHandler
|
data/lib/malline/erb_out.rb
CHANGED
@@ -16,11 +16,16 @@
|
|
16
16
|
# along with Malline. If not, see <http://www.gnu.org/licenses/>.
|
17
17
|
|
18
18
|
module Malline
|
19
|
-
# ERB
|
19
|
+
# Since some parts of Rails use ERB directly instead of current template
|
20
|
+
# handler, we have to capture all that data.
|
21
|
+
#
|
22
|
+
# In practice the erb buffer object (named ActiveView::Base.erb_variable)
|
23
|
+
# is a string, where data is simply concatted.
|
20
24
|
class ErbOut
|
21
25
|
def initialize view
|
22
26
|
@view = view
|
23
27
|
end
|
28
|
+
# Redirect all data to view
|
24
29
|
def concat value
|
25
30
|
@view << value
|
26
31
|
end
|
data/lib/malline/form_builder.rb
CHANGED
@@ -16,14 +16,25 @@
|
|
16
16
|
# along with Malline. If not, see <http://www.gnu.org/licenses/>.
|
17
17
|
|
18
18
|
module Malline
|
19
|
+
# Capture form elements directly from FormBuilder, so that there is no
|
20
|
+
# need to specially render any elements.
|
21
|
+
# In other words, with our own FormBuilder-wrapper we can do this:
|
22
|
+
# form_for :comment, Comment.new, :url => edit_url do |f|
|
23
|
+
# f.text_field :name
|
24
|
+
# end
|
25
|
+
# instead of
|
26
|
+
# ..
|
27
|
+
# self << f.text_field(:name)
|
19
28
|
class FormBuilder
|
20
|
-
|
29
|
+
# Wrap the Rails FormBuilder in @builder
|
30
|
+
def initialize *args, &block
|
21
31
|
@view = eval('self', args.last)
|
22
|
-
@
|
23
|
-
@builder = ::ActionView::Helpers::FormBuilder.new(*args)
|
32
|
+
@builder = ::ActionView::Helpers::FormBuilder.new(*args, &block)
|
24
33
|
end
|
34
|
+
# Render every f.foo -method to view, unless we aren't using
|
35
|
+
# Malline template now
|
25
36
|
def method_missing *args, &block
|
26
|
-
if @view
|
37
|
+
if @view && @view.is_malline?
|
27
38
|
@view << @builder.send(*args, &block)
|
28
39
|
else
|
29
40
|
@builder.send(*args, &block)
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# Copyright © 2007,2008 Riku Palomäki
|
2
|
+
#
|
3
|
+
# This file is part of Malline.
|
4
|
+
#
|
5
|
+
# Malline is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Lesser General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# Malline is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public License
|
16
|
+
# along with Malline. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
|
18
|
+
# Malline very incomplete Plugin interface.
|
19
|
+
class Malline::Plugin
|
20
|
+
# Install a new plugin: Malline::WhatEverPlugin.install view
|
21
|
+
def self.install view
|
22
|
+
return if view.malline.plugins.include? self
|
23
|
+
self.do_install view
|
24
|
+
view.malline.plugins << self
|
25
|
+
end
|
26
|
+
|
27
|
+
protected
|
28
|
+
def self.do_install view
|
29
|
+
raise NotImplementedError.new
|
30
|
+
end
|
31
|
+
def self.do_uninstall view
|
32
|
+
raise NotImplementedError.new("#{self} cannot be uninstalled")
|
33
|
+
end
|
34
|
+
end
|
@@ -15,7 +15,13 @@
|
|
15
15
|
# You should have received a copy of the GNU Lesser General Public License
|
16
16
|
# along with Malline. If not, see <http://www.gnu.org/licenses/>.
|
17
17
|
|
18
|
-
|
18
|
+
# Quite stupid plugin for XHTML, we should be able to do this only with a DTD
|
19
|
+
# or similar.
|
20
|
+
#
|
21
|
+
# Defines all usable tags, list which one can be self-close, defines a short
|
22
|
+
# cut tag *xhtml*. Also makes sure that there is some necessary elements in
|
23
|
+
# the document.
|
24
|
+
class Malline::XHTML < Malline::Plugin
|
19
25
|
CUSTOM_TAGS = %w{head title meta}
|
20
26
|
|
21
27
|
# grep ELEMENT xhtml1-transitional.dtd | cut -d' ' -f2 | tr "\n" " "
|
@@ -63,9 +69,9 @@ module Malline::XHTML
|
|
63
69
|
end
|
64
70
|
end
|
65
71
|
|
66
|
-
def self.
|
67
|
-
|
68
|
-
|
69
|
-
|
72
|
+
def self.do_install view
|
73
|
+
view.malline.definetags! XHTML_TAGS
|
74
|
+
view.malline.short_tag_excludes += SHORT_TAG_EXCLUDES
|
75
|
+
view.extend Tags
|
70
76
|
end
|
71
77
|
end
|
data/lib/malline/rails.rb
CHANGED
@@ -16,30 +16,31 @@
|
|
16
16
|
# along with Malline. If not, see <http://www.gnu.org/licenses/>.
|
17
17
|
|
18
18
|
require 'malline' unless Kernel.const_defined?('Malline')
|
19
|
+
require 'malline/form_builder.rb'
|
19
20
|
|
20
|
-
|
21
|
+
if Rails::VERSION::STRING <= "2.0.z"
|
22
|
+
require 'malline/adapters/rails-2.0'
|
23
|
+
else
|
24
|
+
require 'malline/adapters/rails-2.1'
|
25
|
+
end
|
21
26
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
orig_render_template(template_extension, template, file_path, *rest)
|
28
|
-
end
|
27
|
+
# Activate our FormBuilder wrapper, so we can use forms more easily
|
28
|
+
ActionView::Base.default_form_builder = Malline::FormBuilder
|
29
|
+
|
30
|
+
module Malline::ViewWrapper
|
31
|
+
@@malline_methods << 'cache'
|
29
32
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
@malline_is_active = false
|
39
|
-
orig_delegate_render(handler, template, local_assigns)
|
40
|
-
end
|
41
|
-
@malline_is_active = old
|
42
|
-
tmp
|
33
|
+
# Rails caching
|
34
|
+
def _malline_cache name = {}, options = {}, &block
|
35
|
+
return block.call unless @controller.perform_caching
|
36
|
+
cache = @controller.read_fragment(name, options)
|
37
|
+
|
38
|
+
unless cache
|
39
|
+
cache = _malline_capture { block.call }
|
40
|
+
@controller.write_fragment(name, cache, options)
|
43
41
|
end
|
42
|
+
@malline.add_unescaped_text cache
|
44
43
|
end
|
45
44
|
end
|
45
|
+
|
46
|
+
|
data/lib/malline/template.rb
CHANGED
@@ -16,11 +16,26 @@
|
|
16
16
|
# along with Malline. If not, see <http://www.gnu.org/licenses/>.
|
17
17
|
|
18
18
|
module Malline
|
19
|
+
# This is the class that really evaluates the template and is accessible
|
20
|
+
# from the view by "malline", for example:
|
21
|
+
# malline.path = 'File name'
|
19
22
|
class Template
|
23
|
+
# Current options (like @@options in Base)
|
20
24
|
attr_accessor :options
|
25
|
+
# List of every tag that doesn't support self-closing syntax
|
21
26
|
attr_accessor :short_tag_excludes
|
27
|
+
# Current state of :whitespace-modifier (bool)
|
22
28
|
attr_accessor :whitespace
|
29
|
+
# Current file name
|
23
30
|
attr_accessor :path
|
31
|
+
# Every overriden (in definetags!) helper method (:name => method)
|
32
|
+
attr_accessor :helper_overrides
|
33
|
+
# Every available tag, excluding the specific methods (:name => bool)
|
34
|
+
attr_accessor :tags
|
35
|
+
# Render result of the last #render
|
36
|
+
attr_reader :rendered
|
37
|
+
# List all installed plugins
|
38
|
+
attr_accessor :plugins
|
24
39
|
|
25
40
|
def initialize view, opts
|
26
41
|
@view = view
|
@@ -28,13 +43,25 @@ module Malline
|
|
28
43
|
@path = 'Malline template'
|
29
44
|
@options = opts
|
30
45
|
@short_tag_excludes = []
|
46
|
+
@helper_overrides = {}
|
47
|
+
@tags = {}
|
48
|
+
@plugins = []
|
49
|
+
@inited = false
|
31
50
|
end
|
32
51
|
|
33
|
-
#
|
34
|
-
#
|
52
|
+
# Install plugins and do every thing that cannot be done in initialize
|
53
|
+
# Plugin install will use @view.malline, that will create a duplicate
|
54
|
+
# Template instance, if it's called from initialize.
|
55
|
+
def init
|
56
|
+
return if @inited
|
57
|
+
XHTML.install @view if @options[:xhtml]
|
58
|
+
end
|
59
|
+
|
60
|
+
# Stolen from ERB, © 1999-2000,2002,2003 Masatoshi SEKI
|
35
61
|
def self.html_escape(s)
|
36
62
|
s.to_s.gsub(/&/, "&").gsub(/\"/, """).gsub(/>/, ">").gsub(/</, "<")
|
37
63
|
end
|
64
|
+
# Stolen from ERB, © 1999-2000,2002,2003 Masatoshi SEKI
|
38
65
|
def self.url_encode(s)
|
39
66
|
s.to_s.gsub(/[^a-zA-Z0-9_\-.]/n){ sprintf("%%%02X", $&.unpack("C")[0]) }
|
40
67
|
end
|
@@ -51,23 +78,33 @@ module Malline
|
|
51
78
|
@dom = tmp
|
52
79
|
end
|
53
80
|
|
81
|
+
# Add escaped string to @dom
|
54
82
|
def add_text *values
|
55
83
|
@dom << ' ' if @whitespace
|
56
84
|
@dom << Template.html_escape(values.join(' '))
|
57
85
|
end
|
58
86
|
|
87
|
+
# Add unescaped string to @dom
|
59
88
|
def add_unescaped_text value
|
60
89
|
@dom << ' ' if @whitespace
|
61
90
|
@dom << value.to_s unless value.nil?
|
62
91
|
end
|
63
92
|
|
93
|
+
# Call a helper (a method defined outside malline whose
|
94
|
+
# output is stored to @dom)
|
64
95
|
def helper helper, *args, &block
|
65
|
-
|
96
|
+
helper = helper.to_sym
|
97
|
+
tmp = if h = @helper_overrides[helper]
|
98
|
+
h.call *args, &block
|
99
|
+
else
|
100
|
+
@view.send helper, *args, &block
|
101
|
+
end
|
66
102
|
@dom << ' ' if @whitespace
|
67
103
|
@dom << tmp.to_s
|
68
104
|
tmp
|
69
105
|
end
|
70
106
|
|
107
|
+
# Add a tag to @dom
|
71
108
|
def tag s, *args, &block
|
72
109
|
tag = { :name => s.to_s, :attrs => {}, :children => [] }
|
73
110
|
|
@@ -89,15 +126,15 @@ module Malline
|
|
89
126
|
ViewProxy.new self, tag
|
90
127
|
end
|
91
128
|
|
92
|
-
# Render the
|
129
|
+
# Render the XML tree at dom or @dom
|
93
130
|
def render dom = nil
|
94
|
-
(dom || @dom).inject('') do |out, tag|
|
131
|
+
@rendered = (dom || @dom).inject('') do |out, tag|
|
95
132
|
if tag.is_a?(String)
|
96
133
|
out << tag
|
97
134
|
else
|
98
135
|
out << ' ' if tag[:whitespace]
|
99
136
|
out << "<#{tag[:name]}"
|
100
|
-
out << tag[:attrs].inject(''){|s, a| s
|
137
|
+
out << tag[:attrs].inject(''){|s, a| s + " #{a.first}=\"#{Template.html_escape(a.last)}\""}
|
101
138
|
|
102
139
|
if tag[:children].empty?
|
103
140
|
if @short_tag_excludes.include?(tag[:name])
|
@@ -116,9 +153,33 @@ module Malline
|
|
116
153
|
|
117
154
|
# Execute and render a text or block
|
118
155
|
def run tpl = nil, &block
|
156
|
+
init
|
119
157
|
tmp = []
|
120
158
|
execute tmp, tpl, &block
|
121
159
|
render tmp
|
122
160
|
end
|
161
|
+
|
162
|
+
# Define tags as a methods, overriding all same named methods
|
163
|
+
def definetags! *tags
|
164
|
+
tags.flatten.each do |tag|
|
165
|
+
tag = tag.to_sym
|
166
|
+
@helper_overrides[tag] = @view.method(tag) if @view.respond_to?(tag)
|
167
|
+
define_tag! tag
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
# Marking tags as usable, but not overriding anything
|
172
|
+
def definetags *tags
|
173
|
+
tags.flatten.each{|tag| @tags[tag] = true }
|
174
|
+
end
|
175
|
+
|
176
|
+
# Define a method tag
|
177
|
+
def define_tag! tag
|
178
|
+
eval %{
|
179
|
+
def @view.#{tag}(*args, &block)
|
180
|
+
tag!('#{tag}', *args, &block)
|
181
|
+
end
|
182
|
+
}
|
183
|
+
end
|
123
184
|
end
|
124
185
|
end
|
data/lib/malline/view_proxy.rb
CHANGED
@@ -16,39 +16,72 @@
|
|
16
16
|
# along with Malline. If not, see <http://www.gnu.org/licenses/>.
|
17
17
|
|
18
18
|
module Malline
|
19
|
+
# Every tag returns a ViewProxy object that binds the tag to the template.
|
20
|
+
# ViewProxy also chains the process by returning itself.
|
21
|
+
#
|
22
|
+
# This Proxy object then makes possible the attribute syntax:
|
23
|
+
# div.foo.bar! { stuff }
|
24
|
+
#
|
25
|
+
# div returns new ViewProxy instance, so div.foo actually calls
|
26
|
+
# ViewProxy#foo, which is then generated to class="foo" -attribute to the
|
27
|
+
# original tag div. div.foo returns the same ViewProxy, and foo.bar! calls
|
28
|
+
# ViewProxy#bar!, which is interpreted as a id="bar" -attribute.
|
29
|
+
#
|
30
|
+
# Finally the given block { stuff } is evaluated the same way than it would
|
31
|
+
# be evaluated without the ViewProxy:
|
32
|
+
# div { stuff }
|
19
33
|
class ViewProxy
|
20
34
|
def initialize template, tag
|
21
35
|
@tpl = template
|
22
36
|
@tag = tag
|
23
37
|
end
|
24
38
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
39
|
+
# Allows to add new content to already closed tag, for example:
|
40
|
+
# t = div do
|
41
|
+
# _'text'
|
42
|
+
# end
|
43
|
+
# t.__yld :whitespace { stuff }
|
44
|
+
#
|
45
|
+
# Intended for internal use only
|
46
|
+
def __yld *args, &block
|
47
|
+
# div :title => 'data'
|
30
48
|
if args.last.is_a?(Hash)
|
31
49
|
@tag[:attrs].merge!(args.pop)
|
32
50
|
end
|
33
51
|
|
34
|
-
|
35
|
-
@tag[:attrs]['id'] = s.to_s.chomp('!')
|
36
|
-
else
|
37
|
-
if @tag[:attrs]['class']
|
38
|
-
@tag[:attrs]['class'] << " #{s}"
|
39
|
-
else
|
40
|
-
@tag[:attrs]['class'] = s.to_s
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
52
|
+
# Modifiers
|
44
53
|
whitespace = @tpl.whitespace
|
45
54
|
@tpl.whitespace = true if args.delete(:whitespace)
|
46
|
-
|
55
|
+
|
56
|
+
# Rest is just content separated by a space
|
57
|
+
txt = args.flatten.join ' '
|
47
58
|
@tag[:children] << txt unless txt.empty?
|
48
59
|
|
60
|
+
# Block
|
49
61
|
@tpl.execute @tag[:children], &block if block_given?
|
62
|
+
|
63
|
+
# Restore modifiers
|
50
64
|
@tpl.whitespace = whitespace
|
65
|
+
|
66
|
+
# Chain the calls, for example: div.foo.bar!.yeah.boring
|
51
67
|
self
|
52
68
|
end
|
69
|
+
|
70
|
+
# Capture attribute definitions, special modifiers and blocks
|
71
|
+
def method_missing s, *args, &block
|
72
|
+
# div.id!
|
73
|
+
if /^(.*)!$/ =~ s.to_s
|
74
|
+
@tag[:attrs]['id'] = $1
|
75
|
+
elsif s
|
76
|
+
# div.class
|
77
|
+
if @tag[:attrs]['class']
|
78
|
+
@tag[:attrs]['class'] << " #{s}"
|
79
|
+
else
|
80
|
+
@tag[:attrs]['class'] = s.to_s
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
__yld *args, &block
|
85
|
+
end
|
53
86
|
end
|
54
87
|
end
|
data/lib/malline/view_wrapper.rb
CHANGED
@@ -16,13 +16,14 @@
|
|
16
16
|
# along with Malline. If not, see <http://www.gnu.org/licenses/>.
|
17
17
|
|
18
18
|
module Malline
|
19
|
+
# ViewWrapper is extended into used view object, like ActiveView::Base.
|
20
|
+
# Every method in ViewWrapper will pollute the original namespace.
|
19
21
|
module ViewWrapper
|
20
|
-
attr_accessor :malline_is_active
|
21
|
-
|
22
22
|
# List of all methods that may override some custom view methods
|
23
23
|
# If is_malline?, then their _malline_ -prefix versions are called
|
24
|
-
@@malline_methods = %w{_erbout
|
24
|
+
@@malline_methods = %w{_erbout capture _ tag! << txt!}
|
25
25
|
|
26
|
+
# Initialize @@malline_methods
|
26
27
|
def init_malline_methods
|
27
28
|
@malline_methods_inited = true
|
28
29
|
@@malline_methods.each do |m|
|
@@ -31,61 +32,64 @@ module Malline
|
|
31
32
|
end
|
32
33
|
end
|
33
34
|
|
35
|
+
# Returns a current Template instance, makes a new if called first time
|
36
|
+
# Can also be used to set options to Template by giving them as hash opts:
|
37
|
+
# malline :whitespace => true
|
34
38
|
def malline opts = nil
|
35
39
|
if @malline
|
36
40
|
@malline.options.merge!(opts) if opts.is_a?(Hash)
|
37
41
|
else
|
38
|
-
@malline = Template.new(self, opts)
|
42
|
+
@malline = Template.new(self, opts || {})
|
39
43
|
end
|
40
44
|
init_malline_methods unless @malline_methods_inited
|
41
45
|
@malline
|
42
46
|
end
|
43
47
|
|
48
|
+
# erbout emulator
|
44
49
|
def _malline__erbout
|
45
50
|
@_erbout ||= ErbOut.new(self)
|
46
51
|
end
|
47
52
|
|
48
|
-
|
49
|
-
return block.call unless @controller.perform_caching
|
50
|
-
cache = @controller.read_fragment(name, options)
|
51
|
-
|
52
|
-
unless cache
|
53
|
-
cache = _malline_capture { block.call }
|
54
|
-
@controller.write_fragment(name, cache, options)
|
55
|
-
end
|
56
|
-
@malline.add_unescaped_text cache
|
57
|
-
end
|
58
|
-
|
53
|
+
# capture and return the output of the block
|
59
54
|
def _malline_capture &block
|
60
55
|
@malline.run &block
|
61
56
|
end
|
62
57
|
|
58
|
+
# _'escaped text'
|
63
59
|
def _malline__ *args
|
64
60
|
@malline.add_text(*args)
|
65
61
|
end
|
66
62
|
alias_method :_malline_txt!, :_malline__
|
67
63
|
|
64
|
+
# self << "<unescaped text>"
|
68
65
|
def _malline_ltlt *args
|
69
66
|
@malline.add_unescaped_text *args
|
70
67
|
end
|
71
68
|
|
69
|
+
# Define a new tag of call a helper (if _prefixed)
|
72
70
|
def method_missing s, *args, &block
|
73
71
|
return super unless is_malline?
|
74
|
-
|
75
|
-
|
76
|
-
@malline.helper(helper, *args, &block)
|
72
|
+
if @malline.tags[s]
|
73
|
+
@malline.tag s, *args, &block
|
77
74
|
else
|
78
|
-
|
79
|
-
|
75
|
+
helper = ((s.to_s[0] == ?_) ? s.to_s[1..-1] : s).to_sym
|
76
|
+
if respond_to?(helper)
|
77
|
+
@malline.helper(helper, *args, &block)
|
78
|
+
else
|
79
|
+
return super if @malline.options[:strict]
|
80
|
+
_malline_tag! s, *args, &block
|
81
|
+
end
|
80
82
|
end
|
81
83
|
end
|
82
84
|
|
85
|
+
# Define a new tag
|
83
86
|
def _malline_tag! *args, &block
|
84
87
|
@malline.tag *args, &block
|
85
88
|
end
|
86
89
|
|
90
|
+
# Are we in a Malline template
|
87
91
|
def is_malline?
|
88
|
-
|
92
|
+
true
|
89
93
|
end
|
90
94
|
end
|
91
95
|
end
|
data/scripts/html2mn.rb
CHANGED
File without changes
|
data/test/malline_test.rb
CHANGED
@@ -19,35 +19,6 @@ $: << t
|
|
19
19
|
$: << File.join(t, 'lib')
|
20
20
|
require 'test/unit'
|
21
21
|
require 'test/malline_test_helpers.rb'
|
22
|
-
require 'malline.rb'
|
23
|
-
|
24
|
-
class Controller
|
25
|
-
def perform_caching
|
26
|
-
false
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
class Comment
|
31
|
-
end
|
32
|
-
|
33
|
-
class View
|
34
|
-
def initialize
|
35
|
-
@controller = Controller.new
|
36
|
-
end
|
37
|
-
def image_path(im)
|
38
|
-
"/images/#{im.is_a?(MallineTestHelpers::Image) ? im.id : 'img'}"
|
39
|
-
end
|
40
|
-
def truncate(str, size = 10)
|
41
|
-
str[0...size]
|
42
|
-
end
|
43
|
-
def render hash
|
44
|
-
Malline::Base.new(View.new).render File.read(File.join(File.dirname(__FILE__), hash[:partial].sub(/\//, '/_') + '.mn')) rescue ''
|
45
|
-
end
|
46
|
-
def link_to *args
|
47
|
-
'link'
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
22
|
|
52
23
|
class MallineTest < Test::Unit::TestCase
|
53
24
|
include Malline
|
@@ -55,10 +26,11 @@ class MallineTest < Test::Unit::TestCase
|
|
55
26
|
|
56
27
|
def test_simple
|
57
28
|
Base.setopt :strict => false, :xhtml => false do
|
58
|
-
assert_xml_equal('<foo id="a"><bar class="a b"
|
29
|
+
assert_xml_equal('<foo id="a"><bar class="a b"/>blabla</foo>',
|
59
30
|
Base.render do
|
60
31
|
foo.a! do
|
61
32
|
bar.a.b
|
33
|
+
_'blabla'
|
62
34
|
end
|
63
35
|
end
|
64
36
|
)
|
@@ -109,22 +81,29 @@ class MallineTest < Test::Unit::TestCase
|
|
109
81
|
end
|
110
82
|
b = Proc.new do
|
111
83
|
foo do
|
112
|
-
|
84
|
+
zoo :a => 'b' do
|
113
85
|
bar
|
114
86
|
end
|
87
|
+
_zoo
|
88
|
+
xoo.bar
|
115
89
|
end
|
116
90
|
end
|
117
91
|
out = tpl.render nil, &b
|
118
|
-
|
92
|
+
# zoo isn't rendered, because there is helper named zoo
|
93
|
+
assert_xml_equal('<foo>zoo output<xoo class="bar"/></foo>', out)
|
94
|
+
|
95
|
+
tpl.definetags :zoo
|
96
|
+
out = tpl.render nil, &b
|
97
|
+
assert_xml_equal('<foo>zoo output<xoo class="bar"/></foo>', out)
|
119
98
|
|
120
|
-
tpl.definetags :
|
99
|
+
tpl.definetags! :zoo
|
121
100
|
out = tpl.render nil, &b
|
122
|
-
assert_xml_equal('<foo><
|
101
|
+
assert_xml_equal('<foo><zoo a="b"><bar/></zoo>zoo output<xoo class="bar"/></foo>', out)
|
123
102
|
|
124
103
|
out = Base.setopt :strict => false, :xhtml => false do
|
125
104
|
Base.render &b
|
126
105
|
end
|
127
|
-
assert_xml_equal('<foo
|
106
|
+
assert_xml_equal('<foo><zoo a="b"><bar/></zoo><_zoo/><xoo class="bar"/></foo>', out)
|
128
107
|
end
|
129
108
|
|
130
109
|
def test_xhtml
|
@@ -16,11 +16,7 @@
|
|
16
16
|
# along with Malline. If not, see <http://www.gnu.org/licenses/>.
|
17
17
|
|
18
18
|
require "rexml/document"
|
19
|
-
|
20
|
-
module Kernel
|
21
|
-
def xxx *args
|
22
|
-
end
|
23
|
-
end
|
19
|
+
require 'malline.rb'
|
24
20
|
|
25
21
|
module MallineTestHelpers
|
26
22
|
include REXML
|
@@ -55,3 +51,32 @@ module MallineTestHelpers
|
|
55
51
|
end
|
56
52
|
end
|
57
53
|
|
54
|
+
class Controller
|
55
|
+
def perform_caching
|
56
|
+
false
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
class Comment
|
61
|
+
end
|
62
|
+
|
63
|
+
class View
|
64
|
+
def initialize
|
65
|
+
@controller = Controller.new
|
66
|
+
end
|
67
|
+
def image_path(im)
|
68
|
+
"/images/#{im.is_a?(MallineTestHelpers::Image) ? im.id : 'img'}"
|
69
|
+
end
|
70
|
+
def truncate(str, size = 10)
|
71
|
+
str[0...size]
|
72
|
+
end
|
73
|
+
def render hash
|
74
|
+
Malline::Base.new(View.new).render File.read(File.join(File.dirname(__FILE__), hash[:partial].sub(/\//, '/_') + '.mn')) rescue ''
|
75
|
+
end
|
76
|
+
def link_to *args
|
77
|
+
'link'
|
78
|
+
end
|
79
|
+
def zoo *args
|
80
|
+
'zoo output'
|
81
|
+
end
|
82
|
+
end
|
metadata
CHANGED
@@ -1,110 +1,118 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.4
|
3
|
-
specification_version: 1
|
4
2
|
name: malline
|
5
3
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 1.0
|
7
|
-
date: 2008-04-01 00:00:00 +03:00
|
8
|
-
summary: Malline is a full-featured pure Ruby template system designed to be a replacement for ERB views in Rails or any other framework. See http://www.malline.org/ for more info.
|
9
|
-
require_paths:
|
10
|
-
- lib
|
11
|
-
email: riku@palomaki.fi
|
12
|
-
homepage: http://www.malline.org/
|
13
|
-
rubyforge_project: malline
|
14
|
-
description: Malline is a full-featured template system designed to be a replacement for ERB views in Rails or any other framework. It also includes standalone bin/malline to compile Malline templates to XML in commandline. All Malline templates are pure Ruby, see http://www.malline.org/ for more info.
|
15
|
-
autorequire: malline
|
16
|
-
default_executable:
|
17
|
-
bindir: bin
|
18
|
-
has_rdoc: false
|
19
|
-
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">"
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 0.0.0
|
24
|
-
version:
|
4
|
+
version: 1.1.0
|
25
5
|
platform: ruby
|
26
|
-
signing_key:
|
27
|
-
cert_chain:
|
28
|
-
post_install_message:
|
29
6
|
authors:
|
30
7
|
- "Riku Palom\xC3\xA4ki"
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2008-07-06 00:00:00 +03:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: Malline is a full-featured template system designed to be a replacement for ERB views in Rails or any other framework. It also includes standalone bin/malline to compile Malline templates to XML in commandline. All Malline templates are pure Ruby, see http://www.malline.org/ for more info.
|
17
|
+
email: riku@palomaki.fi
|
18
|
+
executables:
|
19
|
+
- malline
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files:
|
23
|
+
- README
|
31
24
|
files:
|
32
25
|
- lib/malline.rb
|
33
26
|
- lib/malline/erb_out.rb
|
34
|
-
- lib/malline/view_xhtml.rb
|
35
|
-
- lib/malline/form_builder.rb
|
36
|
-
- lib/malline/view_wrapper.rb
|
37
|
-
- lib/malline/template.rb
|
38
27
|
- lib/malline/view_proxy.rb
|
39
28
|
- lib/malline/rails.rb
|
29
|
+
- lib/malline/view_wrapper.rb
|
30
|
+
- lib/malline/form_builder.rb
|
31
|
+
- lib/malline/adapters/rails-2.1.rb
|
32
|
+
- lib/malline/adapters/rails-2.0.rb
|
33
|
+
- lib/malline/template.rb
|
34
|
+
- lib/malline/plugin.rb
|
35
|
+
- lib/malline/plugins/xhtml.rb
|
40
36
|
- bin/malline
|
41
37
|
- COPYING.LESSER
|
42
38
|
- COPYING
|
43
39
|
- README
|
44
40
|
- scripts/html2mn.rb
|
41
|
+
- test/malline_test_helpers.rb
|
45
42
|
- test/examples
|
46
43
|
- test/kernel.org.mn
|
47
|
-
- test/malline_test.rb
|
48
|
-
- test/malline_test_helpers.rb
|
49
44
|
- test/kernel.org.html
|
50
|
-
- test/
|
51
|
-
- test/examples/options.target
|
45
|
+
- test/malline_test.rb
|
52
46
|
- test/examples/_two.mn
|
47
|
+
- test/examples/options.mn
|
48
|
+
- test/examples/whitespace.mn
|
49
|
+
- test/examples/id.mn
|
50
|
+
- test/examples/helper2.mn
|
51
|
+
- test/examples/_partial.mn
|
52
|
+
- test/examples/helper2.target
|
53
|
+
- test/examples/text.target
|
54
|
+
- test/examples/escape.target
|
55
|
+
- test/examples/_two.target
|
56
|
+
- test/examples/class.mn
|
57
|
+
- test/examples/_partial.target
|
58
|
+
- test/examples/nested.mn
|
53
59
|
- test/examples/xhtml.target
|
54
|
-
- test/examples/
|
60
|
+
- test/examples/capture.target
|
61
|
+
- test/examples/partials.target
|
62
|
+
- test/examples/_action.mn
|
63
|
+
- test/examples/self.mn
|
64
|
+
- test/examples/_three.rhtml
|
65
|
+
- test/examples/helper.target
|
55
66
|
- test/examples/lists.target
|
56
|
-
- test/examples/
|
67
|
+
- test/examples/_action.target
|
68
|
+
- test/examples/layout.target
|
69
|
+
- test/examples/hello_world.target
|
70
|
+
- test/examples/id.target
|
57
71
|
- test/examples/helper.mn
|
58
|
-
- test/examples/_one.mn
|
59
72
|
- test/examples/class.target
|
60
|
-
- test/examples/
|
61
|
-
- test/examples/
|
62
|
-
- test/examples/
|
63
|
-
- test/examples/
|
64
|
-
- test/examples/
|
65
|
-
- test/examples/
|
66
|
-
- test/examples/
|
67
|
-
- test/examples/partials.target
|
73
|
+
- test/examples/capture.mn
|
74
|
+
- test/examples/layout.mn
|
75
|
+
- test/examples/escape.mn
|
76
|
+
- test/examples/frontpage.target
|
77
|
+
- test/examples/partials.mn
|
78
|
+
- test/examples/_one.target
|
79
|
+
- test/examples/hello_world.mn
|
68
80
|
- test/examples/xhtml.mn
|
69
81
|
- test/examples/lists.mn
|
70
|
-
- test/examples/
|
71
|
-
- test/examples/
|
72
|
-
- test/examples/
|
73
|
-
- test/examples/id.target
|
82
|
+
- test/examples/_one.mn
|
83
|
+
- test/examples/nested.target
|
84
|
+
- test/examples/options.target
|
74
85
|
- test/examples/whitespace.target
|
86
|
+
- test/examples/self.target
|
87
|
+
- test/examples/helper_shortcut.target
|
88
|
+
- test/examples/text.mn
|
75
89
|
- test/examples/helper_shortcut.mn
|
76
|
-
- test/examples/
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
- test/examples/partials.mn
|
81
|
-
- test/examples/_three.rhtml
|
82
|
-
- test/examples/_two.target
|
83
|
-
- test/examples/hello_world.target
|
84
|
-
- test/examples/fragment_cache.mn
|
85
|
-
- test/examples/layout.target
|
86
|
-
- test/examples/self.mn
|
87
|
-
- test/examples/helper.target
|
88
|
-
- test/examples/id.mn
|
89
|
-
- test/examples/_one.target
|
90
|
-
- test/examples/whitespace.mn
|
91
|
-
- test/examples/nested.target
|
92
|
-
- test/examples/escape.mn
|
93
|
-
- test/examples/text.target
|
94
|
-
- test/examples/helper2.mn
|
95
|
-
- test/examples/frontpage.target
|
96
|
-
- test/examples/capture.mn
|
97
|
-
test_files:
|
98
|
-
- test/malline_test.rb
|
90
|
+
- test/examples/frontpage.mn
|
91
|
+
has_rdoc: true
|
92
|
+
homepage: http://www.malline.org/
|
93
|
+
post_install_message:
|
99
94
|
rdoc_options: []
|
100
95
|
|
101
|
-
|
102
|
-
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
96
|
+
require_paths:
|
97
|
+
- lib
|
98
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: "0"
|
103
|
+
version:
|
104
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
105
|
+
requirements:
|
106
|
+
- - ">="
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: "0"
|
109
|
+
version:
|
107
110
|
requirements: []
|
108
111
|
|
109
|
-
|
110
|
-
|
112
|
+
rubyforge_project: malline
|
113
|
+
rubygems_version: 1.1.1
|
114
|
+
signing_key:
|
115
|
+
specification_version: 2
|
116
|
+
summary: Malline is a full-featured pure Ruby template system designed to be a replacement for ERB views in Rails or any other framework. See http://www.malline.org/ for more info.
|
117
|
+
test_files:
|
118
|
+
- test/malline_test.rb
|
@@ -1,10 +0,0 @@
|
|
1
|
-
div do
|
2
|
-
cache "stuff" do
|
3
|
-
# This block is evaluated only if no cache with keyword stuff is found
|
4
|
-
# After evaluation the block is saved to cache
|
5
|
-
# If caching is not enabled, the cache block is transparent
|
6
|
-
h4 'Some partial stuff'
|
7
|
-
_render :partial => 'examples/partial'
|
8
|
-
end
|
9
|
-
_'dynamic content'
|
10
|
-
end
|
@@ -1 +0,0 @@
|
|
1
|
-
<div><h4>Some partial stuff</h4><div>I always thought something was fundamentally wrong with the universe.</div>dynamic content</div>
|