All Projects → andrejewski → Himalaya

andrejewski / Himalaya

Licence: isc
JavaScript HTML to JSON Parser

Programming Languages

javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to Himalaya

Rdflib Jsonld
JSON-LD parser and serializer plugins for RDFLib (Python 2.6+)
Stars: ✭ 250 (-67.02%)
Mutual labels:  json, parser
Csv Parser
A modern C++ library for reading, writing, and analyzing CSV (and similar) files.
Stars: ✭ 359 (-52.64%)
Mutual labels:  json, parser
C Sharp Stack Only Json Parser
Stack only json deserialization using generators and the System.Text.Json library
Stars: ✭ 254 (-66.49%)
Mutual labels:  json, parser
Sdk
Library for using Grafana' structures in Go programs and client for Grafana REST API.
Stars: ✭ 193 (-74.54%)
Mutual labels:  json, parser
Tomlplusplus
Header-only TOML config file parser and serializer for C++17 (and later!).
Stars: ✭ 403 (-46.83%)
Mutual labels:  json, parser
Baby
Create models from a JSON file, even a Baby can do it.
Stars: ✭ 214 (-71.77%)
Mutual labels:  json, parser
Bad json parsers
Exposing problems in json parsers of several programming languages.
Stars: ✭ 351 (-53.69%)
Mutual labels:  json, parser
Omniparser
omniparser: a native Golang ETL streaming parser and transform library for CSV, JSON, XML, EDI, text, etc.
Stars: ✭ 148 (-80.47%)
Mutual labels:  json, parser
Json Rust
JSON implementation in Rust
Stars: ✭ 395 (-47.89%)
Mutual labels:  json, parser
Stream Parser
⚡ PHP7 / Laravel Multi-format Streaming Parser
Stars: ✭ 391 (-48.42%)
Mutual labels:  json, parser
Rapidyaml
Rapid YAML - a library to parse and emit YAML, and do it fast.
Stars: ✭ 183 (-75.86%)
Mutual labels:  json, parser
Crossplane
Quick and reliable way to convert NGINX configurations into JSON and back.
Stars: ✭ 407 (-46.31%)
Mutual labels:  json, parser
Json To Ast
JSON AST parser
Stars: ✭ 161 (-78.76%)
Mutual labels:  json, parser
Pxi
🧚 pxi (pixie) is a small, fast, and magical command-line data processor similar to jq, mlr, and awk.
Stars: ✭ 248 (-67.28%)
Mutual labels:  json, parser
Gelatin
Transform text files to XML, JSON, or YAML
Stars: ✭ 150 (-80.21%)
Mutual labels:  json, parser
Ojg
Optimized JSON for Go
Stars: ✭ 281 (-62.93%)
Mutual labels:  json, parser
Json Autotype
Automatic Haskell type inference from JSON input
Stars: ✭ 139 (-81.66%)
Mutual labels:  json, parser
Jaxon
Streaming JSON parser for Elixir
Stars: ✭ 145 (-80.87%)
Mutual labels:  json, parser
Choetl
ETL Framework for .NET / c# (Parser / Writer for CSV, Flat, Xml, JSON, Key-Value, Parquet, Yaml, Avro formatted files)
Stars: ✭ 372 (-50.92%)
Mutual labels:  json, parser
Jsonparser
One of the fastest alternative JSON parser for Go that does not require schema
Stars: ✭ 4,323 (+470.32%)
Mutual labels:  json, parser

Himalaya

Parse HTML into JSON

npm Build Status Coverage Status Greenkeeper badge

Try online 🚀 | Read the specification 📖

Usage

Node

npm install himalaya
import fs from 'fs'
import {parse} from 'himalaya'
const html = fs.readFileSync('/webpage.html', {encoding: 'utf8'})
const json = parse(html)
console.log('👉', json)

Browser

Download himalaya.js and put it in a <script> tag. Himalaya will be accessible from window.himalaya.

const html = '<div>Hello world</div>'
const json = window.himalaya.parse(html)
console.log('👉', json)

Himalaya bundles well with Browersify and Webpack.

Example Input/Output

<div class='post post-featured'>
  <p>Himalaya parsed me...</p>
  <!-- ...and I liked it. -->
</div>
[{
  type: 'element',
  tagName: 'div',
  attributes: [{
    key: 'class',
    value: 'post post-featured'
  }],
  children: [{
    type: 'element',
    tagName: 'p',
    attributes: [],
    children: [{
      type: 'text',
      content: 'Himalaya parsed me...'
    }]
  }, {
    type: 'comment',
    content: ' ...and I liked it. '
  }]
}]

Note: In this example, text nodes consisting of whitespace are not shown for readability.

Features

Synchronous

Himalaya transforms HTML into JSON, that's it. Himalaya is synchronous and does not require any complicated callbacks.

Handles Weirdness

Himalaya handles a lot of HTML's fringe cases, like:

  • Closes unclosed tags <p><b>...</p>
  • Ignores extra closing tags <span>...</b></span>
  • Properly handles void tags like <meta> and <img>
  • Properly handles self-closing tags like <input/>
  • Handles <!doctype> and <-- comments -->
  • Does not parse the contents of <script>, <style>, and HTML5 <template> tags

Preserves Whitespace

Himalaya does not cut corners and returns an accurate representation of the HTML supplied. To remove whitespace, post-process the JSON; check out an example script.

Line, column, and index positions

Himalaya can include the start and end positions of nodes in the parse output. To enable this, you can pass parse the parseDefaults extended with includePositions: true:

import { parse, parseDefaults } from 'himalaya'
parse('<img>', { ...parseDefaults, includePositions: true })
/* =>
[
  {
    "type": "element",
    "tagName": "img",
    "attributes": [],
    "children": [],
    "position": {
      "start": {
        "index": 0,
        "line": 0,
        "column": 0
      },
      "end": {
        "index": 5,
        "line": 0,
        "column": 5
      }
    }
  }
]
*/

Going back to HTML

Himalaya provides a stringify method. The following example parses the HTML to JSON then parses the JSON back into HTML.

import fs from 'fs'
import {parse, stringify} from 'himalaya'

const html = fs.readFileSync('/webpage.html', {encoding: 'utf8'})
const json = parse(html)
fs.writeFileSync('/webpage.html', stringify(json))

Why "Himalaya"?

First, my friends weren't helpful. Except Josh, Josh had my back.

While I was testing the parser, I threw a download of my Twitter homepage in and got a giant JSON blob out. My code editor Sublime Text has a mini-map and looking at it sideways the data looked like a never-ending mountain range. Also, "himalaya" has H, M, L in it.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].