UNPKG

@wordpress/editor

Version:
224 lines (222 loc) 9.37 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // packages/editor/src/components/post-revisions-preview/revisions-code-diff.js var revisions_code_diff_exports = {}; __export(revisions_code_diff_exports, { RevisionsCodeDiff: () => RevisionsCodeDiff, default: () => ConnectedRevisionsCodeDiff, getCodeDiffDisplayState: () => getCodeDiffDisplayState, getCodeDiffRows: () => getCodeDiffRows }); module.exports = __toCommonJS(revisions_code_diff_exports); var import_diff = require("diff"); var import_components = require("@wordpress/components"); var import_core_data = require("@wordpress/core-data"); var import_data = require("@wordpress/data"); var import_element = require("@wordpress/element"); var import_i18n = require("@wordpress/i18n"); var import_ui = require("@wordpress/ui"); var import_store = require("../../store/index.cjs"); var import_private_selectors = require("../../store/private-selectors.cjs"); var import_lock_unlock = require("../../lock-unlock.cjs"); var import_jsx_runtime = require("react/jsx-runtime"); var MAX_DIFF_EDIT_LENGTH = 1e3; var DIFF_TIMEOUT = 100; function splitLines(value) { const lines = value.split("\n"); if (lines[lines.length - 1] === "") { lines.pop(); } return lines; } function getCodeDiffRows(previousContent, currentContent, showDiff) { let parts = [{ value: currentContent }]; if (showDiff) { parts = (0, import_diff.diffLines)(previousContent, currentContent, { maxEditLength: MAX_DIFF_EDIT_LENGTH, timeout: DIFF_TIMEOUT }); if (!parts) { parts = [ { value: previousContent, removed: true }, { value: currentContent, added: true } ]; } } let previousLineNumber = 1; let currentLineNumber = 1; return parts.flatMap((part) => { let status = "unchanged"; if (part.added) { status = "added"; } else if (part.removed) { status = "removed"; } return splitLines(part.value).map((value) => { const row = { value, status, previousLineNumber: null, currentLineNumber: null }; if (status !== "added" && showDiff) { row.previousLineNumber = previousLineNumber++; } if (status !== "removed") { row.currentLineNumber = currentLineNumber++; } return row; }); }); } function getCodeDiffDisplayState({ previousRevision, showDiff, hasOlderRevisionPage, hasFinishedPreviousRevision }) { const needsPreviousRevision = showDiff && previousRevision === null && hasOlderRevisionPage; return { showDiff: showDiff && !(needsPreviousRevision && hasFinishedPreviousRevision), isPreviousRevisionLoading: needsPreviousRevision && !hasFinishedPreviousRevision }; } function ConnectedRevisionsCodeDiff() { const revisionDiff = (0, import_data.useSelect)((select) => { const editorSelectors = select(import_store.store); const coreSelectors = select(import_core_data.store); const { getCurrentRevision, getPreviousRevision, getRevisionPage, getRevisionsPerPage, isShowingRevisionDiff } = (0, import_lock_unlock.unlock)(editorSelectors); const _previousRevision = getPreviousRevision(); const _showDiff = isShowingRevisionDiff(); const revisionPage = getRevisionPage(); const totalPages = Math.ceil( editorSelectors.getCurrentPostRevisionsCount() / getRevisionsPerPage() ) || 1; const hasOlderRevisionPage = revisionPage < totalPages; let hasFinishedPreviousRevision = true; if (_showDiff && _previousRevision === null && hasOlderRevisionPage) { const postType = editorSelectors.getCurrentPostType(); const postId = editorSelectors.getCurrentPostId(); const entityConfig = coreSelectors.getEntityConfig( "postType", postType ); const revisionKey = entityConfig?.revisionKey || "id"; hasFinishedPreviousRevision = coreSelectors.hasFinishedResolution( "getRevisions", [ "postType", postType, postId, (0, import_private_selectors.buildRevisionsPageQuery)(revisionKey, revisionPage + 1) ] ); } return { revision: getCurrentRevision(), previousRevision: _previousRevision, ...getCodeDiffDisplayState({ previousRevision: _previousRevision, showDiff: _showDiff, hasOlderRevisionPage, hasFinishedPreviousRevision }) }; }, []); return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(RevisionsCodeDiff, { ...revisionDiff }); } function RevisionsCodeDiff({ revision, previousRevision, showDiff, isPreviousRevisionLoading }) { const rows = (0, import_element.useMemo)(() => { if (!revision || isPreviousRevisionLoading) { return []; } return getCodeDiffRows( previousRevision?.content?.raw ?? "", revision.content?.raw ?? "", showDiff ); }, [revision, previousRevision, showDiff, isPreviousRevisionLoading]); if (!revision || isPreviousRevisionLoading) { return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "editor-revisions-canvas__loading", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_components.Spinner, {}) }); } const label = showDiff ? (0, import_i18n.__)("Code changes") : (0, import_i18n.__)("Revision code"); return /* @__PURE__ */ (0, import_jsx_runtime.jsx)( "div", { className: "editor-revisions-code-diff", role: "region", "aria-label": label, tabIndex: 0, children: rows.length ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("table", { className: "editor-revisions-code-diff__table", children: [ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ui.VisuallyHidden, { render: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("caption", {}), children: label }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ui.VisuallyHidden, { render: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("thead", {}), children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("tr", { children: [ showDiff && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("th", { children: (0, import_i18n.__)("Previous line") }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("th", { children: (0, import_i18n.__)("Current line") }), showDiff && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("th", { children: (0, import_i18n._x)("Change", "noun") }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("th", { children: (0, import_i18n.__)("Code") }) ] }) }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("tbody", { children: rows.map((row, index) => { let marker = ""; let statusLabel = (0, import_i18n.__)("Unchanged"); if (row.status === "added") { marker = "+"; statusLabel = (0, import_i18n.__)("Added"); } else if (row.status === "removed") { marker = "−"; statusLabel = (0, import_i18n.__)("Removed"); } return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)( "tr", { className: `editor-revisions-code-diff__line is-${row.status}`, children: [ showDiff && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("td", { className: "editor-revisions-code-diff__line-number is-previous", children: row.previousLineNumber }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("td", { className: "editor-revisions-code-diff__line-number is-current", children: row.currentLineNumber }), showDiff && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("td", { className: "editor-revisions-code-diff__marker", children: [ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ui.VisuallyHidden, { children: statusLabel }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { "aria-hidden": "true", children: marker }) ] }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("td", { className: "editor-revisions-code-diff__code", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("code", { children: row.value }) }) ] }, index ); }) }) ] }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "editor-revisions-code-diff__empty", children: (0, import_i18n.__)("This revision is empty.") }) } ); } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { RevisionsCodeDiff, getCodeDiffDisplayState, getCodeDiffRows }); //# sourceMappingURL=revisions-code-diff.cjs.map