How to use the fast-diff function in fast-diff

To help you get started, we’ve selected a few fast-diff examples, based on popular ways it is used in public projects.

Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.

github elm-tooling / elm-language-server / src / util / diff.ts View on Github external
export function getTextRangeChanges(
  before: string,
  after: string,
): Promise {
  const newRanges: TextEdit[] = [];
  let lineNumber = 0;
  let column = 0;

  const parts = diff(before, after);

  // Loop over every part, keeping track of:
  // 1. The current line no. and column in the `after` string
  // 2. Character ranges for all "added" parts in the `after` string
  parts.forEach(part => {
    const startLineNumber = lineNumber;
    const startColumn = column;
    if (part[0] === 0 || part[0] === -1) {
      // Split the part into lines. Loop through these lines to find
      // the line no. and column at the end of this part.
      const substring = part[1];
      const lines = substring.split("\n");
      lines.forEach((line, lineIndex) => {
        // The first `line` is actually just a continuation of the last line
        if (lineIndex === 0) {
          column += line.length;
github peer-base / peer-pad / src / lib / bind-editor.js View on Github external
const onTitleEditorChanged = () => {
    if (!titleCollab) {
      return
    }

    const oldTitle = titleCollab.shared.value().join('')
    const newTitle = titleEditor.value

    const diffs = Diff(oldTitle, newTitle)

    let pos = 0
    diffs.forEach((d) => {
      if (d[0] === 0) { // EQUAL
        pos += d[1].length
      } else if (d[0] === -1) { // DELETE
        const delText = d[1]
        for (let i = delText.length - 1; i >= 0; i--) {
          try {
            titleCollab.shared.removeAt(pos + i)
          } catch (err) {
            console.error(err)
            onStateChanged()
          }
        }
      } else { // INSERT
github peer-base / peer-base / examples / react-app / src / TextCollaboration.js View on Github external
applyChanges (target, newText) {
    const { collaboration } = this.props
    const oldText = this.state.value
    const diffs = Diff(oldText, newText)
    let pos = 0
    diffs.forEach((d) => {
      if (d[0] === 0) { // EQUAL
        pos += d[1].length
      } else if (d[0] === -1) { // DELETE
        const delText = d[1]
        for (let i = delText.length - 1; i >= 0; i--) {
          collaboration.shared.removeAt(pos + i)
        }
      } else { // INSERT
        d[1].split('').forEach((c) => {
          collaboration.shared.insertAt(pos, d[1])
        })
        pos += d[1].length
      }
    })
github peer-base / peer-base / examples / react-app / src / TextCollaboration.js View on Github external
onRemoteChange (oldText, newText) {
    console.log('onValueChanged', oldText, newText)
    const textArea = this.refs.collaborativeTextArea
    if (textArea.value === newText) {
      console.log('value is the same', textArea.value)
      return
    }
    const cursor = {
      start: textArea.selectionStart,
      end: textArea.selectionEnd
    }

    const diffs = Diff(oldText, newText)

    let pos = 0
    diffs.forEach((d) => {
      if (d[0] === 0) { // EQUAL
        pos += d[1].length
      } else if (d[0] === -1) { // DELETE
        const delText = d[1]
        if (pos < cursor.start) {
          cursor.start -= delText.length
        }
        if (pos < cursor.end) {
          cursor.end -= delText.length
        }
      } else { // INSERT
        const insertText = d[1]
        if (pos < cursor.start) {
github neoclide / coc.nvim / src / cursors / index.ts View on Github external
private async applyComposedEdit(original: string, edit: TextEdit): Promise {
    // check complex edit
    let { range, newText } = edit
    let { nvim, ranges } = this
    let doc = TextDocument.create('file:///1', '', 0, original)
    let edits: TextEdit[] = []
    let diffs = fastDiff(original, newText)
    let offset = 0
    for (let i = 0; i < diffs.length; i++) {
      let diff = diffs[i]
      let pos = adjustPosition(range.start, doc.positionAt(offset))
      if (diff[0] == fastDiff.EQUAL) {
        offset = offset + diff[1].length
      } else if (diff[0] == fastDiff.DELETE) {
        let end = adjustPosition(range.start, doc.positionAt(offset + diff[1].length))
        if (diffs[i + 1] && diffs[i + 1][0] == fastDiff.INSERT) {
          // change
          edits.push({ range: Range.create(pos, end), newText: diffs[i + 1][1] })
          i = i + 1
        } else {
          // delete
          edits.push({ range: Range.create(pos, end), newText: '' })
        }
github neoclide / coc.nvim / src / extensions.ts View on Github external
workspace.watchOption('runtimepath', async (oldValue, newValue) => {
      let result = fastDiff(oldValue, newValue)
      for (let [changeType, value] of result) {
        if (changeType == 1) {
          let paths = value.replace(/,$/, '').split(',')
          for (let p of paths) {
            if (p) await this.loadExtension(p, true)
          }
        }
      }
    })
    commandManager.register({
github neoclide / coc.nvim / src / handler / refactor.ts View on Github external
let doc = this.document
    if (doc.version - this.version == 1) return
    let { fileItems } = this
    if (!fileItems.length) return
    let change = e.contentChanges[0]
    let { original } = e
    if (change.range.end.line < 2) return
    doc.buffer.setOption('modified', true, true)
    let { range, text } = change
    let lines = text.split('\n')
    let lineChange = lines.length - (range.end.line - range.start.line) - 1
    if (lineChange == 0) return
    let lineChanges: LineChange[] = []
    if (text.indexOf('\u3000') !== -1) {
      let startLine = range.start.line
      let diffs = fastDiff(original, text)
      let offset = 0
      let orig = TextDocument.create('file:///1', '', 0, original)
      for (let i = 0; i < diffs.length; i++) {
        let diff = diffs[i]
        let pos = orig.positionAt(offset)
        if (diff[0] == fastDiff.EQUAL) {
          offset = offset + diff[1].length
        } else if (diff[0] == fastDiff.DELETE) {
          let end = orig.positionAt(offset + diff[1].length)
          if (diffs[i + 1] && diffs[i + 1][0] == fastDiff.INSERT) {
            let delta = diffs[i + 1][1].split('\n').length - (end.line - pos.line) - 1
            if (delta != 0) lineChanges.push({ delta, lnum: pos.line + startLine })
            i = i + 1
          } else {
            let delta = - (end.line - pos.line)
            if (delta != 0) lineChanges.push({ delta, lnum: pos.line + startLine })
github Kitware / minerva / web_external / views / widgets / InfovizWidget.js View on Github external
}).sortBy((property) => {
                var values = Object.keys(summary[property].values);
                var sortby = diff(values[0], values.slice(-1)[0]).filter((diff) => {
                    return diff[0] !== 0;
                }).length;
                return sortby;
            }).reverse().value()[0];
        if (candidatePropertyForX) {
github peer-base / peer-pad / src / lib / bind-editor.js View on Github external
const onCodeMirrorChange = (editor) => {
    editorValueCache = undefined
    if (!initialised || locked) {
      return
    }
    const diffs = Diff(doc.shared.value().join(''), getEditorValue())
    applyDiffs(0, diffs)
  }

fast-diff

Fast Javascript text diff

Apache-2.0
Latest version published 12 months ago

Package Health Score

74 / 100
Full package analysis