blue_pages 0.1.0 → 0.2.1
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/app/controllers/blue_pages/pages_controller.rb +13 -1
- data/app/models/page.rb +87 -0
- data/config/routes.rb +1 -1
- data/lib/blue_pages.rb +4 -1
- data/lib/blue_pages/localized_keys.rb +119 -0
- data/lib/permalink.rb +20 -0
- metadata +60 -61
- data/app/models/blue_pages/page.rb +0 -45
@@ -5,7 +5,7 @@ class BluePages::PagesController < ::ApplicationController
|
|
5
5
|
respond_to :html
|
6
6
|
|
7
7
|
def show
|
8
|
-
@page =
|
8
|
+
@page = ::Page.where(:path => params[:path]).first
|
9
9
|
if @page
|
10
10
|
render_page
|
11
11
|
else
|
@@ -16,9 +16,21 @@ class BluePages::PagesController < ::ApplicationController
|
|
16
16
|
protected
|
17
17
|
|
18
18
|
def render_page
|
19
|
+
if BluePages.layout.present?
|
20
|
+
render_text
|
21
|
+
else
|
22
|
+
render_app_page
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def render_app_page
|
19
27
|
render 'pages/show'
|
20
28
|
end
|
21
29
|
|
30
|
+
def render_text
|
31
|
+
render :text => @page.to_html, :layout => BluePages.layout
|
32
|
+
end
|
33
|
+
|
22
34
|
def render_404
|
23
35
|
render :file => File.join(Rails.root, "/public/404.html"),
|
24
36
|
:status => :not_found,
|
data/app/models/page.rb
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'mongoid/tree'
|
4
|
+
require 'bluecloth'
|
5
|
+
require 'redcloth'
|
6
|
+
|
7
|
+
class Page
|
8
|
+
|
9
|
+
include Mongoid::Document
|
10
|
+
include Mongoid::Timestamps
|
11
|
+
include Mongoid::Tree
|
12
|
+
include LocalizedKeys
|
13
|
+
|
14
|
+
(BluePages.model_includes || []).each do |mod|
|
15
|
+
include mod
|
16
|
+
end
|
17
|
+
|
18
|
+
store_in :blue_pages
|
19
|
+
|
20
|
+
i18n_field :title
|
21
|
+
i18n_field :content
|
22
|
+
field :permalink
|
23
|
+
field :path
|
24
|
+
field :meta_data, :type => Hash
|
25
|
+
field :published, :type => Boolean, :default => true
|
26
|
+
field :custom_permalink, :type => Boolean, :default => false
|
27
|
+
field :filter, :default => 'none'
|
28
|
+
|
29
|
+
validates_presence_of :title
|
30
|
+
validates_uniqueness_of :title
|
31
|
+
validates_inclusion_of :filter, :in => %w( none markdown )
|
32
|
+
|
33
|
+
scope :published, where(:published => true)
|
34
|
+
scope :unpublished, where(:published => false)
|
35
|
+
|
36
|
+
before_save :check_permalink_presence
|
37
|
+
after_rearrange :rebuild_path
|
38
|
+
|
39
|
+
# Sets title and generates permalink if custom permalink is disabled.
|
40
|
+
def title=(new_title)
|
41
|
+
write_attribute(:permalink, Permalink.from(new_title)) unless self.custom_permalink?
|
42
|
+
write_attribute(:title, new_title)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Sets permalink only if custom permalink is enabled.
|
46
|
+
def permalink=(permalink)
|
47
|
+
write_attribute(:permalink, permalink) if self.custom_permalink?
|
48
|
+
end
|
49
|
+
|
50
|
+
def to_s
|
51
|
+
title
|
52
|
+
end
|
53
|
+
|
54
|
+
def preferred_content
|
55
|
+
lang = I18n.locale.to_s
|
56
|
+
if content(lang).present?
|
57
|
+
content(lang)
|
58
|
+
else
|
59
|
+
content
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def to_html
|
64
|
+
content = I18n.locale
|
65
|
+
filters = { 'markdown' => BlueCloth,
|
66
|
+
'textile' => RedCloth }
|
67
|
+
if filters.include?(self.filter)
|
68
|
+
filters[self.filter].new(self.preferred_content).to_html
|
69
|
+
else
|
70
|
+
self.preferred_content
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
protected
|
75
|
+
|
76
|
+
def check_permalink_presence
|
77
|
+
unless self.permalink.present? || self.custom_permalink?
|
78
|
+
write_attribute(:permalink, Permalink.from(title)) if title
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def rebuild_path
|
83
|
+
check_permalink_presence
|
84
|
+
self.path = self.ancestors_and_self.collect(&:permalink).join('/')
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
data/config/routes.rb
CHANGED
data/lib/blue_pages.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
+
require 'permalink'
|
4
|
+
require 'blue_pages/localized_keys'
|
5
|
+
|
3
6
|
module BluePages
|
4
7
|
|
5
8
|
class Engine < Rails::Engine
|
@@ -10,7 +13,7 @@ module BluePages
|
|
10
13
|
end
|
11
14
|
|
12
15
|
mattr_accessor :route_prefix
|
13
|
-
|
16
|
+
mattr_accessor :layout
|
14
17
|
mattr_accessor :model_includes
|
15
18
|
|
16
19
|
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module LocalizedKeys
|
4
|
+
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do |base|
|
8
|
+
|
9
|
+
before_validation :normalize_language
|
10
|
+
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
module ClassMethods
|
15
|
+
|
16
|
+
def localized_keys
|
17
|
+
@localized_keys ||= []
|
18
|
+
end
|
19
|
+
|
20
|
+
def default_language(instance = nil)
|
21
|
+
if @default_language.respond_to?(:call)
|
22
|
+
@default_language.call
|
23
|
+
elsif @default_language.is_a?(Symbol)
|
24
|
+
instance && instance.send(@default_language)
|
25
|
+
else
|
26
|
+
@default_language
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def default_language=(language)
|
31
|
+
@default_language = language
|
32
|
+
end
|
33
|
+
|
34
|
+
def i18n_field(name, options = {})
|
35
|
+
localized_keys << name
|
36
|
+
self.default_language = options.delete(:default_language) if options[:default_language]
|
37
|
+
|
38
|
+
# Define MongoMapper key
|
39
|
+
key_name = "#{name}_locales"
|
40
|
+
self.field key_name, options.merge(:type => Hash, :default => {})
|
41
|
+
|
42
|
+
# Define a getter method
|
43
|
+
define_method(name) do |*args|
|
44
|
+
locale = (args.empty? || args.first.nil?) ?
|
45
|
+
self.class.default_language(self) :
|
46
|
+
args.first
|
47
|
+
locale_attr = read_attribute(key_name)
|
48
|
+
locale = locale_attr.keys.first unless locale
|
49
|
+
p locale
|
50
|
+
locale_attr[locale || ''] if locale_attr
|
51
|
+
end
|
52
|
+
|
53
|
+
# Define a setter method
|
54
|
+
define_method(:"#{name}=") do |*args|
|
55
|
+
locale_attr = read_attribute(key_name)
|
56
|
+
write_attribute(key_name, {}) unless locale_attr
|
57
|
+
read_attribute(key_name)[self.class.default_language(self) || ''] = args.first
|
58
|
+
end
|
59
|
+
|
60
|
+
# Define a query method
|
61
|
+
define_method(:"#{name}?") do |*args|
|
62
|
+
self.send(name, *args).present?
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
module InstanceMethods
|
70
|
+
|
71
|
+
def method_missing(name, *args)
|
72
|
+
if self.respond_to_dynamic?(name)
|
73
|
+
name.to_s =~ /(.*)_([a-z]{2})(=)??$/
|
74
|
+
key, locale, assignment = $1, $2, $3
|
75
|
+
localized_key = :"#{key}_locales"
|
76
|
+
|
77
|
+
if assignment.nil?
|
78
|
+
value = send(localized_key)
|
79
|
+
value[locale] if value
|
80
|
+
elsif
|
81
|
+
value = send(localized_key)
|
82
|
+
send(:"#{localized_key}=", {}) unless value
|
83
|
+
send(localized_key)[locale] = args.first
|
84
|
+
end
|
85
|
+
else
|
86
|
+
super
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def respond_to?(*args)
|
91
|
+
super || self.respond_to_dynamic?(args.first)
|
92
|
+
end
|
93
|
+
|
94
|
+
protected
|
95
|
+
|
96
|
+
def respond_to_dynamic?(name)
|
97
|
+
if name.to_s =~ /(.*)_([a-z]{2})=?$/
|
98
|
+
key = $1
|
99
|
+
self.class.localized_keys.include?(key.to_sym)
|
100
|
+
else
|
101
|
+
false
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def normalize_language
|
106
|
+
self.class.localized_keys.each do |key|
|
107
|
+
locales = self.send(:"#{key}_locales")
|
108
|
+
|
109
|
+
if locales && locales.has_key?("") && default = self.class.default_language(self)
|
110
|
+
locales[default] = locales[""]
|
111
|
+
locales.delete("")
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
119
|
+
|
data/lib/permalink.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'unicode_utils' if "".encoding_aware?
|
2
|
+
|
3
|
+
module Permalink
|
4
|
+
|
5
|
+
def self.from(string)
|
6
|
+
# Remove chars with accents
|
7
|
+
string = if "".encoding_aware?
|
8
|
+
UnicodeUtils.nfkd(string).gsub(/[^\x00-\x7F]/,'').downcase.to_s
|
9
|
+
else
|
10
|
+
string.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,'').downcase.to_s
|
11
|
+
end
|
12
|
+
|
13
|
+
# Remove any non alphanumeric chars
|
14
|
+
string.gsub("&", "and").
|
15
|
+
gsub(/[^a-z0-9\-_]/i, '-').
|
16
|
+
gsub(/-{2,}/, '-').
|
17
|
+
gsub(/(^-+|-+$)/, '')
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
metadata
CHANGED
@@ -1,97 +1,96 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: blue_pages
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 1
|
8
|
-
- 0
|
9
|
-
version: 0.1.0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.1
|
5
|
+
prerelease:
|
10
6
|
platform: ruby
|
11
|
-
authors:
|
12
|
-
-
|
7
|
+
authors:
|
8
|
+
- Jiri Zajpt
|
13
9
|
autorequire:
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
dependencies:
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2011-11-09 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: mongoid
|
22
|
-
requirement: &
|
16
|
+
requirement: &70141271321420 !ruby/object:Gem::Requirement
|
23
17
|
none: false
|
24
|
-
requirements:
|
18
|
+
requirements:
|
25
19
|
- - ~>
|
26
|
-
- !ruby/object:Gem::Version
|
27
|
-
|
28
|
-
- 2
|
29
|
-
- 0
|
30
|
-
- 0
|
31
|
-
- beta
|
32
|
-
- 20
|
33
|
-
version: 2.0.0.beta.20
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '2.0'
|
34
22
|
type: :runtime
|
35
23
|
prerelease: false
|
36
|
-
version_requirements: *
|
37
|
-
- !ruby/object:Gem::Dependency
|
24
|
+
version_requirements: *70141271321420
|
25
|
+
- !ruby/object:Gem::Dependency
|
38
26
|
name: mongoid-tree
|
39
|
-
requirement: &
|
27
|
+
requirement: &70141271320620 !ruby/object:Gem::Requirement
|
40
28
|
none: false
|
41
|
-
requirements:
|
42
|
-
- -
|
43
|
-
- !ruby/object:Gem::Version
|
44
|
-
|
45
|
-
|
46
|
-
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70141271320620
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: bluecloth
|
38
|
+
requirement: &70141271320100 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 2.0.9
|
44
|
+
type: :runtime
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70141271320100
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: RedCloth
|
49
|
+
requirement: &70141271319520 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 4.2.3
|
47
55
|
type: :runtime
|
48
56
|
prerelease: false
|
49
|
-
version_requirements: *
|
57
|
+
version_requirements: *70141271319520
|
50
58
|
description: Pages engine handles cms-like pages.
|
51
59
|
email: jzajpt@blueberry.cz
|
52
60
|
executables: []
|
53
|
-
|
54
61
|
extensions: []
|
55
|
-
|
56
|
-
extra_rdoc_files:
|
62
|
+
extra_rdoc_files:
|
57
63
|
- README
|
58
|
-
files:
|
64
|
+
files:
|
59
65
|
- app/controllers/blue_pages/pages_controller.rb
|
60
|
-
- app/models/
|
66
|
+
- app/models/page.rb
|
61
67
|
- config/routes.rb
|
62
68
|
- lib/blue_pages.rb
|
69
|
+
- lib/blue_pages/localized_keys.rb
|
70
|
+
- lib/permalink.rb
|
63
71
|
- README
|
64
|
-
has_rdoc: true
|
65
72
|
homepage: http://github.com/jzajpt/blue_pages
|
66
73
|
licenses: []
|
67
|
-
|
68
74
|
post_install_message:
|
69
75
|
rdoc_options: []
|
70
|
-
|
71
|
-
require_paths:
|
76
|
+
require_paths:
|
72
77
|
- lib
|
73
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
78
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
74
79
|
none: false
|
75
|
-
requirements:
|
76
|
-
- -
|
77
|
-
- !ruby/object:Gem::Version
|
78
|
-
|
79
|
-
|
80
|
-
version: "0"
|
81
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ! '>='
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
85
|
none: false
|
83
|
-
requirements:
|
84
|
-
- -
|
85
|
-
- !ruby/object:Gem::Version
|
86
|
-
|
87
|
-
- 0
|
88
|
-
version: "0"
|
86
|
+
requirements:
|
87
|
+
- - ! '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
89
90
|
requirements: []
|
90
|
-
|
91
91
|
rubyforge_project:
|
92
|
-
rubygems_version: 1.
|
92
|
+
rubygems_version: 1.8.10
|
93
93
|
signing_key:
|
94
94
|
specification_version: 3
|
95
95
|
summary: Pages Engine for Rails 3
|
96
96
|
test_files: []
|
97
|
-
|
@@ -1,45 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
class BluePages::Page
|
4
|
-
|
5
|
-
include Mongoid::Document
|
6
|
-
include Mongoid::Timestamps
|
7
|
-
include Mongoid::Tree
|
8
|
-
|
9
|
-
BluePages.model_includes.each do |mod|
|
10
|
-
include mod
|
11
|
-
end
|
12
|
-
|
13
|
-
store_in :blue_pages
|
14
|
-
|
15
|
-
field :title
|
16
|
-
field :permalink
|
17
|
-
field :path
|
18
|
-
field :metadata, :type => Hash
|
19
|
-
field :content
|
20
|
-
field :published, :type => Boolean, :default => true
|
21
|
-
|
22
|
-
validates_presence_of :title
|
23
|
-
validates_uniqueness_of :title
|
24
|
-
|
25
|
-
scope :published, where(:published => true)
|
26
|
-
scope :unpublished, where(:published => false)
|
27
|
-
|
28
|
-
after_rearrange :rebuild_path
|
29
|
-
|
30
|
-
def title=(new_title)
|
31
|
-
write_attribute(:permalink, Permalink.from(new_title))
|
32
|
-
write_attribute(:title, new_title)
|
33
|
-
end
|
34
|
-
|
35
|
-
def to_s
|
36
|
-
title
|
37
|
-
end
|
38
|
-
|
39
|
-
protected
|
40
|
-
|
41
|
-
def rebuild_path
|
42
|
-
self.path = self.ancestors_and_self.collect(&:permalink).join('/')
|
43
|
-
end
|
44
|
-
|
45
|
-
end
|