/**
 * 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="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="clear--both"> bar
 *
 *    <div>hello <iframe src="http://google.com"></iframe></div>
 *    ... becomes ...
 *    <div>hello </div>
 *
 *    <center>hello</center>
 *    ... becomes ...
 *    <div class="text--align-center">hello</div>
 */
const EditorRules = {
  /**
   * CSS Class white-list
   * Following CSS classes won't be removed when parsed by the wysihtml5 HTML parser
   */
  classes: {
    'clear--both': 1,
    'clear--left': 1,
    'clear--right': 1,
    'float--left': 1,
    'float--right': 1,
    'text--align-center': 1,
    'text--align-justify': 1,
    'text--align-left': 1,
    'text--align-right': 1,
    'text--annotated': 1,
    link: 1,
    arrow: 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 "text-align-*")
   *                            <p align="center">foo</p> ... becomes ... <p> class="text-align-center">foo</p>
   *                          - clear_br:    converts clear attribute values left/right/all/both to their corresponding css class "clear-*"
   *                            <br clear="all"> ... becomes ... <br class="clear-both">
   *                          - align_img:    converts align attribute values (right/left) on <img> to their corresponding css class "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:bert@foo.com", "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: '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: 0,
      check_attributes: {
        src: 'href',
        width: 'numbers',
        height: 'numbers',
        frameborder: 'numbers',
        allowfullscreen: 'alt',
      },
    },
    figcaption: {
      rename_tag: 'div',
    },
    a: {
      check_attributes: {
        href: 'href', // if you compiled master manually then change this from 'url' to 'href'
        rel: 'preserve',
        'data-annotation-id': 'preserve',
        'data-annotation-text': 'preserve',
      },
      set_attributes: {
        rel: 'nofollow',
        target: '_blank',
      },
    },
    img: {
      check_attributes: {
        width: 'numbers',
        alt: 'alt',
        title: 'alt',
        src: 'src', // 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: '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: 'text--align-center',
    },
    audio: {
      remove: 0,
      set_attributes: {
        controls: 'controls',
      },
      check_attributes: {
        src: 'src', // if you compiled master manually then change this from 'url' to 'src'
      },
    },
    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',
    },
  },
};

export default EditorRules;
