actiontext 8.0.0.beta1 → 8.0.0.rc2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/app/assets/javascripts/trix.js +377 -174
- data/lib/action_text/gem_version.rb +1 -1
- data/lib/action_text/plain_text_conversion.rb +6 -1
- data/package.json +1 -1
- metadata +13 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0fb1c41942d8f04edd36197c2a38e64c7c38a45fab448e19c2dd988269a2944a
|
4
|
+
data.tar.gz: c158dc686084f3d979d0c75dfe006a37bb676c1d8a560ee90080f48fe2fb8384
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f12951a6b0fb650048fe5a82ef70a58710291fc135c6bf30014ac968d014e26fd2a2f5ddcfd852c6b6c3c7ee51a24eb5c18004c9f5eb0153c54be5cd0b0f08e8
|
7
|
+
data.tar.gz: 0f2d467666f82845e31463973756e87b6959b39dace55e44552dd1aafa9b75eaec265a86d1b37566a6685631d58ee3823221897cdb4f4d4eb64625acafea4052
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
Trix 2.1.
|
2
|
+
Trix 2.1.7
|
3
3
|
Copyright © 2024 37signals, LLC
|
4
4
|
*/
|
5
5
|
(function (global, factory) {
|
@@ -9,7 +9,7 @@ Copyright © 2024 37signals, LLC
|
|
9
9
|
})(this, (function () { 'use strict';
|
10
10
|
|
11
11
|
var name = "trix";
|
12
|
-
var version = "2.1.
|
12
|
+
var version = "2.1.7";
|
13
13
|
var description = "A rich text editor for everyday writing";
|
14
14
|
var main = "dist/trix.umd.min.js";
|
15
15
|
var module = "dist/trix.esm.min.js";
|
@@ -1037,7 +1037,11 @@ $\
|
|
1037
1037
|
const getCSPNonce = function () {
|
1038
1038
|
const element = getMetaElement("trix-csp-nonce") || getMetaElement("csp-nonce");
|
1039
1039
|
if (element) {
|
1040
|
-
|
1040
|
+
const {
|
1041
|
+
nonce,
|
1042
|
+
content
|
1043
|
+
} = element;
|
1044
|
+
return nonce == "" ? content : nonce;
|
1041
1045
|
}
|
1042
1046
|
};
|
1043
1047
|
const getMetaElement = name => document.head.querySelector("meta[name=".concat(name, "]"));
|
@@ -1059,6 +1063,12 @@ $\
|
|
1059
1063
|
return text === null || text === void 0 ? void 0 : text.length;
|
1060
1064
|
}
|
1061
1065
|
};
|
1066
|
+
const dataTransferIsMsOfficePaste = _ref => {
|
1067
|
+
let {
|
1068
|
+
dataTransfer
|
1069
|
+
} = _ref;
|
1070
|
+
return dataTransfer.types.includes("Files") && dataTransfer.types.includes("text/html") && dataTransfer.getData("text/html").includes("urn:schemas-microsoft-com:office:office");
|
1071
|
+
};
|
1062
1072
|
const dataTransferIsWritable = function (dataTransfer) {
|
1063
1073
|
if (!(dataTransfer !== null && dataTransfer !== void 0 && dataTransfer.setData)) return false;
|
1064
1074
|
for (const key in testTransferData) {
|
@@ -1707,6 +1717,116 @@ $\
|
|
1707
1717
|
}
|
1708
1718
|
}
|
1709
1719
|
|
1720
|
+
const DEFAULT_ALLOWED_ATTRIBUTES = "style href src width height language class".split(" ");
|
1721
|
+
const DEFAULT_FORBIDDEN_PROTOCOLS = "javascript:".split(" ");
|
1722
|
+
const DEFAULT_FORBIDDEN_ELEMENTS = "script iframe form noscript".split(" ");
|
1723
|
+
class HTMLSanitizer extends BasicObject {
|
1724
|
+
static setHTML(element, html) {
|
1725
|
+
const sanitizedElement = new this(html).sanitize();
|
1726
|
+
const sanitizedHtml = sanitizedElement.getHTML ? sanitizedElement.getHTML() : sanitizedElement.outerHTML;
|
1727
|
+
element.innerHTML = sanitizedHtml;
|
1728
|
+
}
|
1729
|
+
static sanitize(html, options) {
|
1730
|
+
const sanitizer = new this(html, options);
|
1731
|
+
sanitizer.sanitize();
|
1732
|
+
return sanitizer;
|
1733
|
+
}
|
1734
|
+
constructor(html) {
|
1735
|
+
let {
|
1736
|
+
allowedAttributes,
|
1737
|
+
forbiddenProtocols,
|
1738
|
+
forbiddenElements
|
1739
|
+
} = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
1740
|
+
super(...arguments);
|
1741
|
+
this.allowedAttributes = allowedAttributes || DEFAULT_ALLOWED_ATTRIBUTES;
|
1742
|
+
this.forbiddenProtocols = forbiddenProtocols || DEFAULT_FORBIDDEN_PROTOCOLS;
|
1743
|
+
this.forbiddenElements = forbiddenElements || DEFAULT_FORBIDDEN_ELEMENTS;
|
1744
|
+
this.body = createBodyElementForHTML(html);
|
1745
|
+
}
|
1746
|
+
sanitize() {
|
1747
|
+
this.sanitizeElements();
|
1748
|
+
return this.normalizeListElementNesting();
|
1749
|
+
}
|
1750
|
+
getHTML() {
|
1751
|
+
return this.body.innerHTML;
|
1752
|
+
}
|
1753
|
+
getBody() {
|
1754
|
+
return this.body;
|
1755
|
+
}
|
1756
|
+
|
1757
|
+
// Private
|
1758
|
+
|
1759
|
+
sanitizeElements() {
|
1760
|
+
const walker = walkTree(this.body);
|
1761
|
+
const nodesToRemove = [];
|
1762
|
+
while (walker.nextNode()) {
|
1763
|
+
const node = walker.currentNode;
|
1764
|
+
switch (node.nodeType) {
|
1765
|
+
case Node.ELEMENT_NODE:
|
1766
|
+
if (this.elementIsRemovable(node)) {
|
1767
|
+
nodesToRemove.push(node);
|
1768
|
+
} else {
|
1769
|
+
this.sanitizeElement(node);
|
1770
|
+
}
|
1771
|
+
break;
|
1772
|
+
case Node.COMMENT_NODE:
|
1773
|
+
nodesToRemove.push(node);
|
1774
|
+
break;
|
1775
|
+
}
|
1776
|
+
}
|
1777
|
+
nodesToRemove.forEach(node => removeNode(node));
|
1778
|
+
return this.body;
|
1779
|
+
}
|
1780
|
+
sanitizeElement(element) {
|
1781
|
+
if (element.hasAttribute("href")) {
|
1782
|
+
if (this.forbiddenProtocols.includes(element.protocol)) {
|
1783
|
+
element.removeAttribute("href");
|
1784
|
+
}
|
1785
|
+
}
|
1786
|
+
Array.from(element.attributes).forEach(_ref => {
|
1787
|
+
let {
|
1788
|
+
name
|
1789
|
+
} = _ref;
|
1790
|
+
if (!this.allowedAttributes.includes(name) && name.indexOf("data-trix") !== 0) {
|
1791
|
+
element.removeAttribute(name);
|
1792
|
+
}
|
1793
|
+
});
|
1794
|
+
return element;
|
1795
|
+
}
|
1796
|
+
normalizeListElementNesting() {
|
1797
|
+
Array.from(this.body.querySelectorAll("ul,ol")).forEach(listElement => {
|
1798
|
+
const previousElement = listElement.previousElementSibling;
|
1799
|
+
if (previousElement) {
|
1800
|
+
if (tagName(previousElement) === "li") {
|
1801
|
+
previousElement.appendChild(listElement);
|
1802
|
+
}
|
1803
|
+
}
|
1804
|
+
});
|
1805
|
+
return this.body;
|
1806
|
+
}
|
1807
|
+
elementIsRemovable(element) {
|
1808
|
+
if ((element === null || element === void 0 ? void 0 : element.nodeType) !== Node.ELEMENT_NODE) return;
|
1809
|
+
return this.elementIsForbidden(element) || this.elementIsntSerializable(element);
|
1810
|
+
}
|
1811
|
+
elementIsForbidden(element) {
|
1812
|
+
return this.forbiddenElements.includes(tagName(element));
|
1813
|
+
}
|
1814
|
+
elementIsntSerializable(element) {
|
1815
|
+
return element.getAttribute("data-trix-serialize") === "false" && !nodeIsAttachmentElement(element);
|
1816
|
+
}
|
1817
|
+
}
|
1818
|
+
const createBodyElementForHTML = function () {
|
1819
|
+
let html = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "";
|
1820
|
+
// Remove everything after </html>
|
1821
|
+
html = html.replace(/<\/html[^>]*>[^]*$/i, "</html>");
|
1822
|
+
const doc = document.implementation.createHTMLDocument("");
|
1823
|
+
doc.documentElement.innerHTML = html;
|
1824
|
+
Array.from(doc.head.querySelectorAll("style")).forEach(element => {
|
1825
|
+
doc.body.appendChild(element);
|
1826
|
+
});
|
1827
|
+
return doc.body;
|
1828
|
+
};
|
1829
|
+
|
1710
1830
|
const {
|
1711
1831
|
css: css$2
|
1712
1832
|
} = config;
|
@@ -1741,7 +1861,7 @@ $\
|
|
1741
1861
|
figure.appendChild(innerElement);
|
1742
1862
|
}
|
1743
1863
|
if (this.attachment.hasContent()) {
|
1744
|
-
innerElement
|
1864
|
+
HTMLSanitizer.setHTML(innerElement, this.attachment.getContent());
|
1745
1865
|
} else {
|
1746
1866
|
this.createContentNodes().forEach(node => {
|
1747
1867
|
innerElement.appendChild(node);
|
@@ -1869,7 +1989,7 @@ $\
|
|
1869
1989
|
});
|
1870
1990
|
const htmlContainsTagName = function (html, tagName) {
|
1871
1991
|
const div = makeElement("div");
|
1872
|
-
div
|
1992
|
+
HTMLSanitizer.setHTML(div, html || "");
|
1873
1993
|
return div.querySelector(tagName);
|
1874
1994
|
};
|
1875
1995
|
|
@@ -6816,111 +6936,6 @@ $\
|
|
6816
6936
|
return attributes;
|
6817
6937
|
};
|
6818
6938
|
|
6819
|
-
const DEFAULT_ALLOWED_ATTRIBUTES = "style href src width height language class".split(" ");
|
6820
|
-
const DEFAULT_FORBIDDEN_PROTOCOLS = "javascript:".split(" ");
|
6821
|
-
const DEFAULT_FORBIDDEN_ELEMENTS = "script iframe form noscript".split(" ");
|
6822
|
-
class HTMLSanitizer extends BasicObject {
|
6823
|
-
static sanitize(html, options) {
|
6824
|
-
const sanitizer = new this(html, options);
|
6825
|
-
sanitizer.sanitize();
|
6826
|
-
return sanitizer;
|
6827
|
-
}
|
6828
|
-
constructor(html) {
|
6829
|
-
let {
|
6830
|
-
allowedAttributes,
|
6831
|
-
forbiddenProtocols,
|
6832
|
-
forbiddenElements
|
6833
|
-
} = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
6834
|
-
super(...arguments);
|
6835
|
-
this.allowedAttributes = allowedAttributes || DEFAULT_ALLOWED_ATTRIBUTES;
|
6836
|
-
this.forbiddenProtocols = forbiddenProtocols || DEFAULT_FORBIDDEN_PROTOCOLS;
|
6837
|
-
this.forbiddenElements = forbiddenElements || DEFAULT_FORBIDDEN_ELEMENTS;
|
6838
|
-
this.body = createBodyElementForHTML(html);
|
6839
|
-
}
|
6840
|
-
sanitize() {
|
6841
|
-
this.sanitizeElements();
|
6842
|
-
return this.normalizeListElementNesting();
|
6843
|
-
}
|
6844
|
-
getHTML() {
|
6845
|
-
return this.body.innerHTML;
|
6846
|
-
}
|
6847
|
-
getBody() {
|
6848
|
-
return this.body;
|
6849
|
-
}
|
6850
|
-
|
6851
|
-
// Private
|
6852
|
-
|
6853
|
-
sanitizeElements() {
|
6854
|
-
const walker = walkTree(this.body);
|
6855
|
-
const nodesToRemove = [];
|
6856
|
-
while (walker.nextNode()) {
|
6857
|
-
const node = walker.currentNode;
|
6858
|
-
switch (node.nodeType) {
|
6859
|
-
case Node.ELEMENT_NODE:
|
6860
|
-
if (this.elementIsRemovable(node)) {
|
6861
|
-
nodesToRemove.push(node);
|
6862
|
-
} else {
|
6863
|
-
this.sanitizeElement(node);
|
6864
|
-
}
|
6865
|
-
break;
|
6866
|
-
case Node.COMMENT_NODE:
|
6867
|
-
nodesToRemove.push(node);
|
6868
|
-
break;
|
6869
|
-
}
|
6870
|
-
}
|
6871
|
-
nodesToRemove.forEach(node => removeNode(node));
|
6872
|
-
return this.body;
|
6873
|
-
}
|
6874
|
-
sanitizeElement(element) {
|
6875
|
-
if (element.hasAttribute("href")) {
|
6876
|
-
if (this.forbiddenProtocols.includes(element.protocol)) {
|
6877
|
-
element.removeAttribute("href");
|
6878
|
-
}
|
6879
|
-
}
|
6880
|
-
Array.from(element.attributes).forEach(_ref => {
|
6881
|
-
let {
|
6882
|
-
name
|
6883
|
-
} = _ref;
|
6884
|
-
if (!this.allowedAttributes.includes(name) && name.indexOf("data-trix") !== 0) {
|
6885
|
-
element.removeAttribute(name);
|
6886
|
-
}
|
6887
|
-
});
|
6888
|
-
return element;
|
6889
|
-
}
|
6890
|
-
normalizeListElementNesting() {
|
6891
|
-
Array.from(this.body.querySelectorAll("ul,ol")).forEach(listElement => {
|
6892
|
-
const previousElement = listElement.previousElementSibling;
|
6893
|
-
if (previousElement) {
|
6894
|
-
if (tagName(previousElement) === "li") {
|
6895
|
-
previousElement.appendChild(listElement);
|
6896
|
-
}
|
6897
|
-
}
|
6898
|
-
});
|
6899
|
-
return this.body;
|
6900
|
-
}
|
6901
|
-
elementIsRemovable(element) {
|
6902
|
-
if ((element === null || element === void 0 ? void 0 : element.nodeType) !== Node.ELEMENT_NODE) return;
|
6903
|
-
return this.elementIsForbidden(element) || this.elementIsntSerializable(element);
|
6904
|
-
}
|
6905
|
-
elementIsForbidden(element) {
|
6906
|
-
return this.forbiddenElements.includes(tagName(element));
|
6907
|
-
}
|
6908
|
-
elementIsntSerializable(element) {
|
6909
|
-
return element.getAttribute("data-trix-serialize") === "false" && !nodeIsAttachmentElement(element);
|
6910
|
-
}
|
6911
|
-
}
|
6912
|
-
const createBodyElementForHTML = function () {
|
6913
|
-
let html = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "";
|
6914
|
-
// Remove everything after </html>
|
6915
|
-
html = html.replace(/<\/html[^>]*>[^]*$/i, "</html>");
|
6916
|
-
const doc = document.implementation.createHTMLDocument("");
|
6917
|
-
doc.documentElement.innerHTML = html;
|
6918
|
-
Array.from(doc.head.querySelectorAll("style")).forEach(element => {
|
6919
|
-
doc.body.appendChild(element);
|
6920
|
-
});
|
6921
|
-
return doc.body;
|
6922
|
-
};
|
6923
|
-
|
6924
6939
|
/* eslint-disable
|
6925
6940
|
no-case-declarations,
|
6926
6941
|
no-irregular-whitespace,
|
@@ -6956,11 +6971,7 @@ $\
|
|
6956
6971
|
};
|
6957
6972
|
const parseTrixDataAttribute = (element, name) => {
|
6958
6973
|
try {
|
6959
|
-
|
6960
|
-
if (data.contentType === "text/html" && data.content) {
|
6961
|
-
data.content = HTMLSanitizer.sanitize(data.content).getHTML();
|
6962
|
-
}
|
6963
|
-
return data;
|
6974
|
+
return JSON.parse(element.getAttribute("data-trix-".concat(name)));
|
6964
6975
|
} catch (error) {
|
6965
6976
|
return {};
|
6966
6977
|
}
|
@@ -7003,8 +7014,7 @@ $\
|
|
7003
7014
|
parse() {
|
7004
7015
|
try {
|
7005
7016
|
this.createHiddenContainer();
|
7006
|
-
|
7007
|
-
this.containerElement.innerHTML = html;
|
7017
|
+
HTMLSanitizer.setHTML(this.containerElement, this.html);
|
7008
7018
|
const walker = walkTree(this.containerElement, {
|
7009
7019
|
usingFilter: nodeFilter
|
7010
7020
|
});
|
@@ -10527,7 +10537,7 @@ $\
|
|
10527
10537
|
return (_this$responder4 = this.responder) === null || _this$responder4 === void 0 ? void 0 : _this$responder4.deleteInDirection(direction);
|
10528
10538
|
};
|
10529
10539
|
const domRange = this.getTargetDOMRange({
|
10530
|
-
minLength: 2
|
10540
|
+
minLength: this.composing ? 1 : 2
|
10531
10541
|
});
|
10532
10542
|
if (domRange) {
|
10533
10543
|
return this.withTargetDOMRange(domRange, perform);
|
@@ -10641,6 +10651,11 @@ $\
|
|
10641
10651
|
},
|
10642
10652
|
beforeinput(event) {
|
10643
10653
|
const handler = this.constructor.inputTypes[event.inputType];
|
10654
|
+
|
10655
|
+
// Handles bug with Siri dictation on iOS 18+.
|
10656
|
+
if (!event.inputType) {
|
10657
|
+
this.render();
|
10658
|
+
}
|
10644
10659
|
if (handler) {
|
10645
10660
|
this.withEvent(event, handler);
|
10646
10661
|
this.scheduleRender();
|
@@ -10905,7 +10920,6 @@ $\
|
|
10905
10920
|
}
|
10906
10921
|
},
|
10907
10922
|
insertFromPaste() {
|
10908
|
-
var _dataTransfer$files;
|
10909
10923
|
const {
|
10910
10924
|
dataTransfer
|
10911
10925
|
} = this.event;
|
@@ -10948,28 +10962,28 @@ $\
|
|
10948
10962
|
var _this$delegate21;
|
10949
10963
|
return (_this$delegate21 = this.delegate) === null || _this$delegate21 === void 0 ? void 0 : _this$delegate21.inputControllerDidPaste(paste);
|
10950
10964
|
};
|
10951
|
-
} else if (
|
10965
|
+
} else if (processableFilePaste(this.event)) {
|
10952
10966
|
var _this$delegate22;
|
10953
|
-
|
10954
|
-
paste.
|
10955
|
-
paste.html = html;
|
10967
|
+
paste.type = "File";
|
10968
|
+
paste.file = dataTransfer.files[0];
|
10956
10969
|
(_this$delegate22 = this.delegate) === null || _this$delegate22 === void 0 || _this$delegate22.inputControllerWillPaste(paste);
|
10957
10970
|
this.withTargetDOMRange(function () {
|
10958
10971
|
var _this$responder34;
|
10959
|
-
return (_this$responder34 = this.responder) === null || _this$responder34 === void 0 ? void 0 : _this$responder34.
|
10972
|
+
return (_this$responder34 = this.responder) === null || _this$responder34 === void 0 ? void 0 : _this$responder34.insertFile(paste.file);
|
10960
10973
|
});
|
10961
10974
|
this.afterRender = () => {
|
10962
10975
|
var _this$delegate23;
|
10963
10976
|
return (_this$delegate23 = this.delegate) === null || _this$delegate23 === void 0 ? void 0 : _this$delegate23.inputControllerDidPaste(paste);
|
10964
10977
|
};
|
10965
|
-
} else if (
|
10978
|
+
} else if (html) {
|
10966
10979
|
var _this$delegate24;
|
10967
|
-
|
10968
|
-
paste.
|
10980
|
+
this.event.preventDefault();
|
10981
|
+
paste.type = "text/html";
|
10982
|
+
paste.html = html;
|
10969
10983
|
(_this$delegate24 = this.delegate) === null || _this$delegate24 === void 0 || _this$delegate24.inputControllerWillPaste(paste);
|
10970
10984
|
this.withTargetDOMRange(function () {
|
10971
10985
|
var _this$responder35;
|
10972
|
-
return (_this$responder35 = this.responder) === null || _this$responder35 === void 0 ? void 0 : _this$responder35.
|
10986
|
+
return (_this$responder35 = this.responder) === null || _this$responder35 === void 0 ? void 0 : _this$responder35.insertHTML(paste.html);
|
10973
10987
|
});
|
10974
10988
|
this.afterRender = () => {
|
10975
10989
|
var _this$delegate25;
|
@@ -11030,10 +11044,20 @@ $\
|
|
11030
11044
|
var _event$dataTransfer;
|
11031
11045
|
return Array.from(((_event$dataTransfer = event.dataTransfer) === null || _event$dataTransfer === void 0 ? void 0 : _event$dataTransfer.types) || []).includes("Files");
|
11032
11046
|
};
|
11047
|
+
const processableFilePaste = event => {
|
11048
|
+
var _event$dataTransfer$f;
|
11049
|
+
// Paste events that only have files are handled by the paste event handler,
|
11050
|
+
// to work around Safari not supporting beforeinput.insertFromPaste for files.
|
11051
|
+
|
11052
|
+
// MS Office text pastes include a file with a screenshot of the text, but we should
|
11053
|
+
// handle them as text pastes.
|
11054
|
+
return ((_event$dataTransfer$f = event.dataTransfer.files) === null || _event$dataTransfer$f === void 0 ? void 0 : _event$dataTransfer$f[0]) && !pasteEventHasFilesOnly(event) && !dataTransferIsMsOfficePaste(event);
|
11055
|
+
};
|
11033
11056
|
const pasteEventHasFilesOnly = function (event) {
|
11034
11057
|
const clipboard = event.clipboardData;
|
11035
11058
|
if (clipboard) {
|
11036
|
-
|
11059
|
+
const fileTypes = Array.from(clipboard.types).filter(type => type.match(/file/i)); // "Files", "application/x-moz-file"
|
11060
|
+
return fileTypes.length === clipboard.types.length && clipboard.files.length >= 1;
|
11037
11061
|
}
|
11038
11062
|
};
|
11039
11063
|
const pasteEventHasPlainTextOnly = function (event) {
|
@@ -11699,7 +11723,7 @@ $\
|
|
11699
11723
|
updateInputElement() {
|
11700
11724
|
const element = this.compositionController.getSerializableElement();
|
11701
11725
|
const value = serializeToContentType(element, "text/html");
|
11702
|
-
return this.editorElement.
|
11726
|
+
return this.editorElement.setFormValue(value);
|
11703
11727
|
}
|
11704
11728
|
notifyEditorElement(message, data) {
|
11705
11729
|
switch (message) {
|
@@ -11956,8 +11980,187 @@ $\
|
|
11956
11980
|
};
|
11957
11981
|
}
|
11958
11982
|
}();
|
11959
|
-
installDefaultCSSForTagName("trix-editor", "%t {\n display: block;\n}\n\n%t:empty
|
11983
|
+
installDefaultCSSForTagName("trix-editor", "%t {\n display: block;\n}\n\n%t:empty::before {\n content: attr(placeholder);\n color: graytext;\n cursor: text;\n pointer-events: none;\n white-space: pre-line;\n}\n\n%t a[contenteditable=false] {\n cursor: text;\n}\n\n%t img {\n max-width: 100%;\n height: auto;\n}\n\n%t ".concat(attachmentSelector, " figcaption textarea {\n resize: none;\n}\n\n%t ").concat(attachmentSelector, " figcaption textarea.trix-autoresize-clone {\n position: absolute;\n left: -9999px;\n max-height: 0px;\n}\n\n%t ").concat(attachmentSelector, " figcaption[data-trix-placeholder]:empty::before {\n content: attr(data-trix-placeholder);\n color: graytext;\n}\n\n%t [data-trix-cursor-target] {\n display: ").concat(cursorTargetStyles.display, " !important;\n width: ").concat(cursorTargetStyles.width, " !important;\n padding: 0 !important;\n margin: 0 !important;\n border: none !important;\n}\n\n%t [data-trix-cursor-target=left] {\n vertical-align: top !important;\n margin-left: -1px !important;\n}\n\n%t [data-trix-cursor-target=right] {\n vertical-align: bottom !important;\n margin-right: -1px !important;\n}"));
|
11984
|
+
var _internals = /*#__PURE__*/new WeakMap();
|
11985
|
+
var _validate = /*#__PURE__*/new WeakSet();
|
11986
|
+
class ElementInternalsDelegate {
|
11987
|
+
constructor(element) {
|
11988
|
+
_classPrivateMethodInitSpec(this, _validate);
|
11989
|
+
_classPrivateFieldInitSpec(this, _internals, {
|
11990
|
+
writable: true,
|
11991
|
+
value: void 0
|
11992
|
+
});
|
11993
|
+
this.element = element;
|
11994
|
+
_classPrivateFieldSet(this, _internals, element.attachInternals());
|
11995
|
+
}
|
11996
|
+
connectedCallback() {
|
11997
|
+
_classPrivateMethodGet(this, _validate, _validate2).call(this);
|
11998
|
+
}
|
11999
|
+
disconnectedCallback() {}
|
12000
|
+
get labels() {
|
12001
|
+
return _classPrivateFieldGet(this, _internals).labels;
|
12002
|
+
}
|
12003
|
+
get disabled() {
|
12004
|
+
var _this$element$inputEl;
|
12005
|
+
return (_this$element$inputEl = this.element.inputElement) === null || _this$element$inputEl === void 0 ? void 0 : _this$element$inputEl.disabled;
|
12006
|
+
}
|
12007
|
+
set disabled(value) {
|
12008
|
+
this.element.toggleAttribute("disabled", value);
|
12009
|
+
}
|
12010
|
+
get required() {
|
12011
|
+
return this.element.hasAttribute("required");
|
12012
|
+
}
|
12013
|
+
set required(value) {
|
12014
|
+
this.element.toggleAttribute("required", value);
|
12015
|
+
_classPrivateMethodGet(this, _validate, _validate2).call(this);
|
12016
|
+
}
|
12017
|
+
get validity() {
|
12018
|
+
return _classPrivateFieldGet(this, _internals).validity;
|
12019
|
+
}
|
12020
|
+
get validationMessage() {
|
12021
|
+
return _classPrivateFieldGet(this, _internals).validationMessage;
|
12022
|
+
}
|
12023
|
+
get willValidate() {
|
12024
|
+
return _classPrivateFieldGet(this, _internals).willValidate;
|
12025
|
+
}
|
12026
|
+
setFormValue(value) {
|
12027
|
+
_classPrivateMethodGet(this, _validate, _validate2).call(this);
|
12028
|
+
}
|
12029
|
+
checkValidity() {
|
12030
|
+
return _classPrivateFieldGet(this, _internals).checkValidity();
|
12031
|
+
}
|
12032
|
+
reportValidity() {
|
12033
|
+
return _classPrivateFieldGet(this, _internals).reportValidity();
|
12034
|
+
}
|
12035
|
+
setCustomValidity(validationMessage) {
|
12036
|
+
_classPrivateMethodGet(this, _validate, _validate2).call(this, validationMessage);
|
12037
|
+
}
|
12038
|
+
}
|
12039
|
+
function _validate2() {
|
12040
|
+
let customValidationMessage = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "";
|
12041
|
+
const {
|
12042
|
+
required,
|
12043
|
+
value
|
12044
|
+
} = this.element;
|
12045
|
+
const valueMissing = required && !value;
|
12046
|
+
const customError = !!customValidationMessage;
|
12047
|
+
const input = makeElement("input", {
|
12048
|
+
required
|
12049
|
+
});
|
12050
|
+
const validationMessage = customValidationMessage || input.validationMessage;
|
12051
|
+
_classPrivateFieldGet(this, _internals).setValidity({
|
12052
|
+
valueMissing,
|
12053
|
+
customError
|
12054
|
+
}, validationMessage);
|
12055
|
+
}
|
12056
|
+
var _focusHandler = /*#__PURE__*/new WeakMap();
|
12057
|
+
var _resetBubbled = /*#__PURE__*/new WeakMap();
|
12058
|
+
var _clickBubbled = /*#__PURE__*/new WeakMap();
|
12059
|
+
class LegacyDelegate {
|
12060
|
+
constructor(element) {
|
12061
|
+
_classPrivateFieldInitSpec(this, _focusHandler, {
|
12062
|
+
writable: true,
|
12063
|
+
value: void 0
|
12064
|
+
});
|
12065
|
+
_classPrivateFieldInitSpec(this, _resetBubbled, {
|
12066
|
+
writable: true,
|
12067
|
+
value: event => {
|
12068
|
+
if (event.defaultPrevented) return;
|
12069
|
+
if (event.target !== this.element.form) return;
|
12070
|
+
this.element.reset();
|
12071
|
+
}
|
12072
|
+
});
|
12073
|
+
_classPrivateFieldInitSpec(this, _clickBubbled, {
|
12074
|
+
writable: true,
|
12075
|
+
value: event => {
|
12076
|
+
if (event.defaultPrevented) return;
|
12077
|
+
if (this.element.contains(event.target)) return;
|
12078
|
+
const label = findClosestElementFromNode(event.target, {
|
12079
|
+
matchingSelector: "label"
|
12080
|
+
});
|
12081
|
+
if (!label) return;
|
12082
|
+
if (!Array.from(this.labels).includes(label)) return;
|
12083
|
+
this.element.focus();
|
12084
|
+
}
|
12085
|
+
});
|
12086
|
+
this.element = element;
|
12087
|
+
}
|
12088
|
+
connectedCallback() {
|
12089
|
+
_classPrivateFieldSet(this, _focusHandler, ensureAriaLabel(this.element));
|
12090
|
+
window.addEventListener("reset", _classPrivateFieldGet(this, _resetBubbled), false);
|
12091
|
+
window.addEventListener("click", _classPrivateFieldGet(this, _clickBubbled), false);
|
12092
|
+
}
|
12093
|
+
disconnectedCallback() {
|
12094
|
+
var _classPrivateFieldGet2;
|
12095
|
+
(_classPrivateFieldGet2 = _classPrivateFieldGet(this, _focusHandler)) === null || _classPrivateFieldGet2 === void 0 || _classPrivateFieldGet2.destroy();
|
12096
|
+
window.removeEventListener("reset", _classPrivateFieldGet(this, _resetBubbled), false);
|
12097
|
+
window.removeEventListener("click", _classPrivateFieldGet(this, _clickBubbled), false);
|
12098
|
+
}
|
12099
|
+
get labels() {
|
12100
|
+
const labels = [];
|
12101
|
+
if (this.element.id && this.element.ownerDocument) {
|
12102
|
+
labels.push(...Array.from(this.element.ownerDocument.querySelectorAll("label[for='".concat(this.element.id, "']")) || []));
|
12103
|
+
}
|
12104
|
+
const label = findClosestElementFromNode(this.element, {
|
12105
|
+
matchingSelector: "label"
|
12106
|
+
});
|
12107
|
+
if (label) {
|
12108
|
+
if ([this.element, null].includes(label.control)) {
|
12109
|
+
labels.push(label);
|
12110
|
+
}
|
12111
|
+
}
|
12112
|
+
return labels;
|
12113
|
+
}
|
12114
|
+
get disabled() {
|
12115
|
+
console.warn("This browser does not support the [disabled] attribute for trix-editor elements.");
|
12116
|
+
return false;
|
12117
|
+
}
|
12118
|
+
set disabled(value) {
|
12119
|
+
console.warn("This browser does not support the [disabled] attribute for trix-editor elements.");
|
12120
|
+
}
|
12121
|
+
get required() {
|
12122
|
+
console.warn("This browser does not support the [required] attribute for trix-editor elements.");
|
12123
|
+
return false;
|
12124
|
+
}
|
12125
|
+
set required(value) {
|
12126
|
+
console.warn("This browser does not support the [required] attribute for trix-editor elements.");
|
12127
|
+
}
|
12128
|
+
get validity() {
|
12129
|
+
console.warn("This browser does not support the validity property for trix-editor elements.");
|
12130
|
+
return null;
|
12131
|
+
}
|
12132
|
+
get validationMessage() {
|
12133
|
+
console.warn("This browser does not support the validationMessage property for trix-editor elements.");
|
12134
|
+
return "";
|
12135
|
+
}
|
12136
|
+
get willValidate() {
|
12137
|
+
console.warn("This browser does not support the willValidate property for trix-editor elements.");
|
12138
|
+
return false;
|
12139
|
+
}
|
12140
|
+
setFormValue(value) {}
|
12141
|
+
checkValidity() {
|
12142
|
+
console.warn("This browser does not support checkValidity() for trix-editor elements.");
|
12143
|
+
return true;
|
12144
|
+
}
|
12145
|
+
reportValidity() {
|
12146
|
+
console.warn("This browser does not support reportValidity() for trix-editor elements.");
|
12147
|
+
return true;
|
12148
|
+
}
|
12149
|
+
setCustomValidity(validationMessage) {
|
12150
|
+
console.warn("This browser does not support setCustomValidity(validationMessage) for trix-editor elements.");
|
12151
|
+
}
|
12152
|
+
}
|
12153
|
+
var _delegate = /*#__PURE__*/new WeakMap();
|
11960
12154
|
class TrixEditorElement extends HTMLElement {
|
12155
|
+
constructor() {
|
12156
|
+
super();
|
12157
|
+
_classPrivateFieldInitSpec(this, _delegate, {
|
12158
|
+
writable: true,
|
12159
|
+
value: void 0
|
12160
|
+
});
|
12161
|
+
_classPrivateFieldSet(this, _delegate, this.constructor.formAssociated ? new ElementInternalsDelegate(this) : new LegacyDelegate(this));
|
12162
|
+
}
|
12163
|
+
|
11961
12164
|
// Properties
|
11962
12165
|
|
11963
12166
|
get trixId() {
|
@@ -11969,19 +12172,31 @@ $\
|
|
11969
12172
|
}
|
11970
12173
|
}
|
11971
12174
|
get labels() {
|
11972
|
-
|
11973
|
-
|
11974
|
-
|
11975
|
-
|
11976
|
-
|
11977
|
-
|
11978
|
-
|
11979
|
-
|
11980
|
-
|
11981
|
-
|
11982
|
-
|
11983
|
-
|
11984
|
-
|
12175
|
+
return _classPrivateFieldGet(this, _delegate).labels;
|
12176
|
+
}
|
12177
|
+
get disabled() {
|
12178
|
+
return _classPrivateFieldGet(this, _delegate).disabled;
|
12179
|
+
}
|
12180
|
+
set disabled(value) {
|
12181
|
+
_classPrivateFieldGet(this, _delegate).disabled = value;
|
12182
|
+
}
|
12183
|
+
get required() {
|
12184
|
+
return _classPrivateFieldGet(this, _delegate).required;
|
12185
|
+
}
|
12186
|
+
set required(value) {
|
12187
|
+
_classPrivateFieldGet(this, _delegate).required = value;
|
12188
|
+
}
|
12189
|
+
get validity() {
|
12190
|
+
return _classPrivateFieldGet(this, _delegate).validity;
|
12191
|
+
}
|
12192
|
+
get validationMessage() {
|
12193
|
+
return _classPrivateFieldGet(this, _delegate).validationMessage;
|
12194
|
+
}
|
12195
|
+
get willValidate() {
|
12196
|
+
return _classPrivateFieldGet(this, _delegate).willValidate;
|
12197
|
+
}
|
12198
|
+
get type() {
|
12199
|
+
return this.localName;
|
11985
12200
|
}
|
11986
12201
|
get toolbarElement() {
|
11987
12202
|
if (this.hasAttribute("toolbar")) {
|
@@ -12048,9 +12263,10 @@ $\
|
|
12048
12263
|
});
|
12049
12264
|
}
|
12050
12265
|
}
|
12051
|
-
|
12266
|
+
setFormValue(value) {
|
12052
12267
|
if (this.inputElement) {
|
12053
12268
|
this.inputElement.value = value;
|
12269
|
+
_classPrivateFieldGet(this, _delegate).setFormValue(value);
|
12054
12270
|
}
|
12055
12271
|
}
|
12056
12272
|
|
@@ -12060,7 +12276,6 @@ $\
|
|
12060
12276
|
if (!this.hasAttribute("data-trix-internal")) {
|
12061
12277
|
makeEditable(this);
|
12062
12278
|
addAccessibilityRole(this);
|
12063
|
-
ensureAriaLabel(this);
|
12064
12279
|
if (!this.editorController) {
|
12065
12280
|
triggerEvent("trix-before-initialize", {
|
12066
12281
|
onElement: this
|
@@ -12074,53 +12289,41 @@ $\
|
|
12074
12289
|
}));
|
12075
12290
|
}
|
12076
12291
|
this.editorController.registerSelectionManager();
|
12077
|
-
this.
|
12078
|
-
this.registerClickListener();
|
12292
|
+
_classPrivateFieldGet(this, _delegate).connectedCallback();
|
12079
12293
|
autofocus(this);
|
12080
12294
|
}
|
12081
12295
|
}
|
12082
12296
|
disconnectedCallback() {
|
12083
12297
|
var _this$editorControlle2;
|
12084
12298
|
(_this$editorControlle2 = this.editorController) === null || _this$editorControlle2 === void 0 || _this$editorControlle2.unregisterSelectionManager();
|
12085
|
-
this.
|
12086
|
-
return this.unregisterClickListener();
|
12299
|
+
_classPrivateFieldGet(this, _delegate).disconnectedCallback();
|
12087
12300
|
}
|
12088
12301
|
|
12089
12302
|
// Form support
|
12090
12303
|
|
12091
|
-
|
12092
|
-
this
|
12093
|
-
return window.addEventListener("reset", this.resetListener, false);
|
12094
|
-
}
|
12095
|
-
unregisterResetListener() {
|
12096
|
-
return window.removeEventListener("reset", this.resetListener, false);
|
12304
|
+
checkValidity() {
|
12305
|
+
return _classPrivateFieldGet(this, _delegate).checkValidity();
|
12097
12306
|
}
|
12098
|
-
|
12099
|
-
this
|
12100
|
-
return window.addEventListener("click", this.clickListener, false);
|
12307
|
+
reportValidity() {
|
12308
|
+
return _classPrivateFieldGet(this, _delegate).reportValidity();
|
12101
12309
|
}
|
12102
|
-
|
12103
|
-
|
12310
|
+
setCustomValidity(validationMessage) {
|
12311
|
+
_classPrivateFieldGet(this, _delegate).setCustomValidity(validationMessage);
|
12104
12312
|
}
|
12105
|
-
|
12106
|
-
if (
|
12107
|
-
|
12108
|
-
|
12313
|
+
formDisabledCallback(disabled) {
|
12314
|
+
if (this.inputElement) {
|
12315
|
+
this.inputElement.disabled = disabled;
|
12316
|
+
}
|
12317
|
+
this.toggleAttribute("contenteditable", !disabled);
|
12109
12318
|
}
|
12110
|
-
|
12111
|
-
|
12112
|
-
if (this.contains(event.target)) return;
|
12113
|
-
const label = findClosestElementFromNode(event.target, {
|
12114
|
-
matchingSelector: "label"
|
12115
|
-
});
|
12116
|
-
if (!label) return;
|
12117
|
-
if (!Array.from(this.labels).includes(label)) return;
|
12118
|
-
return this.focus();
|
12319
|
+
formResetCallback() {
|
12320
|
+
this.reset();
|
12119
12321
|
}
|
12120
12322
|
reset() {
|
12121
12323
|
this.value = this.defaultValue;
|
12122
12324
|
}
|
12123
12325
|
}
|
12326
|
+
_defineProperty(TrixEditorElement, "formAssociated", "ElementInternals" in window);
|
12124
12327
|
|
12125
12328
|
var elements = /*#__PURE__*/Object.freeze({
|
12126
12329
|
__proto__: null,
|
@@ -65,7 +65,12 @@ module ActionText
|
|
65
65
|
|
66
66
|
def plain_text_for_blockquote_node(node, index)
|
67
67
|
text = plain_text_for_block(node)
|
68
|
-
text.
|
68
|
+
return "“”" if text.blank?
|
69
|
+
|
70
|
+
text = text.dup
|
71
|
+
text.insert(text.rindex(/\S/) + 1, "”")
|
72
|
+
text.insert(text.index(/\S/), "“")
|
73
|
+
text
|
69
74
|
end
|
70
75
|
|
71
76
|
def plain_text_for_li_node(node, index)
|
data/package.json
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: actiontext
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 8.0.0.
|
4
|
+
version: 8.0.0.rc2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Javan Makhmali
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2024-
|
13
|
+
date: 2024-10-30 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activesupport
|
@@ -18,56 +18,56 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - '='
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 8.0.0.
|
21
|
+
version: 8.0.0.rc2
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
26
|
- - '='
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
version: 8.0.0.
|
28
|
+
version: 8.0.0.rc2
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
30
|
name: activerecord
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
32
32
|
requirements:
|
33
33
|
- - '='
|
34
34
|
- !ruby/object:Gem::Version
|
35
|
-
version: 8.0.0.
|
35
|
+
version: 8.0.0.rc2
|
36
36
|
type: :runtime
|
37
37
|
prerelease: false
|
38
38
|
version_requirements: !ruby/object:Gem::Requirement
|
39
39
|
requirements:
|
40
40
|
- - '='
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
version: 8.0.0.
|
42
|
+
version: 8.0.0.rc2
|
43
43
|
- !ruby/object:Gem::Dependency
|
44
44
|
name: activestorage
|
45
45
|
requirement: !ruby/object:Gem::Requirement
|
46
46
|
requirements:
|
47
47
|
- - '='
|
48
48
|
- !ruby/object:Gem::Version
|
49
|
-
version: 8.0.0.
|
49
|
+
version: 8.0.0.rc2
|
50
50
|
type: :runtime
|
51
51
|
prerelease: false
|
52
52
|
version_requirements: !ruby/object:Gem::Requirement
|
53
53
|
requirements:
|
54
54
|
- - '='
|
55
55
|
- !ruby/object:Gem::Version
|
56
|
-
version: 8.0.0.
|
56
|
+
version: 8.0.0.rc2
|
57
57
|
- !ruby/object:Gem::Dependency
|
58
58
|
name: actionpack
|
59
59
|
requirement: !ruby/object:Gem::Requirement
|
60
60
|
requirements:
|
61
61
|
- - '='
|
62
62
|
- !ruby/object:Gem::Version
|
63
|
-
version: 8.0.0.
|
63
|
+
version: 8.0.0.rc2
|
64
64
|
type: :runtime
|
65
65
|
prerelease: false
|
66
66
|
version_requirements: !ruby/object:Gem::Requirement
|
67
67
|
requirements:
|
68
68
|
- - '='
|
69
69
|
- !ruby/object:Gem::Version
|
70
|
-
version: 8.0.0.
|
70
|
+
version: 8.0.0.rc2
|
71
71
|
- !ruby/object:Gem::Dependency
|
72
72
|
name: nokogiri
|
73
73
|
requirement: !ruby/object:Gem::Requirement
|
@@ -163,10 +163,10 @@ licenses:
|
|
163
163
|
- MIT
|
164
164
|
metadata:
|
165
165
|
bug_tracker_uri: https://github.com/rails/rails/issues
|
166
|
-
changelog_uri: https://github.com/rails/rails/blob/v8.0.0.
|
167
|
-
documentation_uri: https://api.rubyonrails.org/v8.0.0.
|
166
|
+
changelog_uri: https://github.com/rails/rails/blob/v8.0.0.rc2/actiontext/CHANGELOG.md
|
167
|
+
documentation_uri: https://api.rubyonrails.org/v8.0.0.rc2/
|
168
168
|
mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
|
169
|
-
source_code_uri: https://github.com/rails/rails/tree/v8.0.0.
|
169
|
+
source_code_uri: https://github.com/rails/rails/tree/v8.0.0.rc2/actiontext
|
170
170
|
rubygems_mfa_required: 'true'
|
171
171
|
post_install_message:
|
172
172
|
rdoc_options: []
|