npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@markedjs/html-differ

v5.0.1

Published

Compares two HTML

Downloads

8,574

Readme

html-differ

Build Status Dependency Status devDependency Status

Сравнивает два HTML.

Алгоритм сравнения

html-differ сравнивает HTML по следующим критериям:

  • Декларации <!DOCTYPE> не чувствителны к регистру, поэтому следующие два HTML будут считаться эквивалентными:
<!DOCTYPE HTML PUBLIC "_PUBLIC" "_SYSTEM">
<!doctype html public "_PUBLIC" "_SYSTEM">
  • Пробельные символы (пробелы, табуляция, переводы строк и т. д.) внутри открывающих и закрывающих тэгов игнорируются при сравнении.

Например, следующие два HTML будут считаться эквивалентными:

<span id="1"></span>
<span id=
    "1"    ></span   >
  • Два соответствующих списка атрибутов считаются эквивалентными, даже если они записаны в разном порядке.

Например, следующие два HTML будут считаться эквивалентными:

<span id="blah" class="ololo" tabIndex="1">Text</span>
<span tabIndex="1" id="blah" class="ololo">Text</span>
  • Два соответствующих атрибута class считаются эквивалентными, если они ссылаются на одни и те же группы CSS-стилей.

Например, следующие два HTML будут считаться эквивалентными:

<span class="ab bc cd">Text</span>
<span class=" cd  ab bc bc">Text</span>

ВНИМАНИЕ! html-differ не проверяет валидность HTML, а сравнивает их по вышеуказанным критериям и заданным опциям (смотрите список возможных опций).

Установка

$ npm install html-differ

API

###HtmlDiffer###

var HtmlDiffer = require('html-differ').HtmlDiffer,
    htmlDiffer = new HtmlDiffer(options);

где options – это объект.

Опции

ignoreAttributes: [Array]

Устанавливает, значения каких атрибутов следует игнорировать при сравнении (по умолчанию: []).

Пример: ['id', 'for'] Следующие два HTML будут считаться эквивалентными:

<label for="random">Text</label>
<input id="random">
<label for="sfsdfksdf">Text</label>
<input id="sfsdfksdf">
compareAttributesAsJSON: [Array]

Устанавливает, значения каких атрибутов следует сравнивать как JSON-объекты, а не как строки (по умолчанию: []). В тех случаях, когда в качестве значения атрибута выступает некорректный JSON или это значение нельзя обернуть в функцию, то оно будет сравниваться как undefined.

Пример: [{ name: 'data', isFunction: false }, { name: 'onclick', isFunction: true }] Следующие два HTML будут считаться эквивалентными:

<div data='{"bla":{"first":"ololo","second":"trololo"}}'></div>
<span onclick='return {"aaa":"bbb","bbb":"aaa"}'></span>

<button data='REALLY BAD JSON'></button>
<button onclick='REALLY BAD FUNCTION'></button>
<div data='{"bla":{"second":"trololo","first":"ololo"}}'></div>
<span onclick='return {"bbb":"aaa","aaa":"bbb"}'></span>

<button data='undefined'></button>
<button onclick='undefined'></button>

ПРИМЕЧАНИЕ! Первый элемент массива мог быть записан в короткой форме в качестве строки: ['data', { name: 'onclick', isFunction: true }].

ignoreWhitespaces: Boolean

html-differ будет игнорировать пробельные символы (пробелы, табуляция, переводы строк и т. д.) при сравнении (по умолчанию: true).

Пример: true Следующие два HTML будут считаться эквивалентными:

<html>Text Text<head lang="en"><title></title></head><body>Text</body></html>
 <html>
 Text   Text
<head lang="en">
    <title>               </title>


            </head>

<body>
     Text

    </body>




</html>
ignoreComments: Boolean

html-differ будет игнорировать HTML-комментарии при сравнении (по умолчанию: true).

ПРИМЕЧАНИЕ! Условные комментарии не игнорируются.

Пример: true Следующие два HTML будут считаться эквивалентными:

<!DOCTYPE html>
<!-- comments1 -->
<html>
<head lang="en">
    <meta charset="UTF-8">
    <!--[if IE]>
        <link rel="stylesheet" type="text/css" href="all-ie-only.css" />
    <![endif]-->
    <!--[if !IE]><!-->
        <link href="non-ie.css" rel="stylesheet">
    <!--<![endif]-->
</head>
<body>
Text<!-- comments2 -->
</body>
</html>
<!DOCTYPE html>

<html>
<head lang="en">
    <meta charset="UTF-8">
    <!--[if IE]>
        <link href="all-ie-only.css" type="text/css" rel="stylesheet"/>
    <![endif]-->
    <!--[if !IE]><!-->
        <link href="non-ie.css" rel="stylesheet">
    <!--<![endif]-->
</head>
<body>
Text
</body>
</html>
ignoreEndTags: Boolean

html-differ будет игнорировать закрывающие тэги при сравнении (по умолчанию: false).

