// @flow import * as React from "react"; import ReactDOMServer from "react-dom/server"; import ReactMarkdown from "react-markdown"; import HtmlDiff from "htmldiff-js"; export function diff(previous: string, current: string) { const previousHtml = ReactDOMServer.renderToStaticMarkup( ); const currentHtml = ReactDOMServer.renderToStaticMarkup( ); return HtmlDiff.execute(previousHtml, currentHtml); } export function compactedDiff(previous: string, current: string) { const html = diff(previous, current); // split diff into lines const lines = html .replace(/ class="(?:[a-z]+)"/g, "") .split(/(<(?:[a-z\d]+)>)/); const firstInsert = lines.indexOf(""); const firstDelete = lines.indexOf(""); let lastInsert = 0, lastDelete = 0; for (let index = lines.length - 1; index >= 0; index--) { if (lines[index] === "") { lastInsert = index; break; } } for (let index = lines.length - 1; index >= 0; index--) { if (lines[index] === "") { lastDelete = index; break; } } const firstChange = (firstInsert < firstDelete || firstDelete === -1) && firstInsert !== -1 ? firstInsert : firstDelete; const lastChange = lastInsert > lastDelete ? lastInsert : lastDelete; if (firstInsert === -1 && firstDelete === -1) { return ""; } return lines .slice(Math.max(0, firstChange - 2), Math.min(lastChange + 2, lines.length)) .join(""); }