thesis 0.1.1 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (123) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +103 -68
  3. data/app/assets/javascripts/thesis.js +1 -0
  4. data/app/assets/javascripts/thesis/thesis.coffee +250 -0
  5. data/app/assets/javascripts/thesis/utilities.coffee +13 -0
  6. data/app/assets/stylesheets/thesis.sass +4 -0
  7. data/app/assets/stylesheets/thesis/_mixins/_barber-pole.sass +5 -0
  8. data/app/assets/stylesheets/thesis/_mixins/editor.sass +15 -0
  9. data/app/assets/stylesheets/thesis/_thesis.sass +207 -0
  10. data/app/assets/stylesheets/thesis/base/_base.sass +5 -0
  11. data/app/assets/stylesheets/thesis/base/_colors.sass +6 -0
  12. data/app/assets/stylesheets/thesis/base/_fonts.sass +6 -0
  13. data/app/assets/stylesheets/thesis/base/_forms.scss +165 -0
  14. data/app/assets/stylesheets/thesis/base/_keyframes.sass +205 -0
  15. data/app/assets/stylesheets/thesis/base/bourbon/_bourbon-deprecated-upcoming.scss +8 -0
  16. data/app/assets/stylesheets/thesis/base/bourbon/_bourbon.scss +79 -0
  17. data/app/assets/stylesheets/thesis/base/bourbon/addons/_button.scss +374 -0
  18. data/app/assets/stylesheets/thesis/base/bourbon/addons/_clearfix.scss +23 -0
  19. data/app/assets/stylesheets/thesis/base/bourbon/addons/_directional-values.scss +111 -0
  20. data/app/assets/stylesheets/thesis/base/bourbon/addons/_ellipsis.scss +7 -0
  21. data/app/assets/stylesheets/thesis/base/bourbon/addons/_font-family.scss +5 -0
  22. data/app/assets/stylesheets/thesis/base/bourbon/addons/_hide-text.scss +10 -0
  23. data/app/assets/stylesheets/thesis/base/bourbon/addons/_html5-input-types.scss +86 -0
  24. data/app/assets/stylesheets/thesis/base/bourbon/addons/_position.scss +32 -0
  25. data/app/assets/stylesheets/thesis/base/bourbon/addons/_prefixer.scss +45 -0
  26. data/app/assets/stylesheets/thesis/base/bourbon/addons/_retina-image.scss +31 -0
  27. data/app/assets/stylesheets/thesis/base/bourbon/addons/_size.scss +16 -0
  28. data/app/assets/stylesheets/thesis/base/bourbon/addons/_timing-functions.scss +32 -0
  29. data/app/assets/stylesheets/thesis/base/bourbon/addons/_triangle.scss +83 -0
  30. data/app/assets/stylesheets/thesis/base/bourbon/addons/_word-wrap.scss +8 -0
  31. data/app/assets/stylesheets/thesis/base/bourbon/css3/_animation.scss +52 -0
  32. data/app/assets/stylesheets/thesis/base/bourbon/css3/_appearance.scss +3 -0
  33. data/app/assets/stylesheets/thesis/base/bourbon/css3/_backface-visibility.scss +6 -0
  34. data/app/assets/stylesheets/thesis/base/bourbon/css3/_background-image.scss +42 -0
  35. data/app/assets/stylesheets/thesis/base/bourbon/css3/_background.scss +55 -0
  36. data/app/assets/stylesheets/thesis/base/bourbon/css3/_border-image.scss +59 -0
  37. data/app/assets/stylesheets/thesis/base/bourbon/css3/_border-radius.scss +22 -0
  38. data/app/assets/stylesheets/thesis/base/bourbon/css3/_box-sizing.scss +4 -0
  39. data/app/assets/stylesheets/thesis/base/bourbon/css3/_calc.scss +4 -0
  40. data/app/assets/stylesheets/thesis/base/bourbon/css3/_columns.scss +47 -0
  41. data/app/assets/stylesheets/thesis/base/bourbon/css3/_filter.scss +5 -0
  42. data/app/assets/stylesheets/thesis/base/bourbon/css3/_flex-box.scss +321 -0
  43. data/app/assets/stylesheets/thesis/base/bourbon/css3/_font-face.scss +23 -0
  44. data/app/assets/stylesheets/thesis/base/bourbon/css3/_font-feature-settings.scss +10 -0
  45. data/app/assets/stylesheets/thesis/base/bourbon/css3/_hidpi-media-query.scss +10 -0
  46. data/app/assets/stylesheets/thesis/base/bourbon/css3/_hyphens.scss +4 -0
  47. data/app/assets/stylesheets/thesis/base/bourbon/css3/_image-rendering.scss +14 -0
  48. data/app/assets/stylesheets/thesis/base/bourbon/css3/_keyframes.scss +35 -0
  49. data/app/assets/stylesheets/thesis/base/bourbon/css3/_linear-gradient.scss +38 -0
  50. data/app/assets/stylesheets/thesis/base/bourbon/css3/_perspective.scss +8 -0
  51. data/app/assets/stylesheets/thesis/base/bourbon/css3/_placeholder.scss +8 -0
  52. data/app/assets/stylesheets/thesis/base/bourbon/css3/_radial-gradient.scss +39 -0
  53. data/app/assets/stylesheets/thesis/base/bourbon/css3/_transform.scss +15 -0
  54. data/app/assets/stylesheets/thesis/base/bourbon/css3/_transition.scss +77 -0
  55. data/app/assets/stylesheets/thesis/base/bourbon/css3/_user-select.scss +3 -0
  56. data/app/assets/stylesheets/thesis/base/bourbon/functions/_assign.scss +11 -0
  57. data/app/assets/stylesheets/thesis/base/bourbon/functions/_color-lightness.scss +13 -0
  58. data/app/assets/stylesheets/thesis/base/bourbon/functions/_flex-grid.scss +39 -0
  59. data/app/assets/stylesheets/thesis/base/bourbon/functions/_golden-ratio.scss +3 -0
  60. data/app/assets/stylesheets/thesis/base/bourbon/functions/_grid-width.scss +13 -0
  61. data/app/assets/stylesheets/thesis/base/bourbon/functions/_modular-scale.scss +66 -0
  62. data/app/assets/stylesheets/thesis/base/bourbon/functions/_px-to-em.scss +13 -0
  63. data/app/assets/stylesheets/thesis/base/bourbon/functions/_px-to-rem.scss +15 -0
  64. data/app/assets/stylesheets/thesis/base/bourbon/functions/_strip-units.scss +5 -0
  65. data/app/assets/stylesheets/thesis/base/bourbon/functions/_tint-shade.scss +9 -0
  66. data/app/assets/stylesheets/thesis/base/bourbon/functions/_transition-property-name.scss +22 -0
  67. data/app/assets/stylesheets/thesis/base/bourbon/functions/_unpack.scss +17 -0
  68. data/app/assets/stylesheets/thesis/base/bourbon/helpers/_convert-units.scss +15 -0
  69. data/app/assets/stylesheets/thesis/base/bourbon/helpers/_gradient-positions-parser.scss +13 -0
  70. data/app/assets/stylesheets/thesis/base/bourbon/helpers/_is-num.scss +8 -0
  71. data/app/assets/stylesheets/thesis/base/bourbon/helpers/_linear-angle-parser.scss +25 -0
  72. data/app/assets/stylesheets/thesis/base/bourbon/helpers/_linear-gradient-parser.scss +41 -0
  73. data/app/assets/stylesheets/thesis/base/bourbon/helpers/_linear-positions-parser.scss +61 -0
  74. data/app/assets/stylesheets/thesis/base/bourbon/helpers/_linear-side-corner-parser.scss +31 -0
  75. data/app/assets/stylesheets/thesis/base/bourbon/helpers/_radial-arg-parser.scss +69 -0
  76. data/app/assets/stylesheets/thesis/base/bourbon/helpers/_radial-gradient-parser.scss +50 -0
  77. data/app/assets/stylesheets/thesis/base/bourbon/helpers/_radial-positions-parser.scss +18 -0
  78. data/app/assets/stylesheets/thesis/base/bourbon/helpers/_render-gradients.scss +26 -0
  79. data/app/assets/stylesheets/thesis/base/bourbon/helpers/_shape-size-stripper.scss +10 -0
  80. data/app/assets/stylesheets/thesis/base/bourbon/helpers/_str-to-num.scss +50 -0
  81. data/app/assets/stylesheets/thesis/base/bourbon/settings/_asset-pipeline.scss +1 -0
  82. data/app/assets/stylesheets/thesis/base/bourbon/settings/_prefixer.scss +6 -0
  83. data/app/assets/stylesheets/thesis/base/bourbon/settings/_px-to-em.scss +1 -0
  84. data/lib/generators/thesis/install/install_generator.rb +21 -13
  85. data/lib/thesis/controllers/controller_helpers.rb +11 -5
  86. data/lib/thesis/controllers/thesis_controller.rb +16 -13
  87. data/lib/thesis/models/page.rb +29 -22
  88. data/lib/thesis/models/page_content.rb +44 -29
  89. data/lib/thesis/routing/route_constraint.rb +8 -2
  90. data/lib/thesis/routing/routes.rb +2 -3
  91. data/lib/thesis/version.rb +1 -1
  92. data/spec/factories/pages.rb +1 -1
  93. data/spec/spec_helper.rb +2 -2
  94. data/spec/{lib/thesis → thesis}/controllers/thesis_controller_spec.rb +15 -13
  95. data/spec/{lib/thesis → thesis}/models/page_content_spec.rb +4 -4
  96. data/spec/{lib/thesis → thesis}/models/page_spec.rb +0 -0
  97. data/spec/thesis/routing/thesis_routing_spec.rb +23 -0
  98. metadata +137 -56
  99. data/app/assets/javascripts/thesis/thesis.js.coffee +0 -157
  100. data/app/assets/stylesheets/thesis.css +0 -4
  101. data/app/assets/stylesheets/thesis/font-awesome/font-awesome.scss +0 -534
  102. data/app/assets/stylesheets/thesis/font/FontAwesome.otf +0 -0
  103. data/app/assets/stylesheets/thesis/font/fontawesome-webfont.eot +0 -0
  104. data/app/assets/stylesheets/thesis/font/fontawesome-webfont.svg +0 -284
  105. data/app/assets/stylesheets/thesis/font/fontawesome-webfont.ttf +0 -0
  106. data/app/assets/stylesheets/thesis/font/fontawesome-webfont.woff +0 -0
  107. data/app/assets/stylesheets/thesis/jquery-ui/images/animated-overlay.gif +0 -0
  108. data/app/assets/stylesheets/thesis/jquery-ui/images/ui-bg_flat_30_cccccc_40x100.png +0 -0
  109. data/app/assets/stylesheets/thesis/jquery-ui/images/ui-bg_flat_50_5c5c5c_40x100.png +0 -0
  110. data/app/assets/stylesheets/thesis/jquery-ui/images/ui-bg_glass_20_555555_1x400.png +0 -0
  111. data/app/assets/stylesheets/thesis/jquery-ui/images/ui-bg_glass_40_0078a3_1x400.png +0 -0
  112. data/app/assets/stylesheets/thesis/jquery-ui/images/ui-bg_glass_40_ffc73d_1x400.png +0 -0
  113. data/app/assets/stylesheets/thesis/jquery-ui/images/ui-bg_gloss-wave_25_333333_500x100.png +0 -0
  114. data/app/assets/stylesheets/thesis/jquery-ui/images/ui-bg_highlight-soft_80_eeeeee_1x100.png +0 -0
  115. data/app/assets/stylesheets/thesis/jquery-ui/images/ui-bg_inset-soft_25_000000_1x100.png +0 -0
  116. data/app/assets/stylesheets/thesis/jquery-ui/images/ui-bg_inset-soft_30_f58400_1x100.png +0 -0
  117. data/app/assets/stylesheets/thesis/jquery-ui/images/ui-icons_222222_256x240.png +0 -0
  118. data/app/assets/stylesheets/thesis/jquery-ui/images/ui-icons_4b8e0b_256x240.png +0 -0
  119. data/app/assets/stylesheets/thesis/jquery-ui/images/ui-icons_a83300_256x240.png +0 -0
  120. data/app/assets/stylesheets/thesis/jquery-ui/images/ui-icons_cccccc_256x240.png +0 -0
  121. data/app/assets/stylesheets/thesis/jquery-ui/images/ui-icons_ffffff_256x240.png +0 -0
  122. data/app/assets/stylesheets/thesis/jquery-ui/jquery-ui-1.10.2.custom.css +0 -1175
  123. data/app/assets/stylesheets/thesis/thesis.css.scss +0 -65
