Module: CamaleonCms::ShortCodeHelper

Included in:
CamaleonController
Defined in:
app/helpers/camaleon_cms/short_code_helper.rb

Overview

Camaleon CMS is a content management system

Copyright (C) 2015 by Owen Peredo Diaz
Email: [email protected]
This program is free software: you can redistribute it and/or modify   it under the terms of the GNU Affero General Public License as  published by the Free Software Foundation, either version 3 of the  License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,  but WITHOUT ANY WARRANTY; without even the implied warranty of  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the  GNU Affero General Public License (GPLv3) for more details.

Instance Method Summary collapse

Instance Method Details

#cama_strip_shortcodes(text) ⇒ Object

remove all shortcodes from text Arguments

text: String that contains shortcodes

return String


117
118
119
# File 'app/helpers/camaleon_cms/short_code_helper.rb', line 117

def cama_strip_shortcodes(text)
  text.gsub(/#{cama_reg_shortcode}/, "")
end

#do_shortcode(content, args = {}) ⇒ Object

run all shortcodes in the content content: (string) text to find a short codes args: custom arguments to pass for short codes render, sample: my_model, a: true

if args != Hash, this will re send as args = {owner: args}
args should be include the owner model who is doing the action to optimize DB queries

sample: do_shortcode(“hello [greeting 'world']!”, @my_post) ==> “hello world!” sample: do_shortcode(“hello [greeting 'world']”, 'asd', owner: @my_post) return rendered string


104
105
106
107
108
109
110
111
# File 'app/helpers/camaleon_cms/short_code_helper.rb', line 104

def do_shortcode(content, args = {})
  args = {owner: args} unless args.is_a?(Hash)
  content.scan(/#{cama_reg_shortcode}/) do |item|
    shortcode, code, space, attrs = item
    content = content.sub(shortcode, _eval_shortcode(code, attrs, args))
  end
  content
end

#render_shortcode(text, key, template = nil) ⇒ Object

render direct a shortcode text: text that contain the shortcode key: shortcode key template: template to render, if nil this will render default render file Also can be a function to execute that instead a render, sample: lambda{|attrs, args| return “my custom content”; } render_shortcode(“asda dasdasdas[owen a='1'] [bbb] sdasdas dasd as das[owen a=213]”, “owen”, lambda{|attrs, args| puts attrs; return “my test”; })


127
128
129
130
131
132
133
# File 'app/helpers/camaleon_cms/short_code_helper.rb', line 127

def render_shortcode(text, key, template = nil)
  text.scan(/#{cama_reg_shortcode(key)}/).each do |item|
    shortcode, code, space, attrs = item
    text = text.sub(shortcode, _eval_shortcode(code, attrs, {}, template))
  end
  text
end

#shortcode_add(key, template = nil, descr = '') ⇒ Object

add shortcode key: shortcode key template: template to render, if nil will render “shortcode_templates/<key>” Also can be a function to execute that instead a render, sample: lambda{|attrs, args| return “my custom content”; } descr: description for shortcode


77
78
79
80
81
# File 'app/helpers/camaleon_cms/short_code_helper.rb', line 77

def shortcode_add(key, template = nil, descr = '')
  @_shortcodes << key
  @_shortcodes_template = @_shortcodes_template.merge({"#{key}"=> template}) if template.present?
  @_shortcodes_descr[key] = descr if descr.present?
end

#shortcode_change_template(key, template = nil) ⇒ Object

add or update shortcode template key: chortcode key to add or update template: template to render, if nil will render “shortcode_templates/<key>”


86
87
88
# File 'app/helpers/camaleon_cms/short_code_helper.rb', line 86

def shortcode_change_template(key, template = nil)
  @_shortcodes_template[key] = template
end

#shortcode_delete(key) ⇒ Object

delete shortcode key: chortcode key to delete


92
93
94
# File 'app/helpers/camaleon_cms/short_code_helper.rb', line 92

def shortcode_delete(key)
  @_shortcodes.delete(key)
end

#shortcodes_initObject

Internal method


11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'app/helpers/camaleon_cms/short_code_helper.rb', line 11

def shortcodes_init
  @_shortcodes = []
  @_shortcodes_template = {}
  @_shortcodes_descr = {}

  shortcode_add("widget", nil, "Renderize the widget content in this place.
              Don't forget to create and copy the shortcode of your widgets in appearance -> widgets
              Sample: [widget widget_key]")

  shortcode_add("load_libraries",
                lambda{|attrs, args| cama_load_libraries(*attrs["data"].to_s.split(",")); return ""; },
                "Permit to load libraries on demand, sample: [load_libraries data='datepicker,tinymce']")

  shortcode_add("asset",
                lambda{|attrs, args|
                  url = attrs["as_path"].present? ? ActionController::Base.helpers.asset_url(attrs["file"]) : ActionController::Base.helpers.asset_url(attrs["file"])
                  if attrs["image"].present?
                    ActionController::Base.helpers.image_tag(attrs["file"], class: attrs["class"], style: attrs["style"])
                  else
                    url
                  end
                },
                "Permit to generate an asset url (
                  add file='' asset file path,
                  add as_path='true' to generate only the path and not the full url,
                  add class='my_class' to setup image class,
                  add style='height: 100px; width: 200px;...' to setup image style,
                  add image='true' to generate the image tag with this url),
                sample: <img src=\"[asset as_path='true' file='themes/my_theme/assets/img/signature.png']\" /> or [asset image='true' file='themes/my_theme/assets/img/signature.png' style='height: 50px;']")

  shortcode_add("data",
                lambda{|attrs, args|
                  cama_shortcode_data(attrs, args) rescue ""
                },
                "Permit to generate specific data of a post.
                Attributes:
                  object: (String, defaut post) Model name: post | posttype | category | posttag | site | user |theme | navmenu
                  id: (Integer) Post id
                  key: (String) Post slug
                  field: (String) Custom field key, you can add render_field='true' to render field as html element, also you can add index=2 to indicate the value in position 2 for multitple values
                  attrs: (String) attribute name
                          post: title | created_at | excerpt | url | link | thumb | updated_at | author_name | author_url
                          posttype: title | created_at | excerpt | url | link | thumb | updated_at
                          category: title | created_at | excerpt | url | link | thumb | updated_at
                          posttag: title | created_at | excerpt | url | link | thumb | updated_at
                          site: title | created_at | excerpt | url | link | thumb | updated_at
                          user: title | created_at | excerpt | url | link | thumb | updated_at
                          theme: title | created_at | excerpt | url | link | thumb | updated_at
                          navmenu: title | created_at | excerpt | url | link | thumb | updated_at
                  Note: If id and key is not present, then will be rendered for current model
                Sample:
                  [data id='122' attr='title'] ==> return the title of post with id = 122
                  [data key='contact' attr='url'] ==> return the url of post with slug = contact
                  [data key='contact' attr='link'] ==> return the link with title as text of the link of post with slug = contact
                  [data object='site' attr='url'] ==> return the url of currrent site
                  [data key='page' object='posttype' attr='url'] ==> return the url of post_type with slug = page
                  [data field=icon index=2] ==> return the second value (multiple values) for this custom field with key=icon of current object
                  [data key='contact' field='sub_title'] ==> return the value of the custom_field with key=sub_title registered for post.slug = contact
                  [data object='site' field='sub_title'] ==> return the value of the custom_field with key=sub_title registered for current_site")
end