caseadilla 0.0.10 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (171) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +0 -1
  3. data/app/assets/javascripts/caseadilla/caseadilla.js +9 -7
  4. data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-article.png +0 -0
  5. data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-aside.png +0 -0
  6. data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-blockquote.png +0 -0
  7. data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-command.png +0 -0
  8. data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-details.png +0 -0
  9. data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-div.png +0 -0
  10. data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-figcaption.png +0 -0
  11. data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-figure.png +0 -0
  12. data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-footer.png +0 -0
  13. data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-h1.png +0 -0
  14. data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-h2.png +0 -0
  15. data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-h3.png +0 -0
  16. data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-h4.png +0 -0
  17. data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-h5.png +0 -0
  18. data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-h6.png +0 -0
  19. data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-header.png +0 -0
  20. data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-hgroup.png +0 -0
  21. data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-mark.png +0 -0
  22. data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-meter.png +0 -0
  23. data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-nav.png +0 -0
  24. data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-p.png +0 -0
  25. data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-pre.png +0 -0
  26. data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-progress.png +0 -0
  27. data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-rp.png +0 -0
  28. data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-rt.png +0 -0
  29. data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-ruby.png +0 -0
  30. data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-section.png +0 -0
  31. data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-summary.png +0 -0
  32. data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/lbl-time.png +0 -0
  33. data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/wymiframe.css +200 -0
  34. data/app/assets/javascripts/caseadilla/wymeditor/iframe/default/wymiframe.html +25 -0
  35. data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-article.png +0 -0
  36. data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-aside.png +0 -0
  37. data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-blockquote.png +0 -0
  38. data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-command.png +0 -0
  39. data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-details.png +0 -0
  40. data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-div.png +0 -0
  41. data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-figcaption.png +0 -0
  42. data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-figure.png +0 -0
  43. data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-footer.png +0 -0
  44. data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-h1.png +0 -0
  45. data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-h2.png +0 -0
  46. data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-h3.png +0 -0
  47. data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-h4.png +0 -0
  48. data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-h5.png +0 -0
  49. data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-h6.png +0 -0
  50. data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-header.png +0 -0
  51. data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-hgroup.png +0 -0
  52. data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-mark.png +0 -0
  53. data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-meter.png +0 -0
  54. data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-nav.png +0 -0
  55. data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-p.png +0 -0
  56. data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-pre.png +0 -0
  57. data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-progress.png +0 -0
  58. data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-rp.png +0 -0
  59. data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-rt.png +0 -0
  60. data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-ruby.png +0 -0
  61. data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-section.png +0 -0
  62. data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-summary.png +0 -0
  63. data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/lbl-time.png +0 -0
  64. data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/wymiframe.css +200 -0
  65. data/app/assets/javascripts/caseadilla/wymeditor/iframe/legacy/wymiframe.html +8 -0
  66. data/app/assets/javascripts/caseadilla/wymeditor/iframe/pretty/development.html +149 -0
  67. data/app/assets/javascripts/caseadilla/wymeditor/iframe/pretty/icon.png +0 -0
  68. data/app/assets/javascripts/caseadilla/wymeditor/iframe/pretty/visitor1.eot +0 -0
  69. data/app/assets/javascripts/caseadilla/wymeditor/iframe/pretty/visitor1.ttf +0 -0
  70. data/app/assets/javascripts/caseadilla/wymeditor/iframe/pretty/visitor1.woff +0 -0
  71. data/app/assets/javascripts/caseadilla/wymeditor/iframe/pretty/wymiframe.css +395 -0
  72. data/app/assets/javascripts/caseadilla/wymeditor/iframe/pretty/wymiframe.html +26 -0
  73. data/app/assets/javascripts/caseadilla/wymeditor/iframe/pretty/wymiframe.ie.css +21 -0
  74. data/app/assets/javascripts/caseadilla/wymeditor/jquery.wymeditor.min.js +18 -0
  75. data/app/assets/javascripts/caseadilla/wymeditor/plugins/embed/jquery.wymeditor.embed.js +82 -0
  76. data/app/assets/javascripts/caseadilla/wymeditor/plugins/fullscreen/icon_fullscreen.gif +0 -0
  77. data/app/assets/javascripts/caseadilla/wymeditor/plugins/fullscreen/jquery.wymeditor.fullscreen.js +126 -0
  78. data/app/assets/javascripts/caseadilla/wymeditor/plugins/hovertools/jquery.wymeditor.hovertools.js +51 -0
  79. data/app/assets/javascripts/caseadilla/wymeditor/plugins/list/jquery.wymeditor.list.js +44 -0
  80. data/app/assets/javascripts/caseadilla/wymeditor/plugins/rdfa/jquery.wymeditor.rdfa.js +192 -0
  81. data/app/assets/javascripts/caseadilla/wymeditor/plugins/resizable/jquery.wymeditor.resizable.js +41 -0
  82. data/app/assets/javascripts/caseadilla/wymeditor/plugins/structured_headings/jquery.wymeditor.structured_headings.js +512 -0
  83. data/app/assets/javascripts/caseadilla/wymeditor/plugins/structured_headings/ruler_arrow.png +0 -0
  84. data/app/assets/javascripts/caseadilla/wymeditor/plugins/structured_headings/structured_headings.css +55 -0
  85. data/app/assets/javascripts/caseadilla/wymeditor/plugins/table/jquery.wymeditor.table.js +761 -0
  86. data/app/assets/javascripts/caseadilla/wymeditor/plugins/table/table_delete_column.png +0 -0
  87. data/app/assets/javascripts/caseadilla/wymeditor/plugins/table/table_delete_row.png +0 -0
  88. data/app/assets/javascripts/caseadilla/wymeditor/plugins/table/table_insert_column.png +0 -0
  89. data/app/assets/javascripts/caseadilla/wymeditor/plugins/table/table_insert_row.png +0 -0
  90. data/app/assets/javascripts/caseadilla/wymeditor/plugins/table/table_join_row.png +0 -0
  91. data/app/assets/javascripts/caseadilla/wymeditor/plugins/tidy/jquery.wymeditor.tidy.js +74 -0
  92. data/app/assets/javascripts/caseadilla/wymeditor/plugins/tidy/wand.png +0 -0
  93. data/app/assets/javascripts/caseadilla/wymeditor/popup.html +1 -0
  94. data/app/assets/javascripts/caseadilla/wymeditor/skins/compact/icons.png +0 -0
  95. data/app/assets/javascripts/caseadilla/wymeditor/skins/compact/skin.css +134 -0
  96. data/app/assets/javascripts/caseadilla/wymeditor/skins/default/icons.png +0 -0
  97. data/app/assets/javascripts/caseadilla/wymeditor/skins/default/skin.css +133 -0
  98. data/app/assets/javascripts/caseadilla/wymeditor/skins/legacy/icons.png +0 -0
  99. data/app/assets/javascripts/caseadilla/wymeditor/skins/legacy/skin.css +115 -0
  100. data/app/assets/javascripts/caseadilla/wymeditor/skins/minimal/images/bg.header.gif +0 -0
  101. data/app/assets/javascripts/caseadilla/wymeditor/skins/minimal/images/bg.selector.silver.gif +0 -0
  102. data/app/assets/javascripts/caseadilla/wymeditor/skins/minimal/images/bg.wymeditor.png +0 -0
  103. data/app/assets/javascripts/caseadilla/wymeditor/skins/minimal/images/icons.silver.gif +0 -0
  104. data/app/assets/javascripts/caseadilla/wymeditor/skins/minimal/skin.css +131 -0
  105. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/README.md +20 -0
  106. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/arrow_redo.png +0 -0
  107. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/arrow_undo.png +0 -0
  108. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/eye.png +0 -0
  109. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/lbl-blockquote.png +0 -0
  110. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/lbl-h1.png +0 -0
  111. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/lbl-h2.png +0 -0
  112. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/lbl-h3.png +0 -0
  113. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/lbl-h4.png +0 -0
  114. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/lbl-h5.png +0 -0
  115. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/lbl-h6.png +0 -0
  116. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/lbl-p.png +0 -0
  117. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/lbl-pre.png +0 -0
  118. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/link_add.png +0 -0
  119. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/link_break.png +0 -0
  120. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/page_code.png +0 -0
  121. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/page_paste.png +0 -0
  122. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/photo_add.png +0 -0
  123. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/right.png +0 -0
  124. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/star.png +0 -0
  125. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/style.png +0 -0
  126. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/table_add.png +0 -0
  127. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_align_center.png +0 -0
  128. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_align_justify.png +0 -0
  129. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_align_left.png +0 -0
  130. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_align_right.png +0 -0
  131. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_bold.png +0 -0
  132. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_heading_1.png +0 -0
  133. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_heading_2.png +0 -0
  134. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_heading_3.png +0 -0
  135. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_heading_4.png +0 -0
  136. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_heading_5.png +0 -0
  137. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_heading_6.png +0 -0
  138. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_indent.png +0 -0
  139. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_indent_remove.png +0 -0
  140. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_italic.png +0 -0
  141. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_list_bullets.png +0 -0
  142. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_list_numbers.png +0 -0
  143. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_paragraph.png +0 -0
  144. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_strikethrough.png +0 -0
  145. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_subscript.png +0 -0
  146. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_superscript.png +0 -0
  147. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/images/text_underline.png +0 -0
  148. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/skin.css +218 -0
  149. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/skin.js +42 -0
  150. data/app/assets/javascripts/caseadilla/wymeditor/skins/refine/wymiframe.css +97 -0
  151. data/app/assets/javascripts/caseadilla/wymeditor/skins/seamless/icons.png +0 -0
  152. data/app/assets/javascripts/caseadilla/wymeditor/skins/seamless/skin.css +306 -0
  153. data/app/assets/javascripts/caseadilla/wymeditor/skins/silver/images/bg.header.gif +0 -0
  154. data/app/assets/javascripts/caseadilla/wymeditor/skins/silver/images/bg.selector.silver.gif +0 -0
  155. data/app/assets/javascripts/caseadilla/wymeditor/skins/silver/images/bg.wymeditor.png +0 -0
  156. data/app/assets/javascripts/caseadilla/wymeditor/skins/silver/images/icons.silver.gif +0 -0
  157. data/app/assets/javascripts/caseadilla/wymeditor/skins/silver/skin.css +297 -0
  158. data/app/assets/javascripts/caseadilla/wymeditor/skins/twopanels/icons.png +0 -0
  159. data/app/assets/javascripts/caseadilla/wymeditor/skins/twopanels/skin.css +134 -0
  160. data/app/assets/javascripts/caseadilla/wymeditor/skins/wymeditor_icon.png +0 -0
  161. data/app/assets/stylesheets/caseadilla/caseadilla.scss +4 -3
  162. data/app/helpers/caseadilla/caseadilla_helper.rb +2 -2
  163. data/app/views/layouts/caseadilla_main.html.erb +2 -0
  164. data/caseadilla.gemspec +1 -1
  165. data/lib/caseadilla.rb +2 -2
  166. data/lib/caseadilla/version.rb +1 -1
  167. data/lib/generators/caseadilla/scaffold/scaffold_generator.rb +1 -1
  168. metadata +161 -7
  169. data/app/assets/javascripts/caseadilla/bootstrap3-wysihtml5.js +0 -521
  170. data/app/assets/javascripts/caseadilla/wysihtml5-0.3.0.min.js +0 -261
  171. data/app/assets/stylesheets/caseadilla/bootstrap-wysihtml5.css +0 -102
@@ -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
+ };