diff src/development/plugins/plaintext.js @ 0:4c4fc447baea

start with sceditor-3.1.1
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 04 Aug 2022 15:21:29 -0600
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/development/plugins/plaintext.js	Thu Aug 04 15:21:29 2022 -0600
@@ -0,0 +1,78 @@
+/**
+ * SCEditor Plain Text Plugin
+ * http://www.sceditor.com/
+ *
+ * Copyright (C) 2016, Sam Clarke (samclarke.com)
+ *
+ * SCEditor is licensed under the MIT license:
+ *	http://www.opensource.org/licenses/mit-license.php
+ *
+ * @author Sam Clarke
+ */
+(function (sceditor) {
+	'use strict';
+
+	var utils = sceditor.utils;
+	var dom = sceditor.dom;
+
+	/**
+	 * Options:
+	 *
+	 * pastetext.addButton - If to replace the plaintext button with a toggle
+	 *                       button that enables and disables plain text mode.
+	 *
+	 * pastetext.enabled - If the plain text button should be enabled at start
+	 *                     up. Only applies if addButton is enabled.
+	 */
+	sceditor.plugins.plaintext = function () {
+		var plainTextEnabled = true;
+
+		this.init = function () {
+			var commands = this.commands;
+			var opts = this.opts;
+
+			if (opts && opts.plaintext && opts.plaintext.addButton) {
+				plainTextEnabled = opts.plaintext.enabled;
+
+				commands.pastetext = utils.extend(commands.pastetext || {}, {
+					state: function () {
+						return plainTextEnabled ? 1 : 0;
+					},
+					exec: function () {
+						plainTextEnabled = !plainTextEnabled;
+					}
+				});
+			}
+		};
+
+		this.signalPasteRaw = function (data) {
+			if (plainTextEnabled) {
+				if (data.html && !data.text) {
+					var div = document.createElement('div');
+					div.innerHTML = data.html;
+
+					// TODO: Refactor into private shared module with editor
+					// innerText adds two newlines after <p> tags so convert
+					// them to <div> tags
+					utils.each(div.querySelectorAll('p'), function (_, elm) {
+						dom.convertElement(elm, 'div');
+					});
+					// Remove collapsed <br> tags as innerText converts them to
+					// newlines
+					utils.each(div.querySelectorAll('br'), function (_, elm) {
+						if (!elm.nextSibling ||
+						!dom.isInline(elm.nextSibling, true)) {
+							elm.parentNode.removeChild(elm);
+						}
+					});
+
+					document.body.appendChild(div);
+					data.text = div.innerText;
+					document.body.removeChild(div);
+				}
+
+				data.html = null;
+			}
+		};
+	};
+}(sceditor));