@@ -0,0 +1,10 @@
1
+ @function _shape-size-stripper($shape-size) {
2
+ $shape-size-spec: null;
3
+ @each $value in $shape-size {
4
+ @if ($value == "cover") or ($value == "contain") {
5
+ $value: null;
6
+ }
7
+ $shape-size-spec: "#{$shape-size-spec} #{$value}";
8
+ }
9
+ @return $shape-size-spec;
10
+ }
@@ -0,0 +1,50 @@
1
+ //************************************************************************//
2
+ // Helper function for linear/radial-gradient-parsers.
3
+ // Source: http://sassmeister.com/gist/9647408
4
+ //************************************************************************//
5
+ @function _str-to-num($string) {
6
+ // Matrices
7
+ $strings: '0' '1' '2' '3' '4' '5' '6' '7' '8' '9';
8
+ $numbers: 0 1 2 3 4 5 6 7 8 9;
9
+
10
+ // Result
11
+ $result: 0;
12
+ $divider: 0;
13
+ $minus: false;
14
+
15
+ // Looping through all characters
16
+ @for $i from 1 through str-length($string) {
17
+ $character: str-slice($string, $i, $i);
18
+ $index: index($strings, $character);
19
+
20
+ @if $character == '-' {
21
+ $minus: true;
22
+ }
23
+
24
+ @else if $character == '.' {
25
+ $divider: 1;
26
+ }
27
+
28
+ @else {
29
+ @if not $index {
30
+ $result: if($minus, $result * -1, $result);
31
+ @return _convert-units($result, str-slice($string, $i));
32
+ }
33
+
34
+ $number: nth($numbers, $index);
35
+
36
+ @if $divider == 0 {
37
+ $result: $result * 10;
38
+ }
39
+
40
+ @else {
41
+ // Move the decimal dot to the left
42
+ $divider: $divider * 10;
43
+ $number: $number / $divider;
44
+ }
45
+
46
+ $result: $result + $number;
47
+ }
48
+ }
49
+ @return if($minus, $result * -1, $result);
50
+ }
@@ -0,0 +1 @@
1
+ $asset-pipeline: false !default;
@@ -0,0 +1,6 @@
1
+ // Variable settings for /addons/prefixer.scss
2
+ $prefix-for-webkit: true !default;
3
+ $prefix-for-mozilla: true !default;
4
+ $prefix-for-microsoft: true !default;
5
+ $prefix-for-opera: true !default;
6
+ $prefix-for-spec: true !default; // required for keyframe mixin
@@ -4,11 +4,11 @@ module Thesis
4
4
  module Generators
