caseadilla 0.0.10 → 0.0.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +0 -1
- data/app/assets/javascripts/caseadilla/caseadilla.js +9 -7
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-article.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-aside.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-blockquote.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-command.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-details.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-div.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-figcaption.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-figure.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-footer.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-h1.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-h2.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-h3.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-h4.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-h5.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-h6.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-header.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-hgroup.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-mark.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-meter.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-nav.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-p.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-pre.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-progress.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-rp.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-rt.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-ruby.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-section.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-summary.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-time.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/wymiframe.css +200 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/wymiframe.html +25 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-article.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-aside.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-blockquote.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-command.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-details.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-div.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-figcaption.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-figure.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-footer.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-h1.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-h2.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-h3.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-h4.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-h5.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-h6.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-header.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-hgroup.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-mark.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-meter.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-nav.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-p.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-pre.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-progress.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-rp.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-rt.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-ruby.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-section.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-summary.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-time.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/wymiframe.css +200 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/wymiframe.html +8 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/pretty/development.html +149 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/pretty/icon.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/pretty/visitor1.eot +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/pretty/visitor1.ttf +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/pretty/visitor1.woff +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/pretty/wymiframe.css +395 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/pretty/wymiframe.html +26 -0
- data/app/assets/javascripts/caseadilla/wymeditor/iframe/pretty/wymiframe.ie.css +21 -0
- data/app/assets/javascripts/caseadilla/wymeditor/jquery.wymeditor.min.js +18 -0
- data/app/assets/javascripts/caseadilla/wymeditor/plugins/embed/jquery.wymeditor.embed.js +82 -0
- data/app/assets/javascripts/caseadilla/wymeditor/plugins/fullscreen/icon_fullscreen.gif +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/plugins/fullscreen/jquery.wymeditor.fullscreen.js +126 -0
- data/app/assets/javascripts/caseadilla/wymeditor/plugins/hovertools/jquery.wymeditor.hovertools.js +51 -0
- data/app/assets/javascripts/caseadilla/wymeditor/plugins/list/jquery.wymeditor.list.js +44 -0
- data/app/assets/javascripts/caseadilla/wymeditor/plugins/rdfa/jquery.wymeditor.rdfa.js +192 -0
- data/app/assets/javascripts/caseadilla/wymeditor/plugins/resizable/jquery.wymeditor.resizable.js +41 -0
- data/app/assets/javascripts/caseadilla/wymeditor/plugins/structured_headings/jquery.wymeditor.structured_headings.js +512 -0
- data/app/assets/javascripts/caseadilla/wymeditor/plugins/structured_headings/ruler_arrow.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/plugins/structured_headings/structured_headings.css +55 -0
- data/app/assets/javascripts/caseadilla/wymeditor/plugins/table/jquery.wymeditor.table.js +761 -0
- data/app/assets/javascripts/caseadilla/wymeditor/plugins/table/table_delete_column.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/plugins/table/table_delete_row.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/plugins/table/table_insert_column.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/plugins/table/table_insert_row.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/plugins/table/table_join_row.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/plugins/tidy/jquery.wymeditor.tidy.js +74 -0
- data/app/assets/javascripts/caseadilla/wymeditor/plugins/tidy/wand.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/popup.html +1 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/compact/icons.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/compact/skin.css +134 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/default/icons.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/default/skin.css +133 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/legacy/icons.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/legacy/skin.css +115 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/minimal/images/bg.header.gif +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/minimal/images/bg.selector.silver.gif +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/minimal/images/bg.wymeditor.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/minimal/images/icons.silver.gif +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/minimal/skin.css +131 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/README.md +20 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/arrow_redo.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/arrow_undo.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/eye.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/lbl-blockquote.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/lbl-h1.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/lbl-h2.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/lbl-h3.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/lbl-h4.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/lbl-h5.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/lbl-h6.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/lbl-p.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/lbl-pre.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/link_add.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/link_break.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/page_code.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/page_paste.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/photo_add.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/right.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/star.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/style.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/table_add.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_align_center.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_align_justify.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_align_left.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_align_right.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_bold.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_heading_1.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_heading_2.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_heading_3.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_heading_4.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_heading_5.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_heading_6.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_indent.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_indent_remove.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_italic.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_list_bullets.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_list_numbers.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_paragraph.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_strikethrough.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_subscript.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_superscript.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_underline.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/skin.css +218 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/skin.js +42 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/wymiframe.css +97 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/seamless/icons.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/seamless/skin.css +306 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/silver/images/bg.header.gif +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/silver/images/bg.selector.silver.gif +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/silver/images/bg.wymeditor.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/silver/images/icons.silver.gif +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/silver/skin.css +297 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/twopanels/icons.png +0 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/twopanels/skin.css +134 -0
- data/app/assets/javascripts/caseadilla/wymeditor/skins/wymeditor_icon.png +0 -0
- data/app/assets/stylesheets/caseadilla/caseadilla.scss +4 -3
- data/app/helpers/caseadilla/caseadilla_helper.rb +2 -2
- data/app/views/layouts/caseadilla_main.html.erb +2 -0
- data/caseadilla.gemspec +1 -1
- data/lib/caseadilla.rb +2 -2
- data/lib/caseadilla/version.rb +1 -1
- data/lib/generators/caseadilla/scaffold/scaffold_generator.rb +1 -1
- metadata +161 -7
- data/app/assets/javascripts/caseadilla/bootstrap3-wysihtml5.js +0 -521
- data/app/assets/javascripts/caseadilla/wysihtml5-0.3.0.min.js +0 -261
- data/app/assets/stylesheets/caseadilla/bootstrap-wysihtml5.css +0 -102
data/app/assets/javascripts/caseadilla/wymeditor/plugins/resizable/jquery.wymeditor.resizable.js
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
/* global -$ */
|
2
|
+
"use strict";
|
3
|
+
|
4
|
+
/**
|
5
|
+
* The resizable plugin makes the wymeditor box vertically resizable.
|
6
|
+
* It it based on the ui.resizable.js plugin of the jQuery UI library.
|
7
|
+
*
|
8
|
+
* The WYMeditor resizable plugin supports all parameters of the jQueryUI
|
9
|
+
* resizable plugin. The parameters are passed like this:
|
10
|
+
*
|
11
|
+
* wym.resizable({ handles: "s,e",
|
12
|
+
* maxHeight: 600 });
|
13
|
+
*
|
14
|
+
* DEPENDENCIES: jQuery UI, jQuery UI resizable
|
15
|
+
*
|
16
|
+
* @param options options for the plugin
|
17
|
+
*/
|
18
|
+
WYMeditor.editor.prototype.resizable = function (options) {
|
19
|
+
var wym = this,
|
20
|
+
$iframe = jQuery(wym._box).find('iframe'),
|
21
|
+
$iframeDiv = jQuery(wym._box).find('.wym_iframe'),
|
22
|
+
// Define some default options
|
23
|
+
defaultOptions = {
|
24
|
+
resize: function () {
|
25
|
+
$iframeDiv.height($iframe.height());
|
26
|
+
},
|
27
|
+
alsoResize: $iframe,
|
28
|
+
handles: "s,e,se",
|
29
|
+
minHeight: 250
|
30
|
+
},
|
31
|
+
// Merge given options with default options. Given options override
|
32
|
+
// default ones.
|
33
|
+
finalOptions = jQuery.extend(defaultOptions, options);
|
34
|
+
|
35
|
+
if (jQuery.isFunction(jQuery.fn.resizable)) {
|
36
|
+
jQuery(wym._box).resizable(finalOptions);
|
37
|
+
} else {
|
38
|
+
WYMeditor.console.error('Oops, jQuery UI.resizable unavailable.');
|
39
|
+
}
|
40
|
+
|
41
|
+
};
|
@@ -0,0 +1,512 @@
|
|
1
|
+
/* jshint maxlen: 90 */
|
2
|
+
"use strict";
|
3
|
+
|
4
|
+
// In case the script is included on a page without WYMeditor, define the
|
5
|
+
// WYMeditor and WYMeditor.editor objects to hold the constants used.
|
6
|
+
if (typeof (WYMeditor) === 'undefined') {
|
7
|
+
/* jshint -W020 */
|
8
|
+
WYMeditor = {};
|
9
|
+
/* jshint +W020 */
|
10
|
+
WYMeditor.HEADING_ELEMENTS = ["h1", "h2", "h3", "h4", "h5", "h6"];
|
11
|
+
WYMeditor.KEY_CODE = {
|
12
|
+
BACKSPACE: 8,
|
13
|
+
ENTER: 13,
|
14
|
+
DELETE: 46
|
15
|
+
};
|
16
|
+
}
|
17
|
+
if (typeof (WYMeditor.editor) === 'undefined') {
|
18
|
+
WYMeditor.editor = {};
|
19
|
+
WYMeditor.editor.prototype = {};
|
20
|
+
}
|
21
|
+
|
22
|
+
WYMeditor.STRUCTURED_HEADINGS_POLYFILL_REQUIRED =
|
23
|
+
jQuery.browser.msie && parseInt(jQuery.browser.version, 10) < 8.0;
|
24
|
+
|
25
|
+
// Constants for class names used in structuring the headings
|
26
|
+
WYMeditor.STRUCTURED_HEADINGS_START_NODE_CLASS = 'wym-structured-headings-start';
|
27
|
+
WYMeditor.STRUCTURED_HEADINGS_LEVEL_CLASSES = ['wym-structured-heading-level1',
|
28
|
+
'wym-structured-heading-level2',
|
29
|
+
'wym-structured-heading-level3',
|
30
|
+
'wym-structured-heading-level4',
|
31
|
+
'wym-structured-heading-level5',
|
32
|
+
'wym-structured-heading-level6'];
|
33
|
+
WYMeditor.STRUCTURED_HEADINGS_NUMBERING_SPAN_CLASS = 'wym-structured-heading-numbering';
|
34
|
+
|
35
|
+
// Key codes for the keyup events that the heading numberings should be
|
36
|
+
// recalculated on
|
37
|
+
WYMeditor.STRUCTURED_HEADINGS_POTENTIAL_HEADING_MODIFICATION_KEYS =
|
38
|
+
[WYMeditor.KEY_CODE.BACKSPACE, WYMeditor.KEY_CODE.DELETE, WYMeditor.KEY_CODE.ENTER];
|
39
|
+
|
40
|
+
/*
|
41
|
+
getHeadingLevel
|
42
|
+
===============
|
43
|
+
|
44
|
+
Returns the integer heading level of the passed heading DOM element. For
|
45
|
+
example, if the passed heading was an `h2` element, the function would
|
46
|
+
return the integer `2`.
|
47
|
+
*/
|
48
|
+
function getHeadingLevel(heading) {
|
49
|
+
return parseInt(heading.nodeName.slice(-1), 10);
|
50
|
+
}
|
51
|
+
|
52
|
+
|
53
|
+
|
54
|
+
/**
|
55
|
+
StructuredHeadingsManager
|
56
|
+
=========================
|
57
|
+
|
58
|
+
A heading structure management object that makes it easier for a user to
|
59
|
+
structure the headings in a document by simplifying the user interface and
|
60
|
+
adding features such as heading numbering.
|
61
|
+
|
62
|
+
@param options A configuration object.
|
63
|
+
@param wym The WYMeditor instance to which the StructuredHeadingsManager
|
64
|
+
object should attach.
|
65
|
+
@class
|
66
|
+
*/
|
67
|
+
function StructuredHeadingsManager(options, wym) {
|
68
|
+
var shm = this;
|
69
|
+
options = jQuery.extend({
|
70
|
+
headingIndentToolSelector: "li.wym_tools_indent a",
|
71
|
+
headingOutdentToolSelector: "li.wym_tools_outdent a",
|
72
|
+
|
73
|
+
enableFixHeadingStructureButton: false,
|
74
|
+
fixHeadingStructureButtonHtml: String() +
|
75
|
+
'<li class="wym_tools_fix_heading_structure">' +
|
76
|
+
'<a name="fix_heading_structure" href="#" title="Fix Heading Structure" ' +
|
77
|
+
'style="background-image: ' +
|
78
|
+
"url('" + wym._options.basePath +
|
79
|
+
"plugins/structured_headings/ruler_arrow.png')" + '">' +
|
80
|
+
'Fix Heading Structure' +
|
81
|
+
'</a>' +
|
82
|
+
'</li>',
|
83
|
+
fixHeadingStructureSelector: "li.wym_tools_fix_heading_structure a",
|
84
|
+
|
85
|
+
headingContainerPanelHtml: String() +
|
86
|
+
'<li class="wym_containers_heading">' +
|
87
|
+
'<a href="#" name="HEADING">Heading</a>' +
|
88
|
+
'</li>',
|
89
|
+
headingContainerPanelSelector: "li.wym_containers_heading a",
|
90
|
+
|
91
|
+
highestAllowableHeadingLevel: 1,
|
92
|
+
lowestAllowableHeadingLevel: 6
|
93
|
+
|
94
|
+
}, options);
|
95
|
+
|
96
|
+
shm._headingElements = WYMeditor.HEADING_ELEMENTS
|
97
|
+
.slice(options.highestAllowableHeadingLevel - 1,
|
98
|
+
options.lowestAllowableHeadingLevel);
|
99
|
+
shm._limitedHeadingSel = shm._headingElements.join(", ");
|
100
|
+
shm._fullHeadingSel = WYMeditor.HEADING_ELEMENTS.join(", ");
|
101
|
+
shm._options = options;
|
102
|
+
shm._wym = wym;
|
103
|
+
|
104
|
+
shm.init();
|
105
|
+
}
|
106
|
+
|
107
|
+
/**
|
108
|
+
init
|
109
|
+
====
|
110
|
+
|
111
|
+
Initializes the heading structure object used in the plugin for the
|
112
|
+
wymeditor instance. Creates the user interface adjustments, binds any
|
113
|
+
required listeners, and applies the necessary CSS stylesheets.
|
114
|
+
*/
|
115
|
+
StructuredHeadingsManager.prototype.init = function () {
|
116
|
+
var shm = this;
|
117
|
+
shm.createUI();
|
118
|
+
shm.bindEvents();
|
119
|
+
shm.addCssStylesheet();
|
120
|
+
};
|
121
|
+
|
122
|
+
/**
|
123
|
+
createUI
|
124
|
+
========
|
125
|
+
|
126
|
+
Creates the structured headings user interface by adding the tools to the
|
127
|
+
tool bar and modifying the container selection panel.
|
128
|
+
*/
|
129
|
+
StructuredHeadingsManager.prototype.createUI = function () {
|
130
|
+
var shm = this,
|
131
|
+
wym = shm._wym,
|
132
|
+
$tools = jQuery(wym._box).find(
|
133
|
+
wym._options.toolsSelector + wym._options.toolsListSelector
|
134
|
+
),
|
135
|
+
$containerItems,
|
136
|
+
$containerLink,
|
137
|
+
i;
|
138
|
+
|
139
|
+
// Add tool panel buttons if necessary
|
140
|
+
if (shm._options.enableFixHeadingStructureButton) {
|
141
|
+
$tools.append(shm._options.fixHeadingStructureButtonHtml);
|
142
|
+
}
|
143
|
+
|
144
|
+
// Remove normal heading links from the containers panel list
|
145
|
+
$containerItems = jQuery(wym._box).find(wym._options.containersSelector)
|
146
|
+
.find('li');
|
147
|
+
for (i = 0; i < $containerItems.length; ++i) {
|
148
|
+
$containerLink = $containerItems.eq(i).find('a');
|
149
|
+
if (jQuery.inArray($containerLink[0].name.toLowerCase(),
|
150
|
+
WYMeditor.HEADING_ELEMENTS) > -1) {
|
151
|
+
$containerItems.eq(i).remove();
|
152
|
+
}
|
153
|
+
}
|
154
|
+
|
155
|
+
// Add new single heading container to the containers panel list
|
156
|
+
$containerItems.eq(0).after(shm._options.headingContainerPanelHtml);
|
157
|
+
};
|
158
|
+
|
159
|
+
/**
|
160
|
+
bindEvents
|
161
|
+
==========
|
162
|
+
|
163
|
+
Binds the click events for the buttons in the tool bar and the container
|
164
|
+
link in the containers panel.
|
165
|
+
*/
|
166
|
+
StructuredHeadingsManager.prototype.bindEvents = function () {
|
167
|
+
var shm = this,
|
168
|
+
wym = shm._wym,
|
169
|
+
$box = jQuery(wym._box),
|
170
|
+
sel;
|
171
|
+
|
172
|
+
// Bind click events to tool buttons
|
173
|
+
$box.find(shm._options.headingOutdentToolSelector).click(function () {
|
174
|
+
sel = wym.selection();
|
175
|
+
shm.changeSelectedHeadingsLevel(sel, "up");
|
176
|
+
});
|
177
|
+
$box.find(shm._options.headingIndentToolSelector).click(function () {
|
178
|
+
sel = wym.selection();
|
179
|
+
shm.changeSelectedHeadingsLevel(sel, "down");
|
180
|
+
});
|
181
|
+
if (shm._options.enableFixHeadingStructureButton) {
|
182
|
+
$box.find(shm._options.fixHeadingStructureSelector).click(function () {
|
183
|
+
shm.fixHeadingStructure();
|
184
|
+
});
|
185
|
+
}
|
186
|
+
|
187
|
+
// Bind click event to the new single heading link
|
188
|
+
$box.find(shm._options.headingContainerPanelSelector).click(function () {
|
189
|
+
shm.switchToHeading(wym.getRootContainer());
|
190
|
+
});
|
191
|
+
};
|
192
|
+
|
193
|
+
/**
|
194
|
+
addCssStylesheet
|
195
|
+
================
|
196
|
+
|
197
|
+
Adds the CSS stylesheet for the heading numbering to the wymeditor iframe
|
198
|
+
and stores the CSS for access through the printCss function.
|
199
|
+
*/
|
200
|
+
StructuredHeadingsManager.prototype.addCssStylesheet = function () {
|
201
|
+
var shm = this,
|
202
|
+
wym = shm._wym,
|
203
|
+
iframeHead = jQuery(wym._doc).find('head')[0],
|
204
|
+
stylesheetHref,
|
205
|
+
cssLink,
|
206
|
+
cssRequest;
|
207
|
+
|
208
|
+
cssLink = wym._doc.createElement('link');
|
209
|
+
cssLink.rel = 'stylesheet';
|
210
|
+
cssLink.type = 'text/css';
|
211
|
+
|
212
|
+
stylesheetHref = '/plugins/structured_headings/structured_headings.css';
|
213
|
+
cssLink.href = '../..' + stylesheetHref; // Adjust path for iframe
|
214
|
+
iframeHead.appendChild(cssLink);
|
215
|
+
|
216
|
+
// Get stylesheet CSS and store it in WYMeditor so that it can be accessed
|
217
|
+
// to put on other pages.
|
218
|
+
cssRequest = new XMLHttpRequest();
|
219
|
+
cssRequest.open('GET', wym._options.basePath + stylesheetHref, false);
|
220
|
+
cssRequest.send('');
|
221
|
+
WYMeditor.structuredHeadingsCSS = cssRequest.responseText;
|
222
|
+
};
|
223
|
+
|
224
|
+
/**
|
225
|
+
canRaiseHeadingLevel
|
226
|
+
====================
|
227
|
+
|
228
|
+
Checks the context of the passed heading DOM node to see if it can validly
|
229
|
+
have its heading level raised. Returns true if the heading's level can
|
230
|
+
validly be raised, false if otherwise.
|
231
|
+
|
232
|
+
@param heading A heading DOM node for checking if it can validly have its
|
233
|
+
heading level raised
|
234
|
+
*/
|
235
|
+
StructuredHeadingsManager.prototype.canRaiseHeadingLevel = function (heading) {
|
236
|
+
var shm = this,
|
237
|
+
headingLevel = getHeadingLevel(heading),
|
238
|
+
headingLevelDifference,
|
239
|
+
nextHeading,
|
240
|
+
nextHeadingLevel;
|
241
|
+
|
242
|
+
// The level of a heading cannot be raised if it is already at the highest
|
243
|
+
// allowable level.
|
244
|
+
if (headingLevel === shm._options.highestAllowableHeadingLevel) {
|
245
|
+
return false;
|
246
|
+
}
|
247
|
+
|
248
|
+
// The level of a heading cannot be raised if the heading level is any
|
249
|
+
// higher than the level of its following heading.
|
250
|
+
nextHeading = jQuery(heading).nextAll(shm._fullHeadingSel)[0];
|
251
|
+
if (nextHeading) {
|
252
|
+
nextHeadingLevel = getHeadingLevel(nextHeading);
|
253
|
+
headingLevelDifference = headingLevel - nextHeadingLevel;
|
254
|
+
if (headingLevelDifference < 0) {
|
255
|
+
return false;
|
256
|
+
}
|
257
|
+
}
|
258
|
+
|
259
|
+
return true;
|
260
|
+
};
|
261
|
+
|
262
|
+
/**
|
263
|
+
canLowerHeadingLevel
|
264
|
+
====================
|
265
|
+
|
266
|
+
Checks the context of the passed heading DOM node to see if it can validly
|
267
|
+
have its heading level lowered. Returns true if the heading's level can
|
268
|
+
validly be lowered, false if otherwise.
|
269
|
+
|
270
|
+
@param heading A heading DOM node for checking if it can validly have its
|
271
|
+
heading level lowered
|
272
|
+
*/
|
273
|
+
StructuredHeadingsManager.prototype.canLowerHeadingLevel = function (heading) {
|
274
|
+
var shm = this,
|
275
|
+
headingLevel = getHeadingLevel(heading),
|
276
|
+
headingLevelDifference,
|
277
|
+
prevHeading,
|
278
|
+
prevHeadingLevel;
|
279
|
+
|
280
|
+
// The level of a heading cannot be lowered if it is already at the lowest
|
281
|
+
// allowable level.
|
282
|
+
if (headingLevel === shm._options.lowestAllowableHeadingLevel) {
|
283
|
+
return false;
|
284
|
+
}
|
285
|
+
|
286
|
+
// The user cannot lower the level of a heading if the heading level is any
|
287
|
+
// lower than the level of its previous heading.
|
288
|
+
prevHeading = jQuery(heading).prevAll(shm._fullHeadingSel)[0];
|
289
|
+
if (prevHeading) {
|
290
|
+
prevHeadingLevel = getHeadingLevel(prevHeading);
|
291
|
+
headingLevelDifference = prevHeadingLevel - headingLevel;
|
292
|
+
if (headingLevelDifference < 0) {
|
293
|
+
return false;
|
294
|
+
}
|
295
|
+
}
|
296
|
+
|
297
|
+
return true;
|
298
|
+
};
|
299
|
+
|
300
|
+
/**
|
301
|
+
changeSelectedHeadingsLevel
|
302
|
+
===========================
|
303
|
+
|
304
|
+
Iterates through the headings in the passed selection and raises or lowers
|
305
|
+
the level of each heading if it is allowable.
|
306
|
+
|
307
|
+
The level of a heading can only be raised if it is not the highest
|
308
|
+
allowable level and if the level of the heading is not higher than the
|
309
|
+
level of its following heading after all headings in the selection have had
|
310
|
+
their heading level attempted to be raised.
|
311
|
+
|
312
|
+
The level of a heading can only be lowered if it is not the lowest
|
313
|
+
allowable level and if the level of the heading is not lower than the level
|
314
|
+
of its preceding heading after all headings in the selection have had their
|
315
|
+
heading level attempted to be lowered.
|
316
|
+
|
317
|
+
@param selection A rangy selection object to have the level of its
|
318
|
+
containing headings raised if allowable.
|
319
|
+
@param upOrDown A string being either "up" or "down" that specifies if the
|
320
|
+
selected headings should have their level raised up or
|
321
|
+
lowered down.
|
322
|
+
*/
|
323
|
+
StructuredHeadingsManager.prototype.changeSelectedHeadingsLevel = function (
|
324
|
+
selection, upOrDown
|
325
|
+
) {
|
326
|
+
var shm = this,
|
327
|
+
wym = shm._wym,
|
328
|
+
shouldRaise = (upOrDown === 'up'),
|
329
|
+
i,
|
330
|
+
iStart = (shouldRaise ? selection.rangeCount - 1 : 0),
|
331
|
+
iLimit = (shouldRaise ? -1 : selection.rangeCount),
|
332
|
+
iterChange = (shouldRaise ? -1 : 1),
|
333
|
+
range,
|
334
|
+
heading,
|
335
|
+
$headingList,
|
336
|
+
j,
|
337
|
+
jStart,
|
338
|
+
jLimit,
|
339
|
+
$selectedNodes;
|
340
|
+
|
341
|
+
// Iterate through the headings in the selection from bottom to top if the
|
342
|
+
// level of the headings should be raised or top to bottom if the level of
|
343
|
+
// the headings should be lowered. This ordering is necessary to ensure
|
344
|
+
// each heading has had its relevant context of surrounding heading levels
|
345
|
+
// modified so that it can be assessed if the heading can validly be raised
|
346
|
+
// or lowered.
|
347
|
+
for (i = iStart; i !== iLimit; i += iterChange) {
|
348
|
+
range = selection.getRangeAt(i);
|
349
|
+
if (range.collapsed) {
|
350
|
+
heading = wym.findUp(range.startContainer,
|
351
|
+
WYMeditor.HEADING_ELEMENTS);
|
352
|
+
shm.changeHeadingLevel(heading, upOrDown);
|
353
|
+
} else {
|
354
|
+
$selectedNodes = jQuery(wym._getSelectedNodes());
|
355
|
+
$headingList = $selectedNodes.filter(shm._fullHeadingSel);
|
356
|
+
if (!$headingList.length && $selectedNodes.length) {
|
357
|
+
// If there are some nodes in the range, but none of the are
|
358
|
+
// headings, it's possible that all of the nodes are contained
|
359
|
+
// within a heading.
|
360
|
+
$headingList = [wym.findUp(
|
361
|
+
$selectedNodes[0],
|
362
|
+
WYMeditor.HEADING_ELEMENTS
|
363
|
+
)];
|
364
|
+
}
|
365
|
+
|
366
|
+
jStart = (shouldRaise ? $headingList.length - 1 : 0);
|
367
|
+
jLimit = (shouldRaise ? -1 : $headingList.length);
|
368
|
+
for (j = jStart; j !== jLimit; j += iterChange) {
|
369
|
+
shm.changeHeadingLevel($headingList[j], upOrDown);
|
370
|
+
}
|
371
|
+
}
|
372
|
+
}
|
373
|
+
};
|
374
|
+
|
375
|
+
/**
|
376
|
+
changeHeadingLevel
|
377
|
+
==================
|
378
|
+
|
379
|
+
If the passed heading DOM node exists in the documet, changes the level of
|
380
|
+
that heading up or down by one level if it is allowable. The heading will not
|
381
|
+
have its level moved up if the heading following it is at a lower level
|
382
|
+
than the passed heading's current level. A heading will not have its
|
383
|
+
level moved down if the heading preceding it is at a higher level than the
|
384
|
+
passed heading's current level.
|
385
|
+
|
386
|
+
@param heading The DOM node of a heading element in the document.
|
387
|
+
@param upOrDown A string either being "up" or "down" that indicates if the
|
388
|
+
heading level should be raised or lowered.
|
389
|
+
*/
|
390
|
+
StructuredHeadingsManager.prototype.changeHeadingLevel = function (
|
391
|
+
heading, upOrDown
|
392
|
+
) {
|
393
|
+
var shm = this,
|
394
|
+
wym = shm._wym,
|
395
|
+
changeLevelUp = (upOrDown === "up"),
|
396
|
+
levelAdjustment = (changeLevelUp ? -1 : 1),
|
397
|
+
headingLevel;
|
398
|
+
|
399
|
+
// If the heading doesn't exist, don't do anything.
|
400
|
+
if (!heading) {
|
401
|
+
return;
|
402
|
+
}
|
403
|
+
|
404
|
+
// Check if the requested change in the heading level is valid. If it is
|
405
|
+
// not valid, don't modify the heading.
|
406
|
+
headingLevel = getHeadingLevel(heading);
|
407
|
+
if (changeLevelUp && !shm.canRaiseHeadingLevel(heading)) {
|
408
|
+
return;
|
409
|
+
}
|
410
|
+
if (!changeLevelUp && !shm.canLowerHeadingLevel(heading)) {
|
411
|
+
return;
|
412
|
+
}
|
413
|
+
|
414
|
+
wym.switchTo(heading, 'h' + (headingLevel + levelAdjustment));
|
415
|
+
};
|
416
|
+
|
417
|
+
/**
|
418
|
+
switchToHeading
|
419
|
+
===============
|
420
|
+
|
421
|
+
Switches the passed DOM node (if it exists) to a heading with the same
|
422
|
+
heading level as the preceding heading to the node. If there is no
|
423
|
+
preceding heading to the node, the node is switched to a heading with the
|
424
|
+
specified highest allowable heading level in the options.
|
425
|
+
|
426
|
+
@param node The DOM node to be switched to a heading.
|
427
|
+
*/
|
428
|
+
StructuredHeadingsManager.prototype.switchToHeading = function (node) {
|
429
|
+
var shm = this,
|
430
|
+
wym = shm._wym,
|
431
|
+
$prevHeading;
|
432
|
+
|
433
|
+
// If the node doesn't exist, don't do anything.
|
434
|
+
if (!node) {
|
435
|
+
return;
|
436
|
+
}
|
437
|
+
|
438
|
+
$prevHeading = jQuery(node).prev(shm._fullHeadingSel);
|
439
|
+
if ($prevHeading.length) {
|
440
|
+
wym.switchTo(node, $prevHeading[0].nodeName);
|
441
|
+
} else {
|
442
|
+
wym.switchTo(node, 'h' + shm._options.highestAllowableHeadingLevel);
|
443
|
+
}
|
444
|
+
};
|
445
|
+
|
446
|
+
/**
|
447
|
+
fixHeadingStructure
|
448
|
+
===================
|
449
|
+
|
450
|
+
Fixes the structure of the headings in the editor if needed so that they
|
451
|
+
follow proper standards of heading usage. The main fix this applies is
|
452
|
+
preventing headings from being more than one level apart while descending
|
453
|
+
(e.g. an H1 followed by an H3 or an H2 followed by an H4).
|
454
|
+
|
455
|
+
This function is pretty simple now and will need more work in the future to
|
456
|
+
make it smarter.
|
457
|
+
*/
|
458
|
+
StructuredHeadingsManager.prototype.fixHeadingStructure = function () {
|
459
|
+
var shm = this,
|
460
|
+
wym = shm._wym,
|
461
|
+
$headings = wym.$body().find(shm._limitedHeadingSel),
|
462
|
+
heading,
|
463
|
+
headingLevel,
|
464
|
+
prevHeadingLevel,
|
465
|
+
i;
|
466
|
+
|
467
|
+
// If there are no headings in the document, don't do anything.
|
468
|
+
if (!$headings.length) {
|
469
|
+
return;
|
470
|
+
}
|
471
|
+
|
472
|
+
prevHeadingLevel = getHeadingLevel($headings[0]);
|
473
|
+
for (i = 1; i < $headings.length; ++i) {
|
474
|
+
heading = $headings[i];
|
475
|
+
headingLevel = getHeadingLevel(heading);
|
476
|
+
if (headingLevel - prevHeadingLevel > 1) {
|
477
|
+
wym.switchTo(heading, 'h' + (prevHeadingLevel + 1));
|
478
|
+
++prevHeadingLevel;
|
479
|
+
} else {
|
480
|
+
prevHeadingLevel = headingLevel;
|
481
|
+
}
|
482
|
+
}
|
483
|
+
};
|
484
|
+
|
485
|
+
/**
|
486
|
+
WYMeditor.printStructuredHeadingsCss
|
487
|
+
====================================
|
488
|
+
|
489
|
+
Function to output the plugin CSS to the console log so that it can be
|
490
|
+
copied over to other pages.
|
491
|
+
*/
|
492
|
+
WYMeditor.printStructuredHeadingsCSS = function () {
|
493
|
+
WYMeditor.console.log(WYMeditor.structuredHeadingsCSS);
|
494
|
+
};
|
495
|
+
|
496
|
+
/**
|
497
|
+
structuredHeadings
|
498
|
+
==================
|
499
|
+
|
500
|
+
Construct and return a heading structure object using the given options
|
501
|
+
object. This should be called in the `postInit` function when initializing
|
502
|
+
a wymeditor instance.
|
503
|
+
|
504
|
+
@param options A configuration object.
|
505
|
+
*/
|
506
|
+
WYMeditor.editor.prototype.structuredHeadings = function (options) {
|
507
|
+
var wym = this,
|
508
|
+
structuredHeadingsManager = new StructuredHeadingsManager(options, wym);
|
509
|
+
wym.structuredHeadingsManager = structuredHeadingsManager;
|
510
|
+
|
511
|
+
return structuredHeadingsManager;
|
512
|
+
};
|