view src/plugins/plaintext.js @ 47:16b61f228546 default tip

minor
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 31 Oct 2022 10:41:24 -0600
parents ea32a44b5a6e
children
line wrap: on
line source

/**
 * 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 base = {};
		var plainTextEnabled = true;

		base.init = function (editor) {
			var commands = editor.commands;
			var opts = editor.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;
					}
				});
			}
		};

		base.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;
			}
		};

		return base;
	};
}(sceditor));