@wordpress/editor
Version:
Enhanced block editor for WordPress posts.
224 lines (222 loc) • 9.37 kB
JavaScript
;
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