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.
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