type: 'element',\r
args: {\r
parent_model_name: 'panel',\r
+ boost: {\r
+ speech_balloon_template: {\r
+ },\r
+ },\r
},\r
}, \r
balloon: {\r
type: 'element',\r
args: {\r
parent_model_name: 'speech_balloon',\r
+ boost: {\r
+ speech_balloon_template: {\r
+ },\r
+ },\r
},\r
},\r
speech: {\r
type: 'element',\r
args: {\r
parent_model_name: 'speech_balloon',\r
+ boost: {\r
+ writing_format: {\r
+ },\r
+ speech_balloon_template: {\r
+ },\r
+ },\r
},\r
},\r
ground_picture: {\r
license_group: {\r
},\r
license: {\r
+ type: 'leaf',\r
+ args: {\r
+ parent_model_name: 'license_group',\r
+ boost: {\r
+ license_group: {\r
+ },\r
+ },\r
+ },\r
},\r
author: {\r
},\r
},\r
},\r
speech_balloon: {\r
- extend_column_name: 'classname', \r
associations: {\r
belongs_to: {\r
panel: {\r
},\r
},\r
speech_balloon_template: {\r
- extend_column_name: 'classname', \r
associations: {\r
belongs_to: {\r
system_picture: {\r
},\r
},\r
writing_format: {\r
- extend_column_name: 'classname', \r
associations: {\r
belongs_to: {\r
system_picture: {\r
},\r
},\r
license_group: {\r
- extend_column_name: 'classname', \r
associations: {\r
belongs_to: {\r
},\r
# TestSpeechBalloon: 'test_speech_balloon',\r
},\r
},\r
- speech_balloons: {\r
- resource_items: {\r
- CircleSpeechBalloon: 'circle_speech_balloon',\r
- PlainSpeechBalloon: 'plain_speech_balloon',\r
- SquareSpeechBalloon: 'square_speech_balloon',\r
- # TestSpeechBalloon: 'test_speech_balloon',\r
- },\r
- },\r
writing_formats: {\r
has_route: 0,\r
resource_items: {\r
r = {
:author => {}
}
- self.child_models('panel').each do |child_model|
+ self.child_models.each do |child_model|
r.merge!(child_model.show_opt_for_panel)
end
{:include => r}
self.speech_balloon_template.symbol_option
end
- def boost
- self.extend self.speech_balloon_template.engine_speech_balloon_module
- if self.balloon
- else
- self.new_balloon = self.build_balloon
- self.new_speech = self.build_speech
- end
- self.balloon.extend self.speech_balloon_template.engine_balloon_module
- self.speech.extend self.speech_balloon_template.engine_speech_module
- return false
- self.balloon.new_parent = self
- self.speech.new_parent = self
- self.extend_speech_balloon = if self.settings.blank?
- {}
- else
- JSON.parse(self.settings)
- end
- self.balloon.extend_balloon = if self.balloon.settings.blank?
- {}
- else
- JSON.parse(self.get_balloon.settings)
- end
- self.speech.extend_speech = if self.speech.settings.blank?
- {}
- else
- JSON.parse(self.get_speech.settings)
- end
- end
-
- def self.fold_extend_settings params
- speech_balloon_settings = params[:speech_balloon][:settings]
- if speech_balloon_settings.is_a?(Hash)
- params[:speech_balloon][:settings] = speech_balloon_settings.to_json
- end
- balloon_settings = params[:speech_balloon][:balloon_attributes][:settings]
- if balloon_settings.is_a?(Hash)
- params[:speech_balloon][:balloon_attributes][:settings] = balloon_settings.to_json
- end
- speech_settings = params[:speech_balloon][:speech_attributes][:settings]
- if speech_settings.is_a?(Hash)
- params[:speech_balloon][:speech_attributes][:settings] = speech_settings.to_json
- end
- end
-
def tag_element_type
'speech_balloon'
end
r
end
- def parsed_settings
- @template_settings ||= JSON.parse(self.settings)
- end
-
- def my_engine_resource
- Manifest.manifest.system_resources.engine_resources['speech_balloon_templates']
- end
-
- def engine_name
- self.my_engine_resource.resource_items[self.classname]
- end
-
- def enable?
- self.my_engine_resource.resource_items.include? self.classname
- end
-
- def engine_module_name
- self.engine_name.camelize
- end
-
- def engine
- Object.const_get self.engine_module_name
- end
-
- def engine_speech_balloon_model
- engine.const_get 'SpeechBalloon'
- end
-
- def engine_speech_balloon_module
- engine.const_get 'SpeechBalloonModule'
- end
-
- def engine_extend_module
- engine.extend_module
- end
-
- def engine_balloon_model
- engine.const_get 'Balloon'
- end
-
- def engine_balloon_module
- engine.const_get 'BalloonModule'
- end
-
- def engine_speech_model
- engine.const_get 'Speech'
- end
-
- def engine_speech_module
- engine.const_get 'SpeechModule'
- end
-
def self.import filename
SpeechBalloonTemplate.import_file(filename) {|name, attr| SpeechBalloonTemplate.store(name, attr)}
end
Pettanr::Application.configure do
ActiveSupport::Dependencies.autoload_paths << File::join( Rails.root, 'lib')
+ ActiveSupport::Dependencies.explicitly_unloadable_constants << 'Peta'
ActiveSupport::Dependencies.explicitly_unloadable_constants << 'Editor'
ActiveSupport::Dependencies.explicitly_unloadable_constants << 'ManifestBase'
ActiveSupport::Dependencies.explicitly_unloadable_constants << 'Manifest'
--- /dev/null
+class FixExtendSystem < ActiveRecord::Migration
+ def up
+ rename_column :speech_balloons, :classname, :speech_balloon_template_classname
+ rename_column :speech_balloons, :settings, :speech_balloon_template_settings
+ add_column :balloons, :speech_balloon_template_classname, :string, :null => false, :limit => 50
+ rename_column :balloons, :settings, :speech_balloon_template_settings
+ add_column :speeches, :speech_balloon_template_classname, :string, :null => false, :limit => 50
+ rename_column :speeches, :settings, :speech_balloon_template_settings
+ add_column :speeches, :writing_format_classname, :string, :null => false, :limit => 50
+ rename_column :speeches, :settings, :writing_format_settings
+ add_column :licenses, :license_group_classname, :string, :null => false, :limit => 50
+ rename_column :licenses, :settings, :license_group_settings
+ end
+
+ def down
+ end
+end
--- /dev/null
+class FixExtendSystemData < ActiveRecord::Migration
+ def up
+ Balloon.find(:all).each do |balloon|
+ sbt = balloon.speech_balloon.speech_balloon_template
+ if balloon.speech_balloon_template_classname.blank?
+ balloon.speech_balloon_template_classname = sbt.classname
+ balloon.save!
+ end
+ end
+ Speech.find(:all).each do |speech|
+ sbt = speech.speech_balloon.speech_balloon_template
+ if speech.speech_balloon_template_classname.blank?
+ speech.speech_balloon_template_classname = sbt.classname
+ speech.save!
+ end
+ wf = speech.writing_format
+ if speech.writing_format_classname.blank?
+ speech.writing_format_classname = wf.classname
+ speech.save!
+ end
+ end
+ License.find(:all).each do |license|
+ lg = license.license_group
+ if license.license_group_classname.blank?
+ license.license_group_classname = lg.classname
+ license.save!
+ end
+ end
+ end
+
+ def down
+ end
+end
+ManifestBase.require_modules "manifest/item/",
+ %w|boost|
+
module Manifest
module ItemModule
class BasePeta < ManifestBase::TypeNameArgs
+ attr :boost
+
def set_default
super
+ @args['boost'] ||= {}
end
def init
super
+ @boost = ManifestBase.load_name_values self, @args, 'boost', Boost
+ end
+
+ def element?
+ @parent_model_name != nil
+ end
+
+ def boosts item, level
+ @boost.each do |name, manifest|
+ next unless manifest.level == level
+ Boost::ItemBooster.new(manifest, item).boost
+ end
+ end
+
+ def supply_defaults item
+ @boost.each do |name, manifest|
+ manifest.supply_default item
+ end
+ end
+
+ def model
+ ::Manifest.manifest.models[@name]
end
end
-
end
end
--- /dev/null
+module Manifest
+ module ItemModule
+ class Boost < ManifestBase::NameValues
+ attr :level, :extend_column_name, :settings_column_name,
+ :foreign_key, :setter_method_name, :getter_method_name
+
+ def set_default
+ super
+ @values['level'] ||= 'post'
+ @values['extend_column_name'] ||= @name + '_classname'
+ @values['settings_column_name'] ||= @name + '_settings'
+ @values['foreign_key'] ||= @name + '_id'
+ @values['setter_method_name'] ||= @name + '_extend='
+ @values['getter_method_name'] ||= @name + '_extend'
+ end
+
+ def init
+ super
+ @level = @values['level']
+ @extend_column_name = @values['extend_column_name']
+ @settings_column_name = @values['settings_column_name']
+ @foreign_key = @values['foreign_key']
+ @setter_method_name = @values['setter_method_name']
+ @getter_method_name = @values['getter_method_name']
+ end
+
+ def extend_model_name
+ @parent.model.singular
+ end
+
+ def extend_module_name
+ @parent.model.singular + 'Module'
+ end
+
+ class ItemBooster
+ def initialize manifest, item
+ @manifest = manifest
+ @item = item
+ end
+
+ # get engine's name
+ def class_name
+ @item.attributes[@manifest.extend_column_name]
+ end
+
+ def settings
+ @item.attributes[@manifest.settings_column_name]
+ end
+
+ # name space for engine
+ def engine_module
+ Object.const_get self.class_name(@item)
+ end
+
+ # extend module in engine
+ # ex) CircleSpeechBalloon::SpeechBalloonModule
+ def engine_extend_module
+ self.engine_module.const_get @manifest.extend_module_name
+ end
+
+ # extend settings data model in engine
+ def engine_extend_model
+ self.engine_module.const_get @manifest.extend_module_name
+ end
+
+ # get system resource instance
+ def resource
+ r = @item.__send__ @manifest.name
+ raise 'resource not found' unless r
+ r
+ end
+
+ def parsed_settings
+ if self.settings.blank?
+ {}
+ else
+ JSON.parse(self.settings)
+ end
+ end
+
+ def boost
+ # no check
+ # return false unless self.resource.enable?
+ @item.extend self.engine_extend_module
+ @item.__send__ @manifest.setter_method_name, self.parsed_settings
+ end
+
+ end
+
+ def supply_default item
+ self.engine_model(item).engine_extend_module.supply_default item, self
+ end
+
+ end
+ end
+end
class Model < ManifestBase::Base
include ModelModule
- attr :attributes, :associations, :list, :extend_column_name
+ attr :attributes, :associations, :list
def set_default
super
@json['attributes'] ||= {}
@json['associations'] ||= {}
@json['list'] ||= {}
- @json['extend_column_name'] ||= 'classname'
- @json['peta'] ||= {}
@json['attributes']['id'] = {
'type' => 'number',
'primary_key' => 1,
super
@attributes = ManifestBase.load_name_values self, @json, 'attributes', Attribute
@associations = ManifestBase.load_value self, @json, 'associations', Association
- @extend_column_name = @json['extend_column_name']
@list = ManifestBase.load_value self, @json, 'list', List
end
false
end
- def child_model_manifests tree_name
+ def child_model_manifests
r = []
- ::Manifest.manifest.models.each {|child_model_name, child_model_manifest|
- next unless child_model_manifest.tree[tree_name]
- next unless child_model_manifest.tree[tree_name].parent_model_name == @model_name
- r << child_model_manifest
+ ::Manifest.manifest.items.each {|peta_name, peta_manifest|
+ next unless peta_manifest.element?
+ next unless peta_manifest.parent_model_name == @model_name
+ r << peta_manifest.model
}
r
end
- def child_models tree_name
- self.child_model_manifests(tree_name).map {|child_model_manifest|
+ def child_models
+ self.child_model_manifests.map {|child_model_manifest|
child_model_manifest.classify
}
end
- def child_element_names tree_name
- self.child_models(tree_name).map {|child_model|
+ def child_element_names
+ self.child_models.map {|child_model|
self.associations.child_element_name(child_model)
}
end
self.__send__ self.class.my_manifest.associations.child_element_name(leaf_model)
end
define_method("leafs_items") do
- self.class.child_models(self.class.leaf_tree_name).map {|child_model|
+ self.class.child_models.map {|child_model|
self.leaf_items child_model
}.flatten
end
# Class Methods
+ # Instance Methods
+
+ def boosts level
+ super
+ self.leafs_items.each do |item|
+ item.boosts level
+ end
+ end
+
end
end
end
def self._owner_model
- t = self.my_manifest.tree['owner']
- return nil unless t
- t.parent_model
+ self.parent_model
end
def self._owner_column
end
def self.root_model
- if self.parent_model
+ if self.parent_model and self.parent_model.element?
self.parent_model.root_model
else
self
self.__send__ self.class.my_manifest.associations.child_element_name(element_model)
end
define_method("elements_items") do
- self.class.element_models.map {|element_model|
+ self.class.child_models.map {|element_model|
self.element_items element_model
}.flatten
end
# Class Methods
# Instance Methods
+
+ def boosts level
+ super
+ self.elements_items.each do |item|
+ item.boosts level
+ end
+ end
+
def post_attributes opt = {}
attr = self.copy_attributes
hash = {}
- self.class.element_models.each do |element_model|
+ self.class.child_models.each do |element_model|
name = self.class.my_manifest.associations.child_element_name(element_model) + '_attributes'
hash[name] ||= {}
self.element_items(element_model).each do |element|
self.my_manifest.valid_encode_columns
end
- def self._child_models
- self.my_manifest.child_models tree_name
- end
-
- def self._extend_column_name
- self.my_manifest.extend_column_name
- end
-
def self.load_manifest
return nil unless self.my_manifest
r = self._valid_encode_columns
define_singleton_method("valid_encode_columns") do
r
end
- r = self._child_models
+ r = self.my_manifest.child_models
define_singleton_method("child_models") do
r
end
+ r = self.my_manifest.child_element_names
define_singleton_method("child_element_names") do
- self.my_manifest.child_element_names tree_name
- end
- n = self._extend_column_name
- define_singleton_method("extend_column_name") do
- n
+ r
end
# Instance Methods
end
opt = {}
opt.merge!(self.show_opt)
item = self.find(item_id, opt)
- self.boost if self.boost_level_is_read?
+ item.boosts 'show'
raise ActiveRecord::Forbidden unless item.visible?(operators)
item
end
self.class.table_name
end
- def boost_level_is_read?
- self.class.my_peta.level == 'show'
- end
-
- def extend_column_name
- self.class.extend_column_name
- end
-
def path_name with_engine = false
self.class.path_name(with_engine)
end
end
end
- def engine
- Object.const_get self.attributes[self.extend_column_name]
- end
-
- def my_engine_resource
- Manifest.manifest.system_resources.engine_resources[self.table_name]
- end
-
- def engine?
- return false unless self.my_engine_resource
- self.my_engine_resource.resource_items.include? self.attributes[self.extend_column_name]
- end
-
- def boost
- return false unless self.engine?
- self.engine.boost self
- @boosted = true
- end
-
- def boosted?
- @boosted
+ def boosts level
+ self.class.my_peta.boosts self, level
end
def supply_default
- self.my_peta.boost.each do |name, manifest|
- manifest.engine_model.engine_extend_module.supply_default
- end
+ self.class.my_peta.supply_defaults self
end
def overwrite
}
end
+ def my_engine_resource
+ Manifest.manifest.system_resources.engine_resources[self.item_name]
+ end
+
+ def enable?
+ return false unless er = self.my_engine_resource
+ er.resource_items.include? self.classname
+ end
+
end
end
"speech_balloon": {\r
"type": "element",\r
"args": {\r
- "parent_model_name": "panel"\r
+ "parent_model_name": "panel",\r
+ "boost": {\r
+ "speech_balloon_template": {}\r
+ }\r
}\r
},\r
"balloon": {\r
"type": "element",\r
"args": {\r
- "parent_model_name": "speech_balloon"\r
+ "parent_model_name": "speech_balloon",\r
+ "boost": {\r
+ "speech_balloon_template": {}\r
+ }\r
}\r
},\r
"speech": {\r
"type": "element",\r
"args": {\r
- "parent_model_name": "speech_balloon"\r
+ "parent_model_name": "speech_balloon",\r
+ "boost": {\r
+ "writing_format": {},\r
+ "speech_balloon_template": {}\r
+ }\r
}\r
},\r
"ground_picture": {\r
"speech_balloon_template": {},\r
"writing_format": {},\r
"license_group": {},\r
- "license": {},\r
+ "license": {\r
+ "type": "leaf",\r
+ "args": {\r
+ "parent_model_name": "license_group",\r
+ "boost": {\r
+ "license_group": {}\r
+ }\r
+ }\r
+ },\r
"author": {},\r
"artist": {},\r
"system_picture": {}\r
"number": true\r
}\r
}\r
- },\r
- "tree": {\r
- "scroll_owner": "author"\r
}\r
},\r
"scroll_panel": {\r
"number": true\r
}\r
}\r
- },\r
- "tree": {\r
- "owner": "scroll",\r
- "scroll_owner": "scroll"\r
}\r
},\r
"comic": {\r
"number": true\r
}\r
}\r
- },\r
- "tree": {\r
- "comic_owner": "author"\r
}\r
},\r
"story": {\r
}\r
}\r
}\r
- },\r
- "tree": {\r
- "owner": "comic",\r
- "comic_owner": "comic"\r
}\r
},\r
"story_sheet": {\r
"number": true\r
}\r
}\r
- },\r
- "tree": {\r
- "owner": "story",\r
- "comic_owner": "story"\r
}\r
},\r
"sheet": {\r
"number": true\r
}\r
}\r
- },\r
- "tree": {\r
- "sheet_owner": "author"\r
}\r
},\r
"sheet_panel": {\r
"number": true\r
}\r
}\r
- },\r
- "tree": {\r
- "owner": "sheet",\r
- "sheet_owner": "sheet"\r
}\r
},\r
"panel": {\r
"number": true\r
}\r
}\r
- },\r
- "tree": {\r
- "panel_owner": "author"\r
}\r
},\r
"panel_picture": {\r
"min": 0\r
}\r
}\r
- },\r
- "tree": {\r
- "owner": "panel",\r
- "panel_owner": "panel",\r
- "panel": "panel"\r
}\r
},\r
"speech_balloon": {\r
"type": "text",\r
"rules": {}\r
}\r
- },\r
- "tree": {\r
- "owner": "panel",\r
- "panel_owner": "panel",\r
- "panel": "panel"\r
}\r
},\r
"balloon": {\r
"type": "text",\r
"rules": {}\r
}\r
- },\r
- "tree": {\r
- "owner": "speech_balloon",\r
- "panel_owner": "speech_balloon",\r
- "panel": "speech_balloon"\r
}\r
},\r
"speech": {\r
"type": "text",\r
"rules": {}\r
}\r
- },\r
- "tree": {\r
- "owner": "speech_balloon",\r
- "panel_owner": "speech_balloon",\r
- "panel": "speech_balloon"\r
}\r
},\r
"ground_picture": {\r
"min": 0\r
}\r
}\r
- },\r
- "tree": {\r
- "owner": "panel",\r
- "panel_owner": "panel",\r
- "panel": "panel"\r
}\r
},\r
"ground_color": {\r
"min": 0\r
}\r
}\r
- },\r
- "tree": {\r
- "owner": "panel",\r
- "panel_owner": "panel",\r
- "panel": "panel"\r
}\r
},\r
"original_picture": {\r
"SquareSpeechBalloon": "square_speech_balloon"\r
}\r
},\r
- "speech_balloons": {\r
- "resource_items": {\r
- "CircleSpeechBalloon": "circle_speech_balloon",\r
- "PlainSpeechBalloon": "plain_speech_balloon",\r
- "SquareSpeechBalloon": "square_speech_balloon"\r
- }\r
- },\r
"writing_formats": {\r
"has_route": 0,\r
"resource_items": {\r