mustache_render 0.0.1 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|