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.
Files changed (32) hide show
  1. data/MIT-LICENSE +1 -1
  2. data/README.rdoc +20 -1
  3. data/lib/generators/mustache_render/migration/install_generator.rb +53 -0
  4. data/lib/generators/mustache_render/migration/templates/active_record/migration.rb +37 -0
  5. data/lib/generators/mustache_render/migration/templates/models/active_record/mustache_render_folder.rb +6 -0
  6. data/lib/generators/mustache_render/migration/templates/models/active_record/mustache_render_template.rb +6 -0
  7. data/lib/mustache_render.rb +26 -0
  8. data/lib/mustache_render/config.rb +22 -0
  9. data/lib/mustache_render/controllers/mustache_render/manager/base_controller.rb +16 -0
  10. data/lib/mustache_render/controllers/mustache_render/manager/folders_controller.rb +46 -0
  11. data/lib/mustache_render/controllers/mustache_render/manager/templates_controller.rb +53 -0
  12. data/lib/mustache_render/core_ext/base_controller_ext.rb +41 -0
  13. data/lib/mustache_render/models/mustache_render_folder_mixin.rb +128 -0
  14. data/lib/mustache_render/models/mustache_render_template_mixin.rb +44 -0
  15. data/lib/mustache_render/mustache.rb +314 -0
  16. data/lib/mustache_render/mustache/context.rb +144 -0
  17. data/lib/mustache_render/mustache/generator.rb +197 -0
  18. data/lib/mustache_render/mustache/parser.rb +265 -0
  19. data/lib/mustache_render/mustache/settings.rb +234 -0
  20. data/lib/mustache_render/mustache/template.rb +60 -0
  21. data/lib/mustache_render/version.rb +8 -1
  22. data/lib/mustache_render/views/layouts/mustache_render/manager/base.html.erb +14 -0
  23. data/lib/mustache_render/views/mustache_render/manager/folders/_form.html.erb +31 -0
  24. data/lib/mustache_render/views/mustache_render/manager/folders/edit.html.erb +11 -0
  25. data/lib/mustache_render/views/mustache_render/manager/folders/index.html.erb +9 -0
  26. data/lib/mustache_render/views/mustache_render/manager/folders/new.html.erb +8 -0
  27. data/lib/mustache_render/views/mustache_render/manager/folders/show.html.erb +44 -0
  28. data/lib/mustache_render/views/mustache_render/manager/templates/_form.html.erb +36 -0
  29. data/lib/mustache_render/views/mustache_render/manager/templates/edit.html.erb +15 -0
  30. data/lib/mustache_render/views/mustache_render/manager/templates/new.html.erb +12 -0
  31. data/lib/mustache_render/views/mustache_render/manager/templates/show.html.erb +33 -0
  32. metadata +106 -30
@@ -1,4 +1,4 @@
1
- Copyright 2013 YOURNAME
1
+ Copyright 2013 Happy
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
@@ -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
+
@@ -0,0 +1,6 @@
1
+ # -*- encoding : utf-8 -*-
2
+ class MustacheRenderFolder < ActiveRecord::Base
3
+ include ::MustacheRender::Models::MustacheRenderFolderMixin
4
+
5
+ end
6
+
@@ -0,0 +1,6 @@
1
+ # -*- encoding : utf-8 -*-
2
+ class MustacheRenderTemplate < ActiveRecord::Base
3
+ include ::MustacheRender::Models::MustacheRenderTemplateMixin
4
+
5
+ end
6
+
@@ -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