about.md

О TextDiff — сервисе сравнения текстов

TextDiff — бесплатный онлайн-инструмент diff для поиска различий между двумя текстами. Черновик и исправленная версия документа, отправленный и полученный обратно договор, старая и новая версия кода — вы ставите рядом два похожих текста, а сервис цветом показывает, какие строки добавлены, удалены или изменены и какие именно слова или символы поменялись внутри строки.

Сравнение целиком выполняется в браузере. Введённый текст и открытые файлы не отправляются на сервер, поэтому можно сравнивать даже внутренние документы и договоры, которые нельзя передавать наружу. Вычисления идут в Web Worker, так что интерфейс не зависает даже на десятках тысяч строк.

Перейти к сравнению текстов

Возможности

Подсветка строк и изменений внутри строки

Сначала находятся изменённые строки, затем внутри каждой из них дополнительно выделяются изменившиеся слова, фрагменты или символы.

Боковой и объединённый вид

Переключение между видом «рядом» (side-by-side) и объединённым видом (unified), который читается сверху вниз, как в git.

Опции игнорирования

Можно не учитывать пробелы в конце строк, количество пробелов, все пробелы, регистр и пустые строки.

Нормализация концов строк

Различия переводов строк Windows (CRLF) и macOS/Linux (LF), а также наличие или отсутствие последнего перевода строки считаются одинаковыми.

Сравнение JSON с сортировкой ключей

Оба JSON разбираются, ключи объектов сортируются, отступы выравниваются, и только потом выполняется сравнение. Отличие лишь в порядке ключей не считается различием.

Статистика и навигация

Показывает число добавленных, удалённых и изменённых строк и сходство (%), позволяет сразу переходить к предыдущему или следующему изменению.

Только изменения

Длинные неизменённые участки сворачиваются, остаются только 3 строки вокруг каждого изменения. Свёрнутый участок разворачивается по нажатию.

Перетаскивание файлов

Перетащите в панель .txt, .md, .json, .csv или файл с кодом — или бросьте сразу два файла, чтобы сравнить их.

Экспорт patch и HTML

Результат можно скопировать или сохранить как текст unified diff (patch) либо скопировать цветной HTML-таблицей для письма или документа.

Как пользоваться

  1. Вставьте эталонный текст в левую панель (исходный), а текст для сравнения — в правую (изменённый). Можно также перетащить файл в панель или нажать кнопку открытия над ней.
  2. Если включено «Сравнивать при вводе», результат появляется, как только вы перестаёте печатать. Иначе нажмите [Сравнить] или Ctrl+Enter.
  3. При необходимости включите игнорирование пробелов, регистра или пустых строк, выберите единицу сравнения внутри строки (слова/фрагменты/символы) или сортировку ключей JSON. После смены опции сравнение выполняется заново.
  4. На панели результата выберите боковой или объединённый вид и переходите между изменениями кнопками со стрелками вверх/вниз (или Alt+↑/↓).
  5. Чтобы поделиться результатом, скопируйте или сохраните patch либо скопируйте его как HTML.

Параметры сравнения

Пробелы: сравнивать как естьПробелы и табуляции считаются такими же символами, как буквы. Отличие даже в одном отступе делает строки разными.
Пробелы: игнорировать пробелы в конце строкИгнорируются только пробелы и табуляции в конце строки. Отсеивает различия из-за пробелов, которые редактор удалил или оставил сам. (Аналог -Z в GNU diff)
Пробелы: игнорировать количество пробеловОдин пробел и несколько пробелов считаются одинаковыми. Но место с пробелом и место без пробела по-прежнему различаются: «a b» и «a b» совпадают, а «a b» и «ab» — нет. (diff -b)
Пробелы: игнорировать все пробелыВсе пробелы удаляются перед сравнением, поэтому «a b» и «ab» тоже считаются одной строкой. (diff -w)
Внутри строки: словаИзменения показываются по группам букв и цифр и отдельным знакам. Подходит для кода и текста.
Внутри строки: фрагменты между пробеламиЕдиницей служит всё, что стоит между пробелами, вместе с прилегающей пунктуацией. Удобно для чтения обычной прозы.
Внутри строки: символыСравнение по одному символу. Помогает точно найти места, где изменились один-два символа: суммы, даты, номера пунктов.
Без учёта регистраПрописные и строчные буквы считаются одинаковыми.
Игнорировать пустые строкиПустые строки и строки только из пробелов исключаются из сравнения. Они показываются бледным цветом и не входят в число изменений. (Близко к diff -B)
Нормализовать концы строкCRLF, CR и LF считаются одинаковым переводом строки, наличие перевода строки в конце файла тоже игнорируется. Если опцию выключить, CR в конце строки показывается как ␍, а строка без завершающего перевода строки — как ∅.
Сортировать ключи JSONОбе стороны разбираются как JSON, ключи объектов сортируются по алфавиту, текст переписывается с отступом в 2 пробела и только потом сравнивается. Порядок элементов массивов не меняется. При ошибке разбора показывается её позиция.