5
5
  class InstallGenerator < ::Rails::Generators::Base
6
6
  include Rails::Generators::Migration
7
-
7
+
8
8
  source_root File.expand_path('../templates', __FILE__)
9
-
9
+
10
10
  desc "install or upgrade Thesis"
11
-
11
+
12
12
  def self.next_migration_number(path)
13
13
  unless @prev_migration_nr
14
14
  @prev_migration_nr = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i
@@ -19,20 +19,20 @@ module Thesis
19
19
  end
20
20
 
21
21
  def copy_migrations
22
- migration_template "migrations/thesis_create_page.rb", "db/migrate/thesis_create_page.rb"
23
- migration_template "migrations/thesis_create_page_content.rb", "db/migrate/thesis_create_page_content.rb", { skip: true }
22
+ copy_migration "thesis_create_page"
23
+ copy_migration "thesis_create_page_content"
24
24
  end
25
25
 
26
26
  def create_folders
27
- copy_file "page_templates/default.html.slim", "app/views/page_templates/default.html.slim" if defined? Slim
28
- copy_file "page_templates/default.html.haml", "app/views/page_templates/default.html.haml" if defined? Haml
29
- copy_file "page_templates/default.html.erb", "app/views/page_templates/default.html.erb" unless defined? Haml || defined? Slim
27
+ return copy_file "page_templates/default.html.slim", "app/views/page_templates/default.html.slim" if defined? Slim
28
+ return copy_file "page_templates/default.html.haml", "app/views/page_templates/default.html.haml" if defined? Haml
29
+ copy_file "page_templates/default.html.erb", "app/views/page_templates/default.html.erb"
30
30
  end
