@quanglight/seo-defects

1.0.3 • Public • Published

SEO Defects Detector

Build Status

A module to scan a HTML input and output all of the SEO defects

Getting Started

These instructions will get you a copy of the project up and running on your local machine for development and testing purposes.

Installation

Install SEO defects globally using npm:

npm install -g @quanglight/seo-defects

Install on npm locally and save it in your package's package.json file:

npm install --save-dev @quanglight/seo-defects

Example

To get familiar with usage of the module, run an example after installation in terminal:

# cd to seo-defects installed folder inside node_modules folder
npm run-script example

Output should be printed to terminal like below:

This HTML has 3 <img> tag without alt attribute
This HTML has 1 <a> tag without rel attribute
This HTML has <head> tag without <title> tag
This HTML has <head> tag without <meta name='descriptions'/> tag
This HTML has <head> tag without <meta name='keywords'/> tag
This HTML has more than one <h1> tag

Pre-defined SEO rules

This module provides a list of pre-defined SEO rules with ability to override/add new rule easily:

1. Detect if there are any <img /> tags without alt attribute
2. Detect if there are any <a /> tags without rel attribute
3. In <head> tag
   i. Detect if there is any header that doesn’t have <title> tag
   ii. Detect if there is any header that doesn’t have <meta name=“descriptions” ... />
       tag
   iii. Detect if there is any header that doesn’t have <meta name=“keywords” ... /> tag
4. Detect if there are more than 15 <strong> tag in HTML (15 is a value should be
configurable by user)
5. Detect if a HTML have more than one <H1> tag.

Usage

The input can be either:
  • A HTML file (User is able to config the input path)
  • A HTML string
  • Node Readable Stream
The output can be either:
  • A file (User is able to config the output destination)
  • Node Writable Stream
  • Console
  • A string as plain text
Basic usage
Input file, output to console
const Detector = require('@quanglight/seo-defects');
let exampleHtmlFile = "/an_absolute_path_to/file.html";

// Input file, output to console
let detector = new Detector();
detector.scanFromFile(exampleHtmlFile);
Input HTML string, output to string and print it to console
const Detector = require('@quanglight/seo-defects');
let exampleHtml = "<strong>Text</strong>";

let detector = new Detector("string");
detector.proceedScan(exampleHtml);
let stringResult = detector.outputResult();
console.log(stringResult);
Input file with override rule and add new rule, output to console
const Detector = require('@quanglight/seo-defects');
// Custom rule could be a json object, json string or even json file
let customRule = require('/an_absolute_path_to/custom-rules.json');
let exampleHtmlFile = "/an_absolute_path_to/file.html";

// Input file with override rule and add new rule, output to console
detector = new Detector("console", JSON.stringify(customRule));
detector.scanFromFile(exampleHtmlFile);
Input file, output to file with configurable path
const Detector = require('@quanglight/seo-defects');
let outputFilePath = "/an_absolute_file_path/";
let exampleHtmlFile = "/an_absolute_path_to/file.html";

// Input file, output to file with configurable path
detector = new Detector("file", {}, outputFilePath);
detector.scanFromFile(exampleHtmlFile);
Input readable stream, output to console
const Detector = require('@quanglight/seo-defects');
let exampleHtmlFile = "/an_absolute_path_to/file.html";

// Input readable stream, output to console
detector = new Detector();
detector.scanFromStream(require('fs').createReadStream(exampleHtmlFile));
Input file, output to writable stream with allow to access writable stream
const Detector = require('@quanglight/seo-defects');
let exampleHtmlFile = "/an_absolute_path_to/file.html";

// Input file, output to writable stream
detector = new Detector("stream");
let writeStream = detector.outputWriteStream;
writeStream.write = function(data) {
    console.log('Test override write() function');
    console.log(data);
};
detector.scanFromFile(exampleHtmlFile);

Rule structure

Rule is a JSON which can be an object, string or file. To define a rule, it must has structure as below:

With current structure, it support 3 types of rule for SEO defects detection:

  • Detect tag has property
  • Detect tag contains child tag
  • Compare number of tag with given positive number

Below are the way to define a rule for each type:

Detect tag has property
{
  "img": {
    "tag": "img",
    "conditions": [
      {
        "attribute": {
          "assertion": "to.have.property",
          "assertValue": "alt"
        },
        "defectMessage": "This HTML has %d <img> tag without alt attribute"
      }
    ]
  }
}
Detect tag contains child tag
{
  "head": {
      "tag": "head",
      "conditions": [
        {
          "children": {
            "assertion": "to.containSubset",
            "assertValue": [{
              "name": "title"
            }]
          },
          "defectMessage": "This HTML has <head> tag without <title> tag"
        },
        {
          "children": {
            "assertion": "to.containSubset",
            "assertValue": [{
              "name": "meta",
              "attribs": {
                "name": "description"
              }
            }]
          },
          "defectMessage": "This HTML has <head> tag without <meta name='descriptions'/> tag"
        }
      ]
    }
}
Compare number of tag with given positive number
{
  "h1": {
      "tag": "h1",
      "conditions": [
        {
          "itself": {
            "assertion": "length.to.be.below",
            "assertValue": 2
          },
          "defectMessage": "This HTML has more than one <h1> tag"
        }
      ]
    }
}

Tests

Run this command in your package after installation to get test result and its coverage information:

npm test

Credits

The main operation mechanism of this module was inspired by SEO Cop module created by Maulik Patel with all new source code structure intend to improve ability of maintenance and contribution.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Package Sidebar

Install

npm i @quanglight/seo-defects

Weekly Downloads

0

Version

1.0.3

License

MIT

Unpacked Size

30.4 kB

Total Files

11

Last publish

Collaborators

  • quanglight