mustache_render 0.0.1 → 0.0.3
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.
- data/MIT-LICENSE +1 -1
- data/README.rdoc +20 -1
- data/lib/generators/mustache_render/migration/install_generator.rb +53 -0
- data/lib/generators/mustache_render/migration/templates/active_record/migration.rb +37 -0
- data/lib/generators/mustache_render/migration/templates/models/active_record/mustache_render_folder.rb +6 -0
- data/lib/generators/mustache_render/migration/templates/models/active_record/mustache_render_template.rb +6 -0
- data/lib/mustache_render.rb +26 -0
- data/lib/mustache_render/config.rb +22 -0
- data/lib/mustache_render/controllers/mustache_render/manager/base_controller.rb +16 -0
- data/lib/mustache_render/controllers/mustache_render/manager/folders_controller.rb +46 -0
- data/lib/mustache_render/controllers/mustache_render/manager/templates_controller.rb +53 -0
- data/lib/mustache_render/core_ext/base_controller_ext.rb +41 -0
- data/lib/mustache_render/models/mustache_render_folder_mixin.rb +128 -0
- data/lib/mustache_render/models/mustache_render_template_mixin.rb +44 -0
- data/lib/mustache_render/mustache.rb +314 -0
- data/lib/mustache_render/mustache/context.rb +144 -0
- data/lib/mustache_render/mustache/generator.rb +197 -0
- data/lib/mustache_render/mustache/parser.rb +265 -0
- data/lib/mustache_render/mustache/settings.rb +234 -0
- data/lib/mustache_render/mustache/template.rb +60 -0
- data/lib/mustache_render/version.rb +8 -1
- data/lib/mustache_render/views/layouts/mustache_render/manager/base.html.erb +14 -0
- data/lib/mustache_render/views/mustache_render/manager/folders/_form.html.erb +31 -0
- data/lib/mustache_render/views/mustache_render/manager/folders/edit.html.erb +11 -0
- data/lib/mustache_render/views/mustache_render/manager/folders/index.html.erb +9 -0
- data/lib/mustache_render/views/mustache_render/manager/folders/new.html.erb +8 -0
- data/lib/mustache_render/views/mustache_render/manager/folders/show.html.erb +44 -0
- data/lib/mustache_render/views/mustache_render/manager/templates/_form.html.erb +36 -0
- data/lib/mustache_render/views/mustache_render/manager/templates/edit.html.erb +15 -0
- data/lib/mustache_render/views/mustache_render/manager/templates/new.html.erb +12 -0
- data/lib/mustache_render/views/mustache_render/manager/templates/show.html.erb +33 -0
- metadata +106 -30
data/MIT-LICENSE
CHANGED
data/README.rdoc
CHANGED
@@ -1,3 +1,22 @@
|
|
1
1
|
= MustacheRender
|
2
2
|
|
3
|
-
This project rocks and uses MIT-LICENSE.
|
3
|
+
This project rocks and uses MIT-LICENSE.
|
4
|
+
|
5
|
+
= Rails 3.1.x
|
6
|
+
|
7
|
+
routes
|
8
|
+
|
9
|
+
```
|
10
|
+
namespace :mustache_render do
|
11
|
+
namespace :manager do
|
12
|
+
resources :folders do
|
13
|
+
resources :templates, :only => [:show, :new, :edit, :update, :create, :destroy]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
```
|
18
|
+
|
19
|
+
install:
|
20
|
+
|
21
|
+
rails g mustache_render:migration:install
|
22
|
+
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'rails/generators'
|
3
|
+
require 'rails/generators/migration'
|
4
|
+
|
5
|
+
module MustacheRender
|
6
|
+
module Migration
|
7
|
+
class InstallGenerator < Rails::Generators::Base
|
8
|
+
include Rails::Generators::Migration
|
9
|
+
|
10
|
+
desc "Generates MustacheRender database migration"
|
11
|
+
|
12
|
+
def copy_files
|
13
|
+
orm = options[:orm].to_s
|
14
|
+
orm = "active_record" unless %w{active_record}.include?(orm)
|
15
|
+
%w(mustache_render_folder mustache_render_template).each do |file|
|
16
|
+
copy_model(orm, file)
|
17
|
+
end
|
18
|
+
|
19
|
+
if self.class.orm_has_migration?
|
20
|
+
migration_template "#{orm}/migration.rb", 'db/migrate/mustache_render_migration'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.orm
|
25
|
+
Rails::Generators.options[:rails][:orm]
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.source_root
|
29
|
+
File.join(File.dirname(__FILE__), 'templates')
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.orm_has_migration?
|
33
|
+
[:active_record].include? orm
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.next_migration_number(dirname)
|
37
|
+
if ActiveRecord::Base.timestamped_migrations
|
38
|
+
migration_number = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i
|
39
|
+
migration_number += 1
|
40
|
+
migration_number.to_s
|
41
|
+
else
|
42
|
+
"%.3d" % (current_migration_number(dirname) + 1)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def copy_model(orm, name)
|
49
|
+
template "models/#{orm}/#{name}.rb", "app/models/#{name}.rb"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
class MustacheRenderMigration < ActiveRecord::Migration
|
3
|
+
def self.up
|
4
|
+
create_table :mustache_render_folders do |t|
|
5
|
+
t.string :name, :default => '' # 文件夹的名称
|
6
|
+
|
7
|
+
t.string :full_path, :default => '' # 全路径
|
8
|
+
|
9
|
+
###### for nested_ful #####################
|
10
|
+
t.integer :parent_id # 父节点的id
|
11
|
+
t.integer :left_id
|
12
|
+
t.integer :right_id
|
13
|
+
t.integer :depth # 深度
|
14
|
+
t.integer :children_count, :default => 0
|
15
|
+
###########################################
|
16
|
+
|
17
|
+
t.text :note # 备注
|
18
|
+
|
19
|
+
t.timestamps
|
20
|
+
end
|
21
|
+
|
22
|
+
create_table :mustache_render_templates do |t|
|
23
|
+
t.integer :folder_id # 文件夹的ID
|
24
|
+
t.string :name # 模板的名称
|
25
|
+
t.text :content # 代码
|
26
|
+
|
27
|
+
t.text :note # 备注
|
28
|
+
t.timestamps
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.down
|
33
|
+
drop_table :mustache_render_folders
|
34
|
+
drop_table :mustache_render_templates
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
data/lib/mustache_render.rb
CHANGED
@@ -1,2 +1,28 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'mustache_render/config'
|
3
|
+
require 'mustache_render/mustache'
|
4
|
+
|
1
5
|
module MustacheRender
|
6
|
+
module Manager
|
7
|
+
autoload :BaseController, 'mustache_render/controllers/mustache_render/manager/base_controller'
|
8
|
+
autoload :FoldersController, 'mustache_render/controllers/mustache_render/manager/folders_controller'
|
9
|
+
autoload :TemplatesController, 'mustache_render/controllers/mustache_render/manager/templates_controller'
|
10
|
+
end
|
11
|
+
|
12
|
+
module CoreExt
|
13
|
+
autoload :BaseControllerExt, 'mustache_render/core_ext/base_controller_ext'
|
14
|
+
end
|
15
|
+
|
16
|
+
module Controllers
|
17
|
+
end
|
18
|
+
|
19
|
+
module Models
|
20
|
+
autoload :MustacheRenderFolderMixin, 'mustache_render/models/mustache_render_folder_mixin'
|
21
|
+
autoload :MustacheRenderTemplateMixin, 'mustache_render/models/mustache_render_template_mixin'
|
22
|
+
end
|
2
23
|
end
|
24
|
+
|
25
|
+
if defined?(::ActionController::Base)
|
26
|
+
::ActionController::Base.send :include, ::MustacheRender::CoreExt::BaseControllerExt
|
27
|
+
end
|
28
|
+
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module MustacheRender
|
3
|
+
class << self
|
4
|
+
attr_accessor :config
|
5
|
+
|
6
|
+
def configure
|
7
|
+
yield self.config ||= Config.new
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class Config
|
12
|
+
def initialize
|
13
|
+
end
|
14
|
+
|
15
|
+
#
|
16
|
+
# lib 的基本路径
|
17
|
+
#
|
18
|
+
def lib_base_path
|
19
|
+
File.dirname(__FILE__)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module MustacheRender::Manager
|
2
|
+
class BaseController < ::ApplicationController
|
3
|
+
before_filter :set_mustache_manager_view_path
|
4
|
+
|
5
|
+
layout 'mustache_render/manager/base'
|
6
|
+
|
7
|
+
protected
|
8
|
+
|
9
|
+
#
|
10
|
+
# 设置mustache的管理器的view path
|
11
|
+
#
|
12
|
+
def set_mustache_manager_view_path
|
13
|
+
prepend_view_path "#{::MustacheRender.config.lib_base_path}/views"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module MustacheRender::Manager
|
2
|
+
class FoldersController < BaseController
|
3
|
+
def index
|
4
|
+
|
5
|
+
end
|
6
|
+
|
7
|
+
def show
|
8
|
+
@mustache_render_folder = MustacheRenderFolder.find params[:id]
|
9
|
+
@mustache_render_templates = @mustache_render_folder.templates
|
10
|
+
end
|
11
|
+
|
12
|
+
def new
|
13
|
+
@mustache_render_folder = MustacheRenderFolder.new(:parent_id => params[:parent_id])
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
def edit
|
18
|
+
@mustache_render_folder = MustacheRenderFolder.find params[:id]
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
def create
|
23
|
+
@mustache_render_folder = MustacheRenderFolder.new(params[:mustache_render_folder])
|
24
|
+
|
25
|
+
if @mustache_render_folder.save
|
26
|
+
redirect_to mustache_render_manager_folder_url(@mustache_render_folder)
|
27
|
+
else
|
28
|
+
render :new
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def update
|
33
|
+
@mustache_render_folder = MustacheRenderFolder.find params[:id]
|
34
|
+
|
35
|
+
if @mustache_render_folder.update_attributes(params[:mustache_render_folder])
|
36
|
+
redirect_to mustache_render_manager_folder_url(@mustache_render_folder)
|
37
|
+
else
|
38
|
+
render :edit
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def destroy
|
43
|
+
# TODO: 是否增加删除功能
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module MustacheRender::Manager
|
2
|
+
class TemplatesController < BaseController
|
3
|
+
before_filter :load_folder_record
|
4
|
+
|
5
|
+
def show
|
6
|
+
@mustache_render_template = MustacheRenderTemplate.find params[:id]
|
7
|
+
end
|
8
|
+
|
9
|
+
def new
|
10
|
+
@mustache_render_template = MustacheRenderTemplate.new(:folder_id => params[:folder_id])
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
def edit
|
15
|
+
@mustache_render_template = MustacheRenderTemplate.find params[:id]
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
def create
|
20
|
+
@mustache_render_template = MustacheRenderTemplate.new(params[:mustache_render_template])
|
21
|
+
|
22
|
+
if @mustache_render_template.save
|
23
|
+
redirect_to mustache_render_manager_folder_template_url(
|
24
|
+
:folder_id => @mustache_render_template.folder_id, :id => @mustache_render_template
|
25
|
+
)
|
26
|
+
else
|
27
|
+
render :new
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def update
|
32
|
+
@mustache_render_template = MustacheRenderTemplate.find params[:id]
|
33
|
+
|
34
|
+
if @mustache_render_template.update_attributes(params[:mustache_render_template])
|
35
|
+
redirect_to mustache_render_manager_folder_template_url(
|
36
|
+
:folder_id => @mustache_render_template.folder_id, :id => @mustache_render_template
|
37
|
+
)
|
38
|
+
else
|
39
|
+
render :edit
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def destroy
|
44
|
+
# TODO: 是否增加删除功能
|
45
|
+
end
|
46
|
+
|
47
|
+
protected
|
48
|
+
|
49
|
+
def load_folder_record
|
50
|
+
@mustache_render_folder = MustacheRenderFolder.find params[:folder_id]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module MustacheRender::CoreExt
|
3
|
+
module BaseControllerExt
|
4
|
+
def self.included(base)
|
5
|
+
base.class_eval do
|
6
|
+
helper_method :mustache_db_render
|
7
|
+
|
8
|
+
extend ClassMethods
|
9
|
+
include InstanceMethods
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
module ClassMethods
|
14
|
+
# def acts_as_mustache_renderer
|
15
|
+
# helper_method :mustache_render
|
16
|
+
# include InstanceMethods
|
17
|
+
# end
|
18
|
+
end
|
19
|
+
|
20
|
+
module InstanceMethods
|
21
|
+
# def mustache_render(mustache_template='', mustache={})
|
22
|
+
# render :text => ::Mustache.render(mustache_template, mustache)
|
23
|
+
# end
|
24
|
+
|
25
|
+
#
|
26
|
+
# 使用数据库中的模板进行渲染
|
27
|
+
# - template_path: 模板的路径
|
28
|
+
#
|
29
|
+
def mustache_db_render(template_path=nil, mustache={})
|
30
|
+
# result = ::Mustache.render(template_path, mustache)
|
31
|
+
result = ::MustacheRender::Mustache.render_file(template_path, mustache)
|
32
|
+
|
33
|
+
if self.is_a?(ActionController::Base)
|
34
|
+
render :text => result
|
35
|
+
else
|
36
|
+
result
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module MustacheRender::Models
|
3
|
+
module MustacheRenderFolderMixin
|
4
|
+
def self.included(base)
|
5
|
+
base.class_eval do
|
6
|
+
table_name = 'mustache_render_folders'
|
7
|
+
|
8
|
+
has_many :templates, :class_name => 'MustacheRenderTemplate', :foreign_key => 'folder_id'
|
9
|
+
|
10
|
+
attr_accessible :parent_id, :name, :note
|
11
|
+
|
12
|
+
acts_as_nested_set(
|
13
|
+
:parent_column => 'parent_id',
|
14
|
+
:left_column => 'left_id',
|
15
|
+
:right_column => 'right_id',
|
16
|
+
:depth_column => 'depth',
|
17
|
+
:dependent => :delete_all, # or :destroy
|
18
|
+
:polymorphic => false,
|
19
|
+
:counter_cache => 'children_count'
|
20
|
+
# :before_add => :do_before_add_stuff,
|
21
|
+
# :after_add => :do_after_add_stuff,
|
22
|
+
# :before_remove => :do_before_remove_stuff,
|
23
|
+
# :after_remove => :do_after_remove_stuff
|
24
|
+
)
|
25
|
+
|
26
|
+
validate :impl_validate_full_path
|
27
|
+
validates_presence_of :name
|
28
|
+
validates_uniqueness_of :full_path
|
29
|
+
after_save :impl_update_children_full_path
|
30
|
+
|
31
|
+
extend ClassMethods
|
32
|
+
include InstanceMethods
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
module ClassMethods
|
37
|
+
#
|
38
|
+
# 相关的parents
|
39
|
+
#
|
40
|
+
def associate_parents(objects)
|
41
|
+
if objects.all?{|o| o.respond_to?(:association)}
|
42
|
+
id_indexed = objects.index_by(&:id)
|
43
|
+
objects.each do |object|
|
44
|
+
if !(association = object.association(:parent)).loaded? && (parent = id_indexed[object.parent_id])
|
45
|
+
association.target = parent
|
46
|
+
association.set_inverse_instance(parent)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
else
|
50
|
+
objects
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def nested_set_options(class_or_item=nil, mover = nil)
|
55
|
+
class_or_item ||= self
|
56
|
+
|
57
|
+
if class_or_item.is_a? Array
|
58
|
+
items = class_or_item.reject { |e| !e.root? }
|
59
|
+
else
|
60
|
+
class_or_item = class_or_item.roots if class_or_item.respond_to?(:scoped)
|
61
|
+
items = Array(class_or_item)
|
62
|
+
end
|
63
|
+
result = []
|
64
|
+
items.each do |root|
|
65
|
+
result += root.class.associate_parents(root.self_and_descendants).map do |i|
|
66
|
+
if mover.nil? || mover.new_record? || mover.move_possible?(i)
|
67
|
+
[yield(i), i.id]
|
68
|
+
end
|
69
|
+
end.compact
|
70
|
+
end
|
71
|
+
result
|
72
|
+
end
|
73
|
+
|
74
|
+
def nested_set_select_options(class_or_item=nil, mover=nil, options={})
|
75
|
+
result = []
|
76
|
+
|
77
|
+
result << ['- - 请选择 - -', nil] if options[:include_blank]
|
78
|
+
|
79
|
+
result += nested_set_options(class_or_item, mover) do |item|
|
80
|
+
"#{'- ' * item.level}#{item.name}"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
module InstanceMethods
|
86
|
+
|
87
|
+
protected
|
88
|
+
def impl_generate_full_path
|
89
|
+
tmp_parent = self.class.find_by_id self.parent_id
|
90
|
+
|
91
|
+
if tmp_parent
|
92
|
+
"/#{tmp_parent.self_and_ancestors.map(&:name).join('/')}/#{self.name}"
|
93
|
+
else
|
94
|
+
"/#{self.name}"
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def impl_validate_full_path
|
99
|
+
self.full_path = impl_generate_full_path
|
100
|
+
end
|
101
|
+
|
102
|
+
def impl_update_children_full_path
|
103
|
+
self.children.each do |child|
|
104
|
+
child.send :impl_validate_full_path
|
105
|
+
child.save
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
private
|
110
|
+
|
111
|
+
# def do_before_add_stuff(child_node)
|
112
|
+
# # do whatever with the child
|
113
|
+
# end
|
114
|
+
#
|
115
|
+
# def do_after_add_stuff(child_node)
|
116
|
+
# # do whatever with the child
|
117
|
+
# end
|
118
|
+
#
|
119
|
+
# def do_before_remove_stuff(child_node)
|
120
|
+
# # do whatever with the child
|
121
|
+
# end
|
122
|
+
#
|
123
|
+
# def do_after_remove_stuff(child_node)
|
124
|
+
# # do whatever with the child
|
125
|
+
# end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|