31
31
 
32
32
  def install_js
33
33
  filename = "app/assets/javascripts/application.js"
34
34
  existing = File.binread("#{filename}").include?("require thesis")
35
-
35
+
36
36
  if existing && generating?
37
37
  say_status("skipped", "insert into #{filename}", :yellow)
38
38
  else
@@ -48,7 +48,7 @@ module Thesis
48
48
  filename = filename << ".scss" unless File.exists? filename
49
49
  if File.exists? filename
50
50
  existing = File.binread("#{filename}").include?("require thesis")
51
-
51
+
52
52
  if existing && generating?
53
53
  say_status("skipped", "insert into #{filename}", :yellow)
54
54
  else
@@ -64,11 +64,11 @@ module Thesis
64
64
  def install_page_is_editable
65
65
  filename = "app/controllers/application_controller.rb"
66
66
  existing = File.binread("#{filename}").include?("def page_is_editable?")
67
-
67
+
68
68
  if existing && generating?
69
69
  say_status("skipped", "insert into #{filename}", :yellow)
70
70
  else
71
- insert_into_file "#{filename}", after: %r{ protect_from_forgery} do
71
+ insert_into_file "#{filename}", after: %r{ protect_from_forgery with: :exception} do
72
72
  "\n" +
73
73
  "\n # Thesis authentication" +
