Module: ActiveAdmin::Editor

Defined in:
lib/active_admin/editor/config.rb,
lib/active_admin/editor/engine.rb,
lib/active_admin/editor/policy.rb,
lib/active_admin/editor/version.rb,
lib/active_admin/editor/parser_rules.rb

Defined Under Namespace

Classes: Configuration, Engine, Policy

Constant Summary collapse

VERSION =
'1.1.0'
PARSER_RULES =

Full HTML5 compatibility rule set These rules define which tags and CSS classes are supported and which tags should be specially treated.

Examples based on this rule set:

<a href="http://foobar.com">foo</a>
... becomes ...
<a href="http://foobar.com" target="_blank" rel="nofollow">foo</a>

<img align="left" src="http://foobar.com/image.png">
... becomes ...
<img class="wysiwyg-float-left" src="http://foobar.com/image.png" alt="">

<div>foo<script>alert(document.cookie)</script></div>
... becomes ...
<div>foo</div>

<marquee>foo</marquee>
... becomes ...
<span>foo</span>

foo <br clear="both"> bar
... becomes ...
foo <br class="wysiwyg-clear-both"> bar

<div>hello <iframe src="http://google.com"></iframe></div>
... becomes ...
<div>hello </div>

<center>hello</center>
... becomes ...
<div class="wysiwyg-text-align-center">hello</div>
{
  # CSS Class white-list
  # Following CSS classes won't be removed when parsed by the wysihtml5 HTML parser
  'classes' => {
    'wysiwyg-clear-both' => 1,
    'wysiwyg-clear-left' => 1,
    'wysiwyg-clear-right' => 1,
    'wysiwyg-color-aqua' => 1,
    'wysiwyg-color-black' => 1,
    'wysiwyg-color-blue' => 1,
    'wysiwyg-color-fuchsia' => 1,
    'wysiwyg-color-gray' => 1,
    'wysiwyg-color-green' => 1,
    'wysiwyg-color-lime' => 1,
    'wysiwyg-color-maroon' => 1,
    'wysiwyg-color-navy' => 1,
    'wysiwyg-color-olive' => 1,
    'wysiwyg-color-purple' => 1,
    'wysiwyg-color-red' => 1,
    'wysiwyg-color-silver' => 1,
    'wysiwyg-color-teal' => 1,
    'wysiwyg-color-white' => 1,
    'wysiwyg-color-yellow' => 1,
    'wysiwyg-float-left' => 1,
    'wysiwyg-float-right' => 1,
    'wysiwyg-font-size-large' => 1,
    'wysiwyg-font-size-larger' => 1,
    'wysiwyg-font-size-medium' => 1,
    'wysiwyg-font-size-small' => 1,
    'wysiwyg-font-size-smaller' => 1,
    'wysiwyg-font-size-x-large' => 1,
    'wysiwyg-font-size-x-small' => 1,
    'wysiwyg-font-size-xx-large' => 1,
    'wysiwyg-font-size-xx-small' => 1,
    'wysiwyg-text-align-center' => 1,
    'wysiwyg-text-align-justify' => 1,
    'wysiwyg-text-align-left' => 1,
    'wysiwyg-text-align-right' => 1
  },
  # Tag list
  #
  # The following options are available:
  #
  #    - add_class:        converts and deletes the given HTML4 attribute (align, clear, ...) via the given method to a css class
  #                        The following methods are implemented in wysihtml5.dom.parse:
  #                          - align_text:  converts align attribute values (right/left/center/justify) to their corresponding css class "wysiwyg-text-align-*")
  #                            <p align="center">foo</p> ... becomes ... <p> class="wysiwyg-text-align-center">foo</p>
  #                          - clear_br:    converts clear attribute values left/right/all/both to their corresponding css class "wysiwyg-clear-*"
  #                            <br clear="all"> ... becomes ... <br class="wysiwyg-clear-both">
  #                          - align_img:    converts align attribute values (right/left) on <img> to their corresponding css class "wysiwyg-float-*"
  #                          
  #    - remove:             removes the element and its content
  #
  #    - rename_tag:         renames the element to the given tag
  #
  #    - set_class:          adds the given class to the element (note: make sure that the class is in the "classes" white list above)
  #
  #    - set_attributes:     sets/overrides the given attributes
  #
  #    - check_attributes:   checks the given HTML attribute via the given method
  #                            - url:            allows only valid urls (starting with http:// or https://)
  #                            - src:            allows something like "/foobar.jpg", "http://google.com", ...
  #                            - href:           allows something like "mailto:[email protected]", "http://google.com", "/foobar.jpg"
  #                            - alt:            strips unwanted characters. if the attribute is not set, then it gets set (to ensure valid and compatible HTML)
  #                            - numbers:  ensures that the attribute only contains numeric characters
  'tags' => {
    'tr' => {
      'add_class' => {
        'align' => 'align_text'
      }
    },
    'strike' => {
      'remove' => 1
    },
    'form' => {
      'rename_tag' => 'div'
    },
    'rt' => {
      'rename_tag' => 'span'
    },
    'code' => {},
    'acronym' => {
      'rename_tag' => 'span'
    },
    'br' => {
      'add_class' => {
        'clear' => 'clear_br'
      }
    },
    'details' => {
      'rename_tag' => 'div'
    },
    'h4' => {
      'add_class' => {
        'align' => 'align_text'
      }
    },
    'em' => {},
    'title' => {
      'remove' => 1
    },
    'multicol' => {
      'rename_tag' => 'div'
    },
    'figure' => {
      'rename_tag' => 'div'
    },
    'xmp' => {
      'rename_tag' => 'span'
    },
    'small' => {
      'rename_tag' => 'span',
      'set_class' => 'wysiwyg-font-size-smaller'
    },
    'area' => {
      'remove' => 1
    },
    'time' => {
      'rename_tag' => 'span'
    },
    'dir' => {
      'rename_tag' => 'ul'
    },
    'bdi' => {
      'rename_tag' => 'span'
    },
    'command' => {
      'remove' => 1
    },
    'ul' => {},
    'progress' => {
      'rename_tag' => 'span'
    },
    'dfn' => {
      'rename_tag' => 'span'
    },
    'iframe' => {
      'remove' => 1
    },
    'figcaption' => {
      'rename_tag' => 'div'
    },
    'a' => {
      'check_attributes' => {
        'href' => 'url' # if you compiled master manually then change this from 'url' to 'href'
      },
      'set_attributes' => {
        'target' => '_blank'
      }
    },
    'img' => {
      'check_attributes' => {
        'width' => 'numbers',
        'alt' => 'alt',
        'src' => 'url', # if you compiled master manually then change this from 'url' to 'src'
        'height' => 'numbers'
      },
      'add_class' => {
        'align' => 'align_img'
      }
    },
    'rb' => {
      'rename_tag' => 'span'
    },
    'footer' => {
      'rename_tag' => 'div'
    },
    'noframes' => {
      'remove' => 1
    },
    'abbr' => {
      'rename_tag' => 'span'
    },
    'u' => {},
    'bgsound' => {
      'remove' => 1
    },
    'sup' => {
      'rename_tag' => 'span'
    },
    'address' => {
      'rename_tag' => 'div'
    },
    'basefont' => {
      'remove' => 1
    },
    'nav' => {
      'rename_tag' => 'div'
    },
    'h1' => {
      'add_class' => {
        'align' => 'align_text'
      }
    },
    'head' => {
      'remove' => 1
    },
    'tbody' => {
      'add_class' => {
        'align' => 'align_text'
      }
    },
    'dd' => {
      'rename_tag' => 'div'
    },
    's' => {
      'rename_tag' => 'span'
    },
    'li' => {},
    'td' => {
      'check_attributes' => {
        'rowspan' => 'numbers',
        'colspan' => 'numbers'
      },
      'add_class' => {
        'align' => 'align_text'
      }
    },
    'object' => {
      'remove' => 1
    },
    'div' => {
      'add_class' => {
        'align' => 'align_text'
      }
    },
    'option' => {
      'rename_tag' => 'span'
    },
    'select' => {
      'rename_tag' => 'span'
    },
    'i' => {},
    'track' => {
      'remove' => 1
    },
    'wbr' => {
      'remove' => 1
    },
    'fieldset' => {
      'rename_tag' => 'div'
    },
    'big' => {
      'rename_tag' => 'span',
      'set_class' => 'wysiwyg-font-size-larger'
    },
    'button' => {
      'rename_tag' => 'span'
    },
    'noscript' => {
      'remove' => 1
    },
    'svg' => {
      'remove' => 1
    },
    'input' => {
      'remove' => 1
    },
    'table' => {},
    'keygen' => {
      'remove' => 1
    },
    'h5' => {
      'add_class' => {
        'align' => 'align_text'
      }
    },
    'meta' => {
      'remove' => 1
    },
    'map' => {
      'rename_tag' => 'div'
    },
    'isindex' => {
      'remove' => 1
    },
    'mark' => {
      'rename_tag' => 'span'
    },
    'caption' => {
      'add_class' => {
        'align' => 'align_text'
      }
    },
    'tfoot' => {
      'add_class' => {
        'align' => 'align_text'
      }
    },
    'base' => {
      'remove' => 1
    },
    'video' => {
      'remove' => 1
    },
    'strong' => {},
    'canvas' => {
      'remove' => 1
    },
    'output' => {
      'rename_tag' => 'span'
    },
    'marquee' => {
      'rename_tag' => 'span'
    },
    'b' => {},
    'q' => {
      'check_attributes' => {
        'cite' => 'url'
      }
    },
    'applet' => {
      'remove' => 1
    },
    'span' => {},
    'rp' => {
      'rename_tag' => 'span'
    },
    'spacer' => {
      'remove' => 1
    },
    'source' => {
      'remove' => 1
    },
    'aside' => {
      'rename_tag' => 'div'
    },
    'frame' => {
      'remove' => 1
    },
    'section' => {
      'rename_tag' => 'div'
    },
    'body' => {
      'rename_tag' => 'div'
    },
    'ol' => {},
    'nobr' => {
      'rename_tag' => 'span'
    },
    'html' => {
      'rename_tag' => 'div'
    },
    'summary' => {
      'rename_tag' => 'span'
    },
    'var' => {
      'rename_tag' => 'span'
    },
    'del' => {
      'remove' => 1
    },
    'blockquote' => {
      'check_attributes' => {
        'cite' => 'url'
      }
    },
    'style' => {
      'remove' => 1
    },
    'device' => {
      'remove' => 1
    },
    'meter' => {
      'rename_tag' => 'span'
    },
    'h3' => {
      'add_class' => {
        'align' => 'align_text'
      }
    },
    'textarea' => {
      'rename_tag' => 'span'
    },
    'embed' => {
      'remove' => 1
    },
    'hgroup' => {
      'rename_tag' => 'div'
    },
    'font' => {
      'rename_tag' => 'span',
      'add_class' => {
        'size' => 'size_font'
      }
    },
    'tt' => {
      'rename_tag' => 'span'
    },
    'noembed' => {
      'remove' => 1
    },
    'thead' => {
      'add_class' => {
        'align' => 'align_text'
      }
    },
    'blink' => {
      'rename_tag' => 'span'
    },
    'plaintext' => {
      'rename_tag' => 'span'
    },
    'xml' => {
      'remove' => 1
    },
    'h6' => {
      'add_class' => {
        'align' => 'align_text'
      }
    },
    'param' => {
      'remove' => 1
    },
    'th' => {
      'check_attributes' => {
        'rowspan' => 'numbers',
        'colspan' => 'numbers'
      },
      'add_class' => {
        'align' => 'align_text'
      }
    },
    'legend' => {
      'rename_tag' => 'span'
    },
    'hr' => {},
    'label' => {
      'rename_tag' => 'span'
    },
    'dl' => {
      'rename_tag' => 'div'
    },
    'kbd' => {
      'rename_tag' => 'span'
    },
    'listing' => {
      'rename_tag' => 'div'
    },
    'dt' => {
      'rename_tag' => 'span'
    },
    'nextid' => {
      'remove' => 1
    },
    'pre' => {},
    'center' => {
      'rename_tag' => 'div',
      'set_class' => 'wysiwyg-text-align-center'
    },
    'audio' => {
      'remove' => 1
    },
    'datalist' => {
      'rename_tag' => 'span'
    },
    'samp' => {
      'rename_tag' => 'span'
    },
    'col' => {
      'remove' => 1
    },
    'article' => {
      'rename_tag' => 'div'
    },
    'cite' => {},
    'link' => {
      'remove' => 1
    },
    'script' => {
      'remove' => 1
    },
    'bdo' => {
      'rename_tag' => 'span'
    },
    'menu' => {
      'rename_tag' => 'ul'
    },
    'colgroup' => {
      'remove' => 1
    },
    'ruby' => {
      'rename_tag' => 'span'
    },
    'h2' => {
      'add_class' => {
        'align' => 'align_text'
      }
    },
    'ins' => {
      'rename_tag' => 'span'
    },
    'p' => {
      'add_class' => {
        'align' => 'align_text'
      }
    },
    'sub' => {
      'rename_tag' => 'span'
    },
    'comment' => {
      'remove' => 1
    },
    'frameset' => {
      'remove' => 1
    },
    'optgroup' => {
      'rename_tag' => 'span'
    },
    'header' => {
      'rename_tag' => 'div'
    }
  }
}

Class Method Summary collapse

Class Method Details

.configurationObject

Returns the current Configuration



7
8
9
# File 'lib/active_admin/editor/config.rb', line 7

def configuration
  @configuration ||= Configuration.new
end

.configure {|configuration| ... } ⇒ Object

Yields the Configuration

Yields:



12
13
14
# File 'lib/active_admin/editor/config.rb', line 12

def configure
  yield configuration
end