Пример: true Следующие два HTML будут считаться эквивалентными:

<span>Text</span>
<span>Text</spane>
ignoreSelfClosingSlash: Boolean

html-differ игнорировать теги самозакрывающихся тегов во время сравнения (по умолчанию: false).

Пример: true Следующие два HTML будут считаться эквивалентными:

<img src="blah.jpg" />
<img src="blah.jpg">

Пресеты

  • bem - уставливает предопределенные опции для БЭМ.
Использование

Передача пресета конструктору:

var HtmlDiffer = require('html-differ').HtmlDiffer,
    htmlDiffer = new HtmlDiffer('bem');

Переопределение пресета через конструктор:

var HtmlDiffer = require('html-differ').HtmlDiffer,
    htmlDiffer = new HtmlDiffer({ preset: 'bem', ignoreAttributes: [] });

Методы

htmlDiffer.diffHtml

@param {String} - 1-й HTML @param {String} - 2-й HTML @returns Promise<{Array of objects}> - массив с отличиями между HTML

htmlDiffer.isEqual

@param {String} - 1-й HTML @param {String} - 2-й HTML @returns Promise<{Boolean}>

Logger

var logger = require('html-differ/lib/logger');

Методы

logger.getDiffText

@param {Array of objects} - результат работы метода htmlDiffer.diffHtml @param {Object} - опции:

  • charsAroundDiff: Number - количество символов перед отличием между HTML и после него (по умолчанию: 40)

@returns {String}

logger.logDiffText

@param {Array of objects} - результат работы метода htmlDiffer.diffHtml @param {Object} - опции:

  • charsAroundDiff: Number - количество символов перед отличием между HTML и после него (по умолчанию: 40)

@returns - вывод отличий:

Пример

var fs = require('fs'),
    HtmlDiffer = require('html-differ').HtmlDiffer,
    logger = require('html-differ/lib/logger');

var html1 = fs.readFileSync('1.html', 'utf-8'),
    html2 = fs.readFileSync('2.html', 'utf-8');

var options = {
        ignoreAttributes: [],
        compareAttributesAsJSON: [],
        ignoreWhitespaces: true,
        ignoreComments: true,
        ignoreEndTags: false
    };

var htmlDiffer = new HtmlDiffer(options);

async function run() {
  const diff = await htmlDiffer.diffHtml(html1, html2);
  const isEqual = await htmlDiffer.isEqual(html1, html2);
  const res = logger.getDiffText(diff, { charsAroundDiff: 40 });

  logger.logDiffText(diff, { charsAroundDiff: 40 });
}

run();

Использование в качестве программы

$ html-differ --help
Сравнивает два HTML

Использование:
  html-differ [ОПЦИИ] [АРГУМЕНТЫ]

Опции:
  -h, --help : Помощь
  -v, --version : Показывает номер версии
  --config=CONFIG : Путь к конфигурационному JSON-файлу
  --bem : Использует предопределенные опции для БЭМ (устаревшая опция)
  -p PRESET, --preset=PRESET : Имя пресета
  --chars-around-diff=CHARSAROUNDDIFF : Количество символов перед отличием и после него (по умолчанию: 40)

Аргументы:
  PATH1 : Путь к 1-ому HTML-файлу (обязательный аргумент)
  PATH2 : Путь ко 2-ому HTML-файлу (обязательный аргумент)

Пример

$ html-differ путь/к/html1 путь/к/html2

$ html-differ --config=путь/к/конфигу --chars-around-diff=40 путь/к/html1 путь/к/html2

$ html-differ --preset=bem путь/к/html1 путь/к/html2

Конфигурационный файл

Рассмотрите следующий файл config.json:

{
    "ignoreAttributes": [],
    "compareAttributesAsJSON": [],
    "ignoreWhitespaces": true,
    "ignoreComments": true,
    "ignoreEndTags": false
}

Маски

html-differ поддерживает использование масок в HTML.

Например, следующие два HTML будут считаться эквивалентными:

<div id="{{[a-z]*\s\d+}}">
<div id="text 12345">

Синтаксис

Для записи масок в html-differ используется следующий синтаксис:

{{RegExp}}

где:

  • {{ – открывающий идентификатор маски.

  • RegExp – регулярное выражение для сопоставления с соответствующим значением в сравниваемом HTML. Имеет такой же синтаксис как и регулярные выражения в JavaScript, записанные в literal notation.

  • }} – закрывающий идентификатор маски.

Экранирование

Правила экранирования символов такие же как и при использовании регулярных выражений в JavaScript, записанных в literal notation.

Например, следующие два HTML будут считаться эквивалентными:

<div id="{{\d\.\d}}">
<div id="1.1">

Если вы хотите хотите использовать {{ или }} внутри маски, вам необходимо экранировать обе фигурные скобки, то есть \{\} или \}\}

Например, следующие два HTML будут считаться эквивалентными:

<div class="{{a\{\{b\}\}c}}">
<div class="a{{b}}c">