Различия в символах конца строки (например, CRLF) точно сравниваются только для текста, загруженного из файла. В тексте, вставленном в поля ввода, браузер преобразует переводы строк в LF, поэтому различия в CR не видны.

Горячие клавиши

Ctrl+Enter / ⌘+EnterСравнить сейчас
Alt+↓ / Alt+↑К следующему / предыдущему изменению
n / p (вне поля ввода)К следующему / предыдущему изменению
Tab (в поле ввода)Ввести символ табуляции

Введённый текст никуда не отправляется

Механизм сравнения — это JavaScript (diff-core.js), загруженный вместе со страницей; тексты и файлы обрабатываются только в памяти браузера. Введённое содержимое не сохраняется, браузер запоминает лишь тему и выбранные опции. После закрытия страницы введённый текст исчезает.

Частые вопросы

Сохраняются ли сравниваемые тексты на сервере?

Нет. Сравнение выполняется только JavaScript-кодом в браузере, и введённый текст не передаётся ни на какой сервер. На уже открытой странице сравнение работает даже без подключения к сети.

Насколько большие тексты можно сравнивать?

Один файл может весить до 30 МБ. Сравнение десятков тысяч строк выполняется в отдельном потоке (Web Worker), поэтому страница не зависает. Если различий очень много, ради скорости может быть выдан приближённый, а не минимальный результат. Когда результат превышает 4 000 строк, сначала показываются только изменения.

Какой алгоритм используется?

Для построчного сравнения используется разностный алгоритм O(ND) Майерса (1986) в варианте с линейной памятью. Если стоимость становится слишком большой, как и GNU diff, он переходит к приближённому разбиению. Внутри изменённых строк тот же алгоритм заново сравнивает слова, фрагменты или символы.

Как отличается «изменено» от «добавлено/удалено»?

Если внутри изменённого участка удалённая и добавленная строки достаточно похожи по содержанию, они объединяются в пару и считаются одной изменённой строкой. Строки без пары считаются добавленными или удалёнными.

Как считается сходство (%)?

Это доля неизменившихся символов среди всех символов обеих сторон (включая переводы строк). Одинаковые строки учитываются целиком, а у изменённых строк — только те части, что остались прежними.

Чем «игнорировать количество пробелов» отличается от «игнорировать все пробелы»?

Первая опция не учитывает лишь число пробелов, поэтому «a b» и «ab» различаются. Вторая удаляет все пробелы перед сравнением, поэтому считает их одинаковыми. В коде, где отступы значимы (например, Python), пользуйтесь игнорированием всех пробелов осторожно.

Можно ли применить patch, созданный с включёнными опциями игнорирования?

Patch строится по различиям, видимым на экране, а контекстные строки берутся из исходного текста. Проигнорированные различия в patch не попадают, поэтому, чтобы получить точную копию файла, выключите все опции перед созданием patch.

Можно ли сравнивать документы Word, PDF или HWP?

Сами файлы прочитать нельзя, но можно скопировать из документа текст и вставить его. Таблицы, сноски и форматирование при этом могут потеряться. Подробности — в руководстве по сравнению документов.

Можно ли пользоваться с телефона?

Да. На узком экране поля ввода располагаются друг под другом, а результат открывается в объединённом виде. Его можно переключить на боковой.

Руководства