74
74
  "\n def page_is_editable?(page)" +
@@ -103,7 +103,15 @@ module Thesis
103
103
 
104
104
  def destroying?
105
105
  :revoke == behavior
106
- end
106
+ end
107
+
108
+ def copy_migration(filename)
109
+ if generating? && self.class.migration_exists?("db/migrate", "#{filename}")
110
+ say_status("skipped", "Migration #{filename}.rb already exists")
111
+ else
112
+ migration_template "migrations/#{filename}.rb", "db/migrate/#{filename}.rb"
113
+ end
114
+ end
107
115
  end
108
116
  end
109
117
  end
@@ -1,17 +1,23 @@
1
1
  module Thesis
2
2
  module ControllerHelpers
3
3
  def current_page
4
- slug = request.fullpath.sub(/(\/)+$/,'')
5
- @current_page ||= Page.where(slug: slug).first
6
- @current_page
4
+ @current_page ||= begin
5
+ p = Page.where(slug: current_slug).first_or_create
6
+ p.editable = page_is_editable?(p)
7
+ p
8
+ end
9
+ end
10
+
11
+ def current_slug
12
+ request.fullpath.sub(/(\/)+$/,'').presence || "/"
7
13
  end
8
14
 
9
15
  def root_pages
10
16
  @root_pages ||= Page.where(parent_id: nil).order("sort_order ASC")
11
17
  end
12
-
18
+
13
19
  def thesis_editor
14
- "<div id='thesis-editor'></div>".html_safe if page_is_editable?(current_page)
20
+ current_page.editable ? "<div id='thesis-editor'></div>".html_safe : ""
15
21
  end
16
22
  end
17
23
  end
@@ -4,15 +4,17 @@ module Thesis
4
4
 
5
5
  def show
6
6
  raise ActionController::RoutingError.new('Not Found') unless current_page
7
-
7
+
8
8
  if current_page.template && template_exists?("page_templates/#{current_page.template}")
9
9
  render "page_templates/#{current_page.template}", layout: false
10
+ elsif template_exists?("page_templates/default")
11
+ render "page_templates/default"
10
12
  else
11
- raise PageRequiresTemplate.new("Page requires a template but none was specified.")
13
+ raise PageRequiresTemplate.new("No default template found in page_templates. Create page_templates/default.html.(erb|haml|slim).")
12
14
  end
13
15
  end
14
-
15
- def create_page
16
+
17
+ def create_page
16
18
  page = Page.new
17
19
  return head :forbidden unless page_is_editable?(page)
18
20
 
@@ -23,8 +25,9 @@ module Thesis
23
25
  page.parent = parent
24
26
  end
25
27
 
26
- resp = {}
28
+ resp = { page: page }
27
29
 
30
+ page.update_slug
28
31
  if page.save
29
32
  resp[:page] = page
30
33
  else
@@ -33,30 +36,30 @@ module Thesis
33
36
 
34
37
  render json: resp, status: page.valid? ? :ok : :not_acceptable
35
38
  end
36
-
37
- def delete_page
39
+
40
+ def delete_page
38
41
  slug = params[:slug].to_s.sub(/(\/)+$/,'')
39
42
  page = Page.where(slug: slug).first
40
43
  return head :forbidden unless page && page_is_editable?(page)
41
44
 
42
45
  head page.destroy ? :ok : :not_acceptable
43
46
  end
44
-
47
+
45
48
  def update_page
46
49
  page = current_page
47
50
  return head :forbidden unless page_is_editable?(page)
48
51
 
49
52
  update_page_attributes page
50
-
53
+
51
54
  head page.save ? :ok : :not_acceptable
52
55
  end
53
56
 
54
57
  def page_attributes
55
58
  [ :name, :title, :description, :parent_id ]
56
59
  end
57
-
60
+
58
61
  def update_page_attributes(page)
59
- page_attributes.each { |a| page.send("#{a}=", params[a]) if params[a] }
62
+ page_attributes.each { |a| page.send("#{a}=", params[a].to_s) if params[a] }
60
63
  page
61
64
  end
62
65
 
@@ -71,7 +74,7 @@ module Thesis
71
74
  else
72
75
  page_contents.each do |pc|
73
76
  if page_is_editable? pc.page
74
- pc.content = params[pc.id.to_s]
77
+ pc.content = params[pc.id.to_s].to_s.presence || "&nbsp;".html_safe
75
78
  pc.save
76
79
  else
77
80
  errors = true
@@ -85,7 +88,7 @@ module Thesis
85
88
 
86
89
  render json: resp, status: errors ? :not_acceptable : :ok
87
90
  end
88
-
91
+
89
92
  # The ApplicationController should implement this.
90
93
  def page_is_editable?(page)
91
94
  raise RequiredMethodNotImplemented.new("Add a `page_is_editable?(page)` method to your controller that returns true or false.") unless defined?(super)
@@ -1,47 +1,54 @@
1
1
  module Thesis
2
2
  class Page < ActiveRecord::Base
3
+ attr_accessor :editable
4
+
3
5
  self.table_name = "pages"
4
-
6
+
5
7
  belongs_to :parent, class_name: "Page"
6
- has_many :subpages, class_name: "Page", foreign_key: "parent_id", order: "sort_order ASC"
8
+ has_many :subpages, -> { order(:sort_order) }, class_name: "Page", foreign_key: "parent_id"
7
9
  has_many :page_contents, dependent: :destroy
8
10
 
9
- before_validation :update_slug
11
+ before_create :set_name
12
+ before_save :update_slug # Do we even want to do this?
10
13
  after_save :update_subpage_slugs
11
-
12
- validates :slug,
13
- uniqueness: { message: "There's already a page like that. Change your page name." },
14
+
15
+ validates :slug,
16
+ uniqueness: { message: "There's already a page at that location." },
14
17
  presence: true,
15
- length: { minimum: 1 },
16
- allow_blank: false
17
-
18
+ allow_blank: true,
19
+ allow_null: false
20
+
21
+ def set_name
22
+ self.name ||= self.slug.to_s.split("/").last.to_s.humanize if self.slug
23
+ end
24
+
18
25
  def update_slug
26
+ self.name ||= ""
19
27
  self.slug = "/" << self.name.parameterize
20
28
  self.slug = "#{parent.slug.to_s}#{self.slug.to_s}" if parent
21
29
  end
22
-
30
+
23
31
  def update_subpage_slugs
24
32
  subpages.each(&:save) if slug_changed?
25
33
  end
26
-
34
+
27
35
  def content(name, content_type = :html, opts = {})
28
- pc = find_or_create_page_content(name, content_type, opts)
29
- pc.render
36
+ find_or_create_page_content(name, content_type, opts).render(editable: self.editable)
30
37
  end
31
-
38
+
32
39
  def path
33
40
  self.slug
34
41
  end
35
-
42
+
36
43
  protected
37
-
44
+
38
45
  def find_or_create_page_content(name, content_type, opts = {})
39
- page_content = self.page_contents.where(name: name).first_or_create do |pc|
40
- pc.content = opts[:default] || "<p>Edit This HTML Area</p>" if content_type == :html
41
- pc.content = opts[:default] || "Edit This Text Area" if content_type == :text
42
- width = opts[:width] || 350
43
- height = opts[:height] || 150
44
- pc.content = opts[:default] || "http://placehold.it/#{width}x#{height}" if content_type == :image
46
+ page_content = self.page_contents.where(name: name).first_or_create do |pc|
47
+ pc.content = opts[:default] || "<p>Edit This HTML Area</p>" if content_type == :html
48
+ pc.content = opts[:default] || "Edit This Text Area" if content_type == :text
49
+ width = opts[:width] || 350
50
+ height = opts[:height] || 150
51
+ pc.content = opts[:default] || "http://placehold.it/#{width}x#{height}" if content_type == :image
45
52
  end
46
53
  page_content.content_type = content_type
47
54
  page_content.save if page_content.changed?
@@ -3,41 +3,56 @@ module Thesis
3
3
  self.table_name = "page_contents"
4
4
 
5
5
  belongs_to :page
6
-
7
- def render
6
+ validates :page_id, presence: true
7
+
8
+ def render(args={})
9
+ args[:editable] ? render_editable : render_content
10
+ end
11
+
12
+ def render_editable
13
+ case self.content_type.to_sym
14
+ when :html then render_html_editable
15
+ when :text then render_plain_text_editable
16
+ when :image then render_image_editable
17
+ else render_html_editable
18
+ end
19
+ end
20
+
21
+ def render_content
8
22
  case self.content_type.to_sym
9
- when :html
10
- render_html
11
- when :text
12
- render_plain_text
13
- when :image
14
- render_image
15
- else
16
- render_html
23
+ when :image then render_image_tag
24
+ else self.content.to_s.html_safe
17
25
  end
18
26
  end
19
-
27
+
20
28
  protected
21
-
22
- def render_html
23
- h = "<div class='thesis-content thesis-content-html' data-thesis-content-id='#{self.id}'>" +
24
- "#{self.content}" +
25
- "</div>"
26
- h.html_safe
29
+
30
+ def render_html_editable
31
+ (
32
+ "<thesis-content class='thesis-content thesis-content-html' data-thesis-content-id='#{self.id}'>" +
33
+ "#{self.content}" +
34
+ "</thesis-content>"
35
+ ).html_safe
36
+ end
37
+
38
+ def render_plain_text_editable
39
+ (
40
+ "<thesis-content class='thesis-content thesis-content-text' data-thesis-content-id='#{self.id}'>" +
41
+ "#{self.content}" +
42
+ "</thesis-content>"
43
+ ).html_safe
27
44
  end
28
-
29
- def render_plain_text
30
- h = "<span class='thesis-content thesis-content-text' data-thesis-content-id='#{self.id}'>" +
31
- "#{self.content}" +
32
- "</span>"
33
- h.html_safe
45
+
46
+ def render_image_editable
47
+ (
48
+ "<thesis-content class='thesis-content thesis-content-image' data-thesis-content-id='#{self.id}'>" +
49
+ render_image_tag +
50
+ "</thesis-content>"
51
+ ).html_safe
34
52
  end
35
-
36
- def render_image
37
- h = "<div class='thesis-content thesis-content-image'>" +
38
- "<img src='#{self.content}' />" +
39
- "</div>"
40
- h.html_safe
53
+
54
+ def render_image_tag
55
+ "<img src='#{self.content}' />".html_safe
41
56
  end
42
57
  end
43
58
  end
@@ -1,8 +1,14 @@
1
1
  module Thesis
2
2
  class RouteConstraint
3
- def self.matches?(request)
3
+ def matches?(request)
4
4
  slug = request.path.to_s.sub(/(\/)+$/,'')
5
- Page.where(slug: slug).select("id").first.present?
5
+ return false if excluded_path?(slug)
6
+ Page.where(slug: slug).size > 0
7
+ end
8
+
9
+ def excluded_path?(path)
10
+ excluded_extensions = [ :jpg, :jpeg, :png, :css, :js, :ico, :pdf ]
11
+ excluded_extensions.any?{ |ext| path.ends_with?(".#{ext}") }
6
12
  end
7
13
  end
8
14
  end