From f487c95751aed1db53b537864ca3a98427e15366 Mon Sep 17 00:00:00 2001 From: Antoine M Date: Mon, 13 Oct 2025 16:42:27 +0200 Subject: [PATCH] FEATURE Complete change of footnote behaviour. Now injecting a footnote independant tag --- .../carhop-format-types/build/index-rtl.css | 2 +- .../carhop-format-types/build/index.asset.php | 2 +- plugins/carhop-format-types/build/index.css | 2 +- .../carhop-format-types/build/index.css.map | 2 +- plugins/carhop-format-types/build/index.js | 57 ++++++++++++++++- .../carhop-format-types/build/index.js.map | 2 +- .../src/footnotes/footnote.css | 2 +- .../src/footnotes/footnote.js | 64 ++++++++++++++++++- 8 files changed, 122 insertions(+), 11 deletions(-) diff --git a/plugins/carhop-format-types/build/index-rtl.css b/plugins/carhop-format-types/build/index-rtl.css index 6f3c4e3..9486b68 100644 --- a/plugins/carhop-format-types/build/index-rtl.css +++ b/plugins/carhop-format-types/build/index-rtl.css @@ -21,7 +21,7 @@ body { align-items: center; font-size: 11px !important; font-weight: 600; - margin-right: 3px; + margin-right: 0px; margin-left: 3px; } } diff --git a/plugins/carhop-format-types/build/index.asset.php b/plugins/carhop-format-types/build/index.asset.php index ea087c5..c287d30 100644 --- a/plugins/carhop-format-types/build/index.asset.php +++ b/plugins/carhop-format-types/build/index.asset.php @@ -1 +1 @@ - array('react-jsx-runtime', 'wp-block-editor', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n', 'wp-primitives', 'wp-rich-text'), 'version' => '4e7e470686a7bd3035eb'); + array('react-jsx-runtime', 'wp-block-editor', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n', 'wp-primitives', 'wp-rich-text'), 'version' => 'bb1996ad8ebf6f6ac5a4'); diff --git a/plugins/carhop-format-types/build/index.css b/plugins/carhop-format-types/build/index.css index 0406c79..cd56af4 100644 --- a/plugins/carhop-format-types/build/index.css +++ b/plugins/carhop-format-types/build/index.css @@ -21,7 +21,7 @@ body { align-items: center; font-size: 11px !important; font-weight: 600; - margin-left: 3px; + margin-left: 0px; margin-right: 3px; } } diff --git a/plugins/carhop-format-types/build/index.css.map b/plugins/carhop-format-types/build/index.css.map index 1bf0314..e2b1aed 100644 --- a/plugins/carhop-format-types/build/index.css.map +++ b/plugins/carhop-format-types/build/index.css.map @@ -1 +1 @@ -{"version":3,"file":"index.css","mappings":";;;AAAA;CACC,6BAA6B;AAC9B;AACA;CACC,iCAAiC;CACjC,kBAAkB;CAClB,YAAY;;CAEZ;EACC,mDAAmD;EACnD,WAAW;EACX,WAAW;EACX,YAAY;EACZ,kBAAkB;EAClB,gCAAgC;EAChC,oBAAoB;EACpB,uBAAuB;EACvB,mBAAmB;EACnB,0BAA0B;EAC1B,gBAAgB;EAChB,gBAAgB;EAChB,iBAAiB;CAClB;AACD;;AAEA;;CAEC;EACC,0BAA0B;EAC1B,6BAA6B;EAC7B,wDAAwD;EACxD,8BAA8B;EAC9B,0BAA0B;CAC3B;AACD;;AAEA;CACC;EACC,wBAAwB;EACxB,gBAAgB;CACjB;CACA;EACC,aAAa;EACb,yBAAyB;EACzB,SAAS;EACT,gBAAgB;;EAEhB;GACC,oCAAoC;GACpC,sBAAsB;EACvB;;EAEA;GACC,8DAA8D;GAC9D,sBAAsB;EACvB;CACD;AACD;;;;;ACzDA;CACC,yBAAyB;AAC1B","sources":["webpack:///./src/footnotes/footnote.css","webpack:///./src/uppercased-small-title/uppercased-small-title.css"],"sourcesContent":["body {\r\n\tcounter-reset: footnote-index;\r\n}\r\n.footnote-reference {\r\n\tcounter-increment: footnote-index;\r\n\tposition: relative;\r\n\tcolor: unset;\r\n\r\n\t&::after {\r\n\t\tbackground-color: var(--wp--preset--color--primary);\r\n\t\tcolor: #fff;\r\n\t\twidth: 22px;\r\n\t\theight: 22px;\r\n\t\tborder-radius: 50%;\r\n\t\tcontent: counter(footnote-index);\r\n\t\tdisplay: inline-flex;\r\n\t\tjustify-content: center;\r\n\t\talign-items: center;\r\n\t\tfont-size: 11px !important;\r\n\t\tfont-weight: 600;\r\n\t\tmargin-left: 3px;\r\n\t\tmargin-right: 3px;\r\n\t}\r\n}\r\n\r\n// Editor\r\n.footnote-reference {\r\n\t.wp-block-post-content & {\r\n\t\ttext-decoration: underline;\r\n\t\ttext-decoration-style: dotted;\r\n\t\ttext-decoration-color: var(--wp--preset--color--primary);\r\n\t\ttext-decoration-thickness: 2px;\r\n\t\ttext-underline-offset: 2px;\r\n\t}\r\n}\r\n\r\n.popover_footnote_field {\r\n\t.components-popover__content {\r\n\t\tpadding: 10px !important;\r\n\t\tmin-width: 500px;\r\n\t}\r\n\t.popover_footnote_field_buttons {\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: flex-end;\r\n\t\tgap: 10px;\r\n\t\tmargin-top: 10px;\r\n\r\n\t\tbutton.is-destructive {\r\n\t\t\tbackground-color: #cc1818 !important;\r\n\t\t\tcolor: #fff !important;\r\n\t\t}\r\n\r\n\t\tbutton.is-primary {\r\n\t\t\tbackground-color: var(--wp--preset--color--primary) !important;\r\n\t\t\tcolor: #fff !important;\r\n\t\t}\r\n\t}\r\n}\r\n",".uppercased-small-title {\r\n\ttext-transform: uppercase;\r\n}\r\n"],"names":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"index.css","mappings":";;;AAAA;CACC,6BAA6B;AAC9B;AACA;CACC,iCAAiC;CACjC,kBAAkB;CAClB,YAAY;;CAEZ;EACC,mDAAmD;EACnD,WAAW;EACX,WAAW;EACX,YAAY;EACZ,kBAAkB;EAClB,gCAAgC;EAChC,oBAAoB;EACpB,uBAAuB;EACvB,mBAAmB;EACnB,0BAA0B;EAC1B,gBAAgB;EAChB,gBAAgB;EAChB,iBAAiB;CAClB;AACD;;AAEA;;CAEC;EACC,0BAA0B;EAC1B,6BAA6B;EAC7B,wDAAwD;EACxD,8BAA8B;EAC9B,0BAA0B;CAC3B;AACD;;AAEA;CACC;EACC,wBAAwB;EACxB,gBAAgB;CACjB;CACA;EACC,aAAa;EACb,yBAAyB;EACzB,SAAS;EACT,gBAAgB;;EAEhB;GACC,oCAAoC;GACpC,sBAAsB;EACvB;;EAEA;GACC,8DAA8D;GAC9D,sBAAsB;EACvB;CACD;AACD;;;;;ACzDA;CACC,yBAAyB;AAC1B","sources":["webpack:///./src/footnotes/footnote.css","webpack:///./src/uppercased-small-title/uppercased-small-title.css"],"sourcesContent":["body {\r\n\tcounter-reset: footnote-index;\r\n}\r\n.footnote-reference {\r\n\tcounter-increment: footnote-index;\r\n\tposition: relative;\r\n\tcolor: unset;\r\n\r\n\t&::after {\r\n\t\tbackground-color: var(--wp--preset--color--primary);\r\n\t\tcolor: #fff;\r\n\t\twidth: 22px;\r\n\t\theight: 22px;\r\n\t\tborder-radius: 50%;\r\n\t\tcontent: counter(footnote-index);\r\n\t\tdisplay: inline-flex;\r\n\t\tjustify-content: center;\r\n\t\talign-items: center;\r\n\t\tfont-size: 11px !important;\r\n\t\tfont-weight: 600;\r\n\t\tmargin-left: 0px;\r\n\t\tmargin-right: 3px;\r\n\t}\r\n}\r\n\r\n// Editor\r\n.footnote-reference {\r\n\t.wp-block-post-content & {\r\n\t\ttext-decoration: underline;\r\n\t\ttext-decoration-style: dotted;\r\n\t\ttext-decoration-color: var(--wp--preset--color--primary);\r\n\t\ttext-decoration-thickness: 2px;\r\n\t\ttext-underline-offset: 2px;\r\n\t}\r\n}\r\n\r\n.popover_footnote_field {\r\n\t.components-popover__content {\r\n\t\tpadding: 10px !important;\r\n\t\tmin-width: 500px;\r\n\t}\r\n\t.popover_footnote_field_buttons {\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: flex-end;\r\n\t\tgap: 10px;\r\n\t\tmargin-top: 10px;\r\n\r\n\t\tbutton.is-destructive {\r\n\t\t\tbackground-color: #cc1818 !important;\r\n\t\t\tcolor: #fff !important;\r\n\t\t}\r\n\r\n\t\tbutton.is-primary {\r\n\t\t\tbackground-color: var(--wp--preset--color--primary) !important;\r\n\t\t\tcolor: #fff !important;\r\n\t\t}\r\n\t}\r\n}\r\n",".uppercased-small-title {\r\n\ttext-transform: uppercase;\r\n}\r\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/plugins/carhop-format-types/build/index.js b/plugins/carhop-format-types/build/index.js index 3e9c839..64ac705 100644 --- a/plugins/carhop-format-types/build/index.js +++ b/plugins/carhop-format-types/build/index.js @@ -116,6 +116,7 @@ const FootnoteFormatButton = props => { onChange } = props; const [isPopoverOpen, setIsPopoverOpen] = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_4__.useState)(false); + const hasSelection = value.start !== value.end; // Vérifier si on est dans un article (post type 'post') const postType = (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_5__.useSelect)(select => { @@ -123,7 +124,7 @@ const FootnoteFormatButton = props => { }, []); // Ne pas afficher le bouton si ce n'est pas un article - if (postType !== "articles") { + if (postType !== "articles" || !isActive && hasSelection) { return null; } const activeFormat = (0,_wordpress_rich_text__WEBPACK_IMPORTED_MODULE_1__.getActiveFormats)(value).filter(format => format.type === formatName)[0]; @@ -132,6 +133,41 @@ const FootnoteFormatButton = props => { } function removeFormat() { setIsPopoverOpen(false); + const { + text, + formats, + start, + end + } = value; + const textLength = text ? text.length : 0; + const isFootnoteAtIndex = index => { + if (!formats || index < 0 || index >= (formats?.length || 0)) return false; + const charFormats = formats[index]; + if (!charFormats) return false; + return charFormats.some(f => f && f.type === formatName); + }; + if (textLength > 0) { + let pos = Math.min(start, textLength - 1); + // If caret is just after the formatted run, step back one char + if (!isFootnoteAtIndex(pos) && pos > 0 && isFootnoteAtIndex(pos - 1)) { + pos = pos - 1; + } + if (isFootnoteAtIndex(pos)) { + let left = pos; + let right = pos; + while (left >= 0 && isFootnoteAtIndex(left)) left--; + while (right < textLength && isFootnoteAtIndex(right)) right++; + const spanStart = left + 1; + const spanEnd = right; // exclusive + + // Supprimer toujours le texte complet de la footnote + onChange((0,_wordpress_rich_text__WEBPACK_IMPORTED_MODULE_1__.remove)(value, spanStart, spanEnd)); + return; + } + } + + // Fallback: si aucune footnote n'est trouvée à la position du curseur, + // enlever juste le formatage onChange((0,_wordpress_rich_text__WEBPACK_IMPORTED_MODULE_1__.toggleFormat)(value, { type: formatName })); @@ -144,6 +180,17 @@ const FootnoteFormatButton = props => { } })); } + function insertFormat(footnoteContent) { + const text = "[NOTE]"; + const start = value.start; // position du curseur avant insertion + const nextValue = (0,_wordpress_rich_text__WEBPACK_IMPORTED_MODULE_1__.insert)(value, text); + onChange((0,_wordpress_rich_text__WEBPACK_IMPORTED_MODULE_1__.applyFormat)(nextValue, { + type: formatName, + attributes: { + dataFootnoteContent: footnoteContent + } + }, start, start + text.length)); + } return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsx)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.Fragment, { children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsxs)(_wordpress_block_editor__WEBPACK_IMPORTED_MODULE_2__.BlockControls, { children: [isPopoverOpen && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_7__.jsxs)(_wordpress_components__WEBPACK_IMPORTED_MODULE_3__.Popover, { @@ -173,7 +220,13 @@ const FootnoteFormatButton = props => { icon: _wordpress_icons__WEBPACK_IMPORTED_MODULE_8__["default"], isPressed: isActive, label: !isActive ? "Ajouter une note de bas de page" : "Éditer la note de bas de page", - onClick: () => setIsPopoverOpen(true) + onClick: () => { + if (!isActive) { + insertFormat(); + } else { + setIsPopoverOpen(true); + } + } }) })] }) diff --git a/plugins/carhop-format-types/build/index.js.map b/plugins/carhop-format-types/build/index.js.map index 2aa0e55..88adff3 100644 --- a/plugins/carhop-format-types/build/index.js.map +++ b/plugins/carhop-format-types/build/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","mappings":"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","sources":["webpack:///./node_modules/@wordpress/icons/build-module/library/custom-post-type.js","webpack:///./node_modules/@wordpress/icons/build-module/library/text-color.js","webpack:///./src/footnotes/footnote.css","webpack:///./src/footnotes/footnote.js","webpack:///./src/uppercased-small-title/uppercased-small-title.css","webpack:///./src/uppercased-small-title/uppercased-small-title.js","webpack:///external window [\"wp\",\"blockEditor\"]","webpack:///external window [\"wp\",\"components\"]","webpack:///external window [\"wp\",\"data\"]","webpack:///external window [\"wp\",\"element\"]","webpack:///external window [\"wp\",\"i18n\"]","webpack:///external window [\"wp\",\"primitives\"]","webpack:///external window [\"wp\",\"richText\"]","webpack:///external window \"ReactJSXRuntime\"","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///./src/index.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { SVG, Path } from '@wordpress/primitives';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst customPostType = /*#__PURE__*/_jsx(SVG, {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n children: /*#__PURE__*/_jsx(Path, {\n d: \"M4 20h9v-1.5H4V20zm0-5.5V16h16v-1.5H4zm.8-4l.7.7 2-2V12h1V9.2l2 2 .7-.7-2-2H12v-1H9.2l2-2-.7-.7-2 2V4h-1v2.8l-2-2-.7.7 2 2H4v1h2.8l-2 2z\"\n })\n});\nexport default customPostType;\n//# sourceMappingURL=custom-post-type.js.map","/**\n * WordPress dependencies\n */\nimport { SVG, Path } from '@wordpress/primitives';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst textColor = /*#__PURE__*/_jsx(SVG, {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n children: /*#__PURE__*/_jsx(Path, {\n d: \"M12.9 6h-2l-4 11h1.9l1.1-3h4.2l1.1 3h1.9L12.9 6zm-2.5 6.5l1.5-4.9 1.7 4.9h-3.2z\"\n })\n});\nexport default textColor;\n//# sourceMappingURL=text-color.js.map","// extracted by mini-css-extract-plugin\nexport {};","import { __ } from \"@wordpress/i18n\";\r\nimport { registerFormatType, toggleFormat, applyFormat, getActiveFormats } from \"@wordpress/rich-text\";\r\n\r\nimport { BlockControls, __experimentalLinkControl as LinkControl } from \"@wordpress/block-editor\";\r\nimport { Popover, ToolbarGroup, ToolbarButton, TextControl, TextareaControl, Button } from \"@wordpress/components\";\r\n\r\nimport { trash, customPostType } from \"@wordpress/icons\";\r\nimport { useState } from \"@wordpress/element\";\r\nimport { useSelect } from \"@wordpress/data\";\r\n\r\nimport \"./footnote.css\";\r\n\r\nconst formatName = \"carhop-format/footnote\";\r\n\r\nconst FootnoteFormatButton = (props) => {\r\n\tconst { isActive, value, onChange } = props;\r\n\tconst [isPopoverOpen, setIsPopoverOpen] = useState(false);\r\n\r\n\t// Vérifier si on est dans un article (post type 'post')\r\n\tconst postType = useSelect((select) => {\r\n\t\treturn select(\"core/editor\")?.getCurrentPostType();\r\n\t}, []);\r\n\r\n\t// Ne pas afficher le bouton si ce n'est pas un article\r\n\tif (postType !== \"articles\") {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tconst activeFormat = getActiveFormats(value).filter((format) => format.type === formatName)[0];\r\n\r\n\tfunction handleFootnoteContentChange(value) {\r\n\t\tsetFormat(value);\r\n\t}\r\n\r\n\tfunction removeFormat() {\r\n\t\tsetIsPopoverOpen(false);\r\n\t\tonChange(\r\n\t\t\ttoggleFormat(value, {\r\n\t\t\t\ttype: formatName,\r\n\t\t\t})\r\n\t\t);\r\n\t}\r\n\tfunction setFormat(footnoteContent) {\r\n\t\tonChange(\r\n\t\t\tapplyFormat(value, {\r\n\t\t\t\ttype: formatName,\r\n\t\t\t\tattributes: {\r\n\t\t\t\t\tdataFootnoteContent: footnoteContent,\r\n\t\t\t\t},\r\n\t\t\t})\r\n\t\t);\r\n\t}\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t\r\n\t\t\t\t{isPopoverOpen && (\r\n\t\t\t\t\t setIsPopoverOpen(false)}\r\n\t\t\t\t\t\tclassName='popover_footnote_field'>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t setIsPopoverOpen(false)}>\r\n\t\t\t\t\t\t\t\tOk\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\r\n\t\t\t\t)}\r\n\r\n\t\t\t\t\r\n\t\t\t\t\t setIsPopoverOpen(true)}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\r\n\t\t\t
\r\n\t\t\r\n\t);\r\n};\r\n\r\nregisterFormatType(formatName, {\r\n\ttitle: __(\"Notes de bas de page\", \"carhop-format-types\"),\r\n\ttagName: \"a\",\r\n\tattributes: {\r\n\t\tdataFootnoteContent: \"data-footnote-content\",\r\n\t},\r\n\tclassName: \"footnote-reference\",\r\n\tedit: FootnoteFormatButton,\r\n});\r\n","// extracted by mini-css-extract-plugin\nexport {};","import { __ } from \"@wordpress/i18n\";\r\nimport { registerFormatType, toggleFormat } from \"@wordpress/rich-text\";\r\n\r\nimport { RichTextToolbarButton, BlockControls } from \"@wordpress/block-editor\";\r\nimport { ToolbarGroup, ToolbarButton } from \"@wordpress/components\";\r\n\r\nimport { textColor } from \"@wordpress/icons\";\r\nimport { useSelect } from \"@wordpress/data\";\r\n\r\nimport \"./uppercased-small-title.css\";\r\n\r\nconst formatName = \"carhop-format/uppercased-small-title\";\r\n\r\nconst UppercasedSmallTitleFormatButton = (props) => {\r\n\tconst { isActive, value, onChange } = props;\r\n\r\n\tfunction toggleUppercasedSmallTitle() {\r\n\t\tonChange(\r\n\t\t\ttoggleFormat(value, {\r\n\t\t\t\ttype: formatName,\r\n\t\t\t})\r\n\t\t);\r\n\t}\r\n\r\n\t// Vérifier si on est dans un article (post type 'post')\r\n\tconst postType = useSelect((select) => {\r\n\t\treturn select(\"core/editor\")?.getCurrentPostType();\r\n\t}, []);\r\n\r\n\t// Ne pas afficher le bouton si ce n'est pas un article\r\n\tif (postType !== \"page\") {\r\n\t\treturn null;\r\n\t}\r\n\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n};\r\n\r\nregisterFormatType(formatName, {\r\n\ttitle: __(\"Petit titre en majuscules\", \"carhop-format-types\"),\r\n\ttagName: \"span\",\r\n\tclassName: \"uppercased-small-title\",\r\n\tedit: UppercasedSmallTitleFormatButton,\r\n});\r\n","module.exports = window[\"wp\"][\"blockEditor\"];","module.exports = window[\"wp\"][\"components\"];","module.exports = window[\"wp\"][\"data\"];","module.exports = window[\"wp\"][\"element\"];","module.exports = window[\"wp\"][\"i18n\"];","module.exports = window[\"wp\"][\"primitives\"];","module.exports = window[\"wp\"][\"richText\"];","module.exports = window[\"ReactJSXRuntime\"];","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/**\r\n * Carhop Format Types\r\n *\r\n * Point d'entrée principal qui importe tous les format types personnalisés\r\n */\r\n\r\n// Import all format types\r\nimport \"./footnotes/footnote.js\";\r\nimport \"./uppercased-small-title/uppercased-small-title.js\";\r\n"],"names":["__","registerFormatType","toggleFormat","applyFormat","getActiveFormats","BlockControls","__experimentalLinkControl","LinkControl","Popover","ToolbarGroup","ToolbarButton","TextControl","TextareaControl","Button","trash","customPostType","useState","useSelect","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","formatName","FootnoteFormatButton","props","isActive","value","onChange","isPopoverOpen","setIsPopoverOpen","postType","select","getCurrentPostType","activeFormat","filter","format","type","handleFootnoteContentChange","setFormat","removeFormat","footnoteContent","attributes","dataFootnoteContent","children","onClose","className","__nextHasNoMarginBottom","__next40pxDefaultSize","label","variant","onClick","isDestructive","icon","isPressed","title","tagName","edit","RichTextToolbarButton","textColor","UppercasedSmallTitleFormatButton","toggleUppercasedSmallTitle"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"index.js","mappings":"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","sources":["webpack:///./node_modules/@wordpress/icons/build-module/library/custom-post-type.js","webpack:///./node_modules/@wordpress/icons/build-module/library/text-color.js","webpack:///./src/footnotes/footnote.css","webpack:///./src/footnotes/footnote.js","webpack:///./src/uppercased-small-title/uppercased-small-title.css","webpack:///./src/uppercased-small-title/uppercased-small-title.js","webpack:///external window [\"wp\",\"blockEditor\"]","webpack:///external window [\"wp\",\"components\"]","webpack:///external window [\"wp\",\"data\"]","webpack:///external window [\"wp\",\"element\"]","webpack:///external window [\"wp\",\"i18n\"]","webpack:///external window [\"wp\",\"primitives\"]","webpack:///external window [\"wp\",\"richText\"]","webpack:///external window \"ReactJSXRuntime\"","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///./src/index.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { SVG, Path } from '@wordpress/primitives';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst customPostType = /*#__PURE__*/_jsx(SVG, {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n children: /*#__PURE__*/_jsx(Path, {\n d: \"M4 20h9v-1.5H4V20zm0-5.5V16h16v-1.5H4zm.8-4l.7.7 2-2V12h1V9.2l2 2 .7-.7-2-2H12v-1H9.2l2-2-.7-.7-2 2V4h-1v2.8l-2-2-.7.7 2 2H4v1h2.8l-2 2z\"\n })\n});\nexport default customPostType;\n//# sourceMappingURL=custom-post-type.js.map","/**\n * WordPress dependencies\n */\nimport { SVG, Path } from '@wordpress/primitives';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst textColor = /*#__PURE__*/_jsx(SVG, {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n children: /*#__PURE__*/_jsx(Path, {\n d: \"M12.9 6h-2l-4 11h1.9l1.1-3h4.2l1.1 3h1.9L12.9 6zm-2.5 6.5l1.5-4.9 1.7 4.9h-3.2z\"\n })\n});\nexport default textColor;\n//# sourceMappingURL=text-color.js.map","// extracted by mini-css-extract-plugin\nexport {};","import { __ } from \"@wordpress/i18n\";\r\nimport { registerFormatType, toggleFormat, applyFormat, getActiveFormats, insert, remove } from \"@wordpress/rich-text\";\r\n\r\nimport { BlockControls, __experimentalLinkControl as LinkControl } from \"@wordpress/block-editor\";\r\nimport { Popover, ToolbarGroup, ToolbarButton, TextControl, TextareaControl, Button } from \"@wordpress/components\";\r\n\r\nimport { trash, customPostType } from \"@wordpress/icons\";\r\nimport { useState } from \"@wordpress/element\";\r\nimport { useSelect } from \"@wordpress/data\";\r\n\r\nimport \"./footnote.css\";\r\n\r\nconst formatName = \"carhop-format/footnote\";\r\n\r\nconst FootnoteFormatButton = (props) => {\r\n\tconst { isActive, value, onChange } = props;\r\n\tconst [isPopoverOpen, setIsPopoverOpen] = useState(false);\r\n\tconst hasSelection = value.start !== value.end;\r\n\r\n\t// Vérifier si on est dans un article (post type 'post')\r\n\tconst postType = useSelect((select) => {\r\n\t\treturn select(\"core/editor\")?.getCurrentPostType();\r\n\t}, []);\r\n\r\n\t// Ne pas afficher le bouton si ce n'est pas un article\r\n\tif (postType !== \"articles\" || (!isActive && hasSelection)) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tconst activeFormat = getActiveFormats(value).filter((format) => format.type === formatName)[0];\r\n\r\n\tfunction handleFootnoteContentChange(value) {\r\n\t\tsetFormat(value);\r\n\t}\r\n\r\n\tfunction removeFormat() {\r\n\t\tsetIsPopoverOpen(false);\r\n\t\tconst { text, formats, start, end } = value;\r\n\t\tconst textLength = text ? text.length : 0;\r\n\r\n\t\tconst isFootnoteAtIndex = (index) => {\r\n\t\t\tif (!formats || index < 0 || index >= (formats?.length || 0)) return false;\r\n\t\t\tconst charFormats = formats[index];\r\n\t\t\tif (!charFormats) return false;\r\n\t\t\treturn charFormats.some((f) => f && f.type === formatName);\r\n\t\t};\r\n\r\n\t\tif (textLength > 0) {\r\n\t\t\tlet pos = Math.min(start, textLength - 1);\r\n\t\t\t// If caret is just after the formatted run, step back one char\r\n\t\t\tif (!isFootnoteAtIndex(pos) && pos > 0 && isFootnoteAtIndex(pos - 1)) {\r\n\t\t\t\tpos = pos - 1;\r\n\t\t\t}\r\n\r\n\t\t\tif (isFootnoteAtIndex(pos)) {\r\n\t\t\t\tlet left = pos;\r\n\t\t\t\tlet right = pos;\r\n\t\t\t\twhile (left >= 0 && isFootnoteAtIndex(left)) left--;\r\n\t\t\t\twhile (right < textLength && isFootnoteAtIndex(right)) right++;\r\n\r\n\t\t\t\tconst spanStart = left + 1;\r\n\t\t\t\tconst spanEnd = right; // exclusive\r\n\r\n\t\t\t\t// Supprimer toujours le texte complet de la footnote\r\n\t\t\t\tonChange(remove(value, spanStart, spanEnd));\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Fallback: si aucune footnote n'est trouvée à la position du curseur,\r\n\t\t// enlever juste le formatage\r\n\t\tonChange(\r\n\t\t\ttoggleFormat(value, {\r\n\t\t\t\ttype: formatName,\r\n\t\t\t})\r\n\t\t);\r\n\t}\r\n\tfunction setFormat(footnoteContent) {\r\n\t\tonChange(\r\n\t\t\tapplyFormat(value, {\r\n\t\t\t\ttype: formatName,\r\n\t\t\t\tattributes: {\r\n\t\t\t\t\tdataFootnoteContent: footnoteContent,\r\n\t\t\t\t},\r\n\t\t\t})\r\n\t\t);\r\n\t}\r\n\tfunction insertFormat(footnoteContent) {\r\n\t\tconst text = \"[NOTE]\";\r\n\t\tconst start = value.start; // position du curseur avant insertion\r\n\t\tconst nextValue = insert(value, text);\r\n\r\n\t\tonChange(\r\n\t\t\tapplyFormat(\r\n\t\t\t\tnextValue,\r\n\t\t\t\t{\r\n\t\t\t\t\ttype: formatName,\r\n\t\t\t\t\tattributes: { dataFootnoteContent: footnoteContent },\r\n\t\t\t\t},\r\n\t\t\t\tstart,\r\n\t\t\t\tstart + text.length\r\n\t\t\t)\r\n\t\t);\r\n\t}\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t\r\n\t\t\t\t{isPopoverOpen && (\r\n\t\t\t\t\t setIsPopoverOpen(false)}\r\n\t\t\t\t\t\tclassName='popover_footnote_field'>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t setIsPopoverOpen(false)}>\r\n\t\t\t\t\t\t\t\tOk\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\r\n\t\t\t\t)}\r\n\r\n\t\t\t\t\r\n\t\t\t\t\t {\r\n\t\t\t\t\t\t\tif (!isActive) {\r\n\t\t\t\t\t\t\t\tinsertFormat();\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tsetIsPopoverOpen(true);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\r\n\t\t\t
\r\n\t\t\r\n\t);\r\n};\r\n\r\nregisterFormatType(formatName, {\r\n\ttitle: __(\"Notes de bas de page\", \"carhop-format-types\"),\r\n\ttagName: \"a\",\r\n\tattributes: {\r\n\t\tdataFootnoteContent: \"data-footnote-content\",\r\n\t},\r\n\tclassName: \"footnote-reference\",\r\n\tedit: FootnoteFormatButton,\r\n});\r\n","// extracted by mini-css-extract-plugin\nexport {};","import { __ } from \"@wordpress/i18n\";\r\nimport { registerFormatType, toggleFormat } from \"@wordpress/rich-text\";\r\n\r\nimport { RichTextToolbarButton, BlockControls } from \"@wordpress/block-editor\";\r\nimport { ToolbarGroup, ToolbarButton } from \"@wordpress/components\";\r\n\r\nimport { textColor } from \"@wordpress/icons\";\r\nimport { useSelect } from \"@wordpress/data\";\r\n\r\nimport \"./uppercased-small-title.css\";\r\n\r\nconst formatName = \"carhop-format/uppercased-small-title\";\r\n\r\nconst UppercasedSmallTitleFormatButton = (props) => {\r\n\tconst { isActive, value, onChange } = props;\r\n\r\n\tfunction toggleUppercasedSmallTitle() {\r\n\t\tonChange(\r\n\t\t\ttoggleFormat(value, {\r\n\t\t\t\ttype: formatName,\r\n\t\t\t})\r\n\t\t);\r\n\t}\r\n\r\n\t// Vérifier si on est dans un article (post type 'post')\r\n\tconst postType = useSelect((select) => {\r\n\t\treturn select(\"core/editor\")?.getCurrentPostType();\r\n\t}, []);\r\n\r\n\t// Ne pas afficher le bouton si ce n'est pas un article\r\n\tif (postType !== \"page\") {\r\n\t\treturn null;\r\n\t}\r\n\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n};\r\n\r\nregisterFormatType(formatName, {\r\n\ttitle: __(\"Petit titre en majuscules\", \"carhop-format-types\"),\r\n\ttagName: \"span\",\r\n\tclassName: \"uppercased-small-title\",\r\n\tedit: UppercasedSmallTitleFormatButton,\r\n});\r\n","module.exports = window[\"wp\"][\"blockEditor\"];","module.exports = window[\"wp\"][\"components\"];","module.exports = window[\"wp\"][\"data\"];","module.exports = window[\"wp\"][\"element\"];","module.exports = window[\"wp\"][\"i18n\"];","module.exports = window[\"wp\"][\"primitives\"];","module.exports = window[\"wp\"][\"richText\"];","module.exports = window[\"ReactJSXRuntime\"];","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/**\r\n * Carhop Format Types\r\n *\r\n * Point d'entrée principal qui importe tous les format types personnalisés\r\n */\r\n\r\n// Import all format types\r\nimport \"./footnotes/footnote.js\";\r\nimport \"./uppercased-small-title/uppercased-small-title.js\";\r\n"],"names":["__","registerFormatType","toggleFormat","applyFormat","getActiveFormats","insert","remove","BlockControls","__experimentalLinkControl","LinkControl","Popover","ToolbarGroup","ToolbarButton","TextControl","TextareaControl","Button","trash","customPostType","useState","useSelect","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","formatName","FootnoteFormatButton","props","isActive","value","onChange","isPopoverOpen","setIsPopoverOpen","hasSelection","start","end","postType","select","getCurrentPostType","activeFormat","filter","format","type","handleFootnoteContentChange","setFormat","removeFormat","text","formats","textLength","length","isFootnoteAtIndex","index","charFormats","some","f","pos","Math","min","left","right","spanStart","spanEnd","footnoteContent","attributes","dataFootnoteContent","insertFormat","nextValue","children","onClose","className","__nextHasNoMarginBottom","__next40pxDefaultSize","label","variant","onClick","isDestructive","icon","isPressed","title","tagName","edit","RichTextToolbarButton","textColor","UppercasedSmallTitleFormatButton","toggleUppercasedSmallTitle"],"sourceRoot":""} \ No newline at end of file diff --git a/plugins/carhop-format-types/src/footnotes/footnote.css b/plugins/carhop-format-types/src/footnotes/footnote.css index 962affd..e1ad5dd 100644 --- a/plugins/carhop-format-types/src/footnotes/footnote.css +++ b/plugins/carhop-format-types/src/footnotes/footnote.css @@ -18,7 +18,7 @@ body { align-items: center; font-size: 11px !important; font-weight: 600; - margin-left: 3px; + margin-left: 0px; margin-right: 3px; } } diff --git a/plugins/carhop-format-types/src/footnotes/footnote.js b/plugins/carhop-format-types/src/footnotes/footnote.js index 8a6931a..973e917 100644 --- a/plugins/carhop-format-types/src/footnotes/footnote.js +++ b/plugins/carhop-format-types/src/footnotes/footnote.js @@ -1,5 +1,5 @@ import { __ } from "@wordpress/i18n"; -import { registerFormatType, toggleFormat, applyFormat, getActiveFormats } from "@wordpress/rich-text"; +import { registerFormatType, toggleFormat, applyFormat, getActiveFormats, insert, remove } from "@wordpress/rich-text"; import { BlockControls, __experimentalLinkControl as LinkControl } from "@wordpress/block-editor"; import { Popover, ToolbarGroup, ToolbarButton, TextControl, TextareaControl, Button } from "@wordpress/components"; @@ -15,6 +15,7 @@ const formatName = "carhop-format/footnote"; const FootnoteFormatButton = (props) => { const { isActive, value, onChange } = props; const [isPopoverOpen, setIsPopoverOpen] = useState(false); + const hasSelection = value.start !== value.end; // Vérifier si on est dans un article (post type 'post') const postType = useSelect((select) => { @@ -22,7 +23,7 @@ const FootnoteFormatButton = (props) => { }, []); // Ne pas afficher le bouton si ce n'est pas un article - if (postType !== "articles") { + if (postType !== "articles" || (!isActive && hasSelection)) { return null; } @@ -34,6 +35,40 @@ const FootnoteFormatButton = (props) => { function removeFormat() { setIsPopoverOpen(false); + const { text, formats, start, end } = value; + const textLength = text ? text.length : 0; + + const isFootnoteAtIndex = (index) => { + if (!formats || index < 0 || index >= (formats?.length || 0)) return false; + const charFormats = formats[index]; + if (!charFormats) return false; + return charFormats.some((f) => f && f.type === formatName); + }; + + if (textLength > 0) { + let pos = Math.min(start, textLength - 1); + // If caret is just after the formatted run, step back one char + if (!isFootnoteAtIndex(pos) && pos > 0 && isFootnoteAtIndex(pos - 1)) { + pos = pos - 1; + } + + if (isFootnoteAtIndex(pos)) { + let left = pos; + let right = pos; + while (left >= 0 && isFootnoteAtIndex(left)) left--; + while (right < textLength && isFootnoteAtIndex(right)) right++; + + const spanStart = left + 1; + const spanEnd = right; // exclusive + + // Supprimer toujours le texte complet de la footnote + onChange(remove(value, spanStart, spanEnd)); + return; + } + } + + // Fallback: si aucune footnote n'est trouvée à la position du curseur, + // enlever juste le formatage onChange( toggleFormat(value, { type: formatName, @@ -50,6 +85,23 @@ const FootnoteFormatButton = (props) => { }) ); } + function insertFormat(footnoteContent) { + const text = "[NOTE]"; + const start = value.start; // position du curseur avant insertion + const nextValue = insert(value, text); + + onChange( + applyFormat( + nextValue, + { + type: formatName, + attributes: { dataFootnoteContent: footnoteContent }, + }, + start, + start + text.length + ) + ); + } return ( <> @@ -88,7 +140,13 @@ const FootnoteFormatButton = (props) => { ? "Ajouter une note de bas de page" : "Éditer la note de bas de page" } - onClick={() => setIsPopoverOpen(true)} + onClick={() => { + if (!isActive) { + insertFormat(); + } else { + setIsPopoverOpen(true); + } + }} />