Repository: wardi/jsonlines Branch: main Commit: a8e8671adf47 Files: 20 Total size: 41.4 KB Directory structure: gitextract_7a253wp1/ ├── .github/ │ └── workflows/ │ └── jekyll.yml ├── .gitignore ├── CNAME ├── Gemfile ├── README.md ├── _config.yml ├── _data/ │ └── menu.yml ├── _includes/ │ ├── footer.html │ ├── head.html │ └── menu.html ├── _layouts/ │ └── default.html ├── examples/ │ └── index.md ├── index.md ├── javascripts/ │ └── validator.js ├── on_the_web/ │ └── index.md ├── params.json ├── stylesheets/ │ ├── print.css │ ├── pygment_trac.css │ └── stylesheet.css └── validator/ └── index.md ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/workflows/jekyll.yml ================================================ # Sample workflow for building jekyll website name: Build With Jekyll on: # Runs on pushes targeting the default branch push: branches: ["main"] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages permissions: contents: write # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. concurrency: group: "pages" cancel-in-progress: false jobs: # Build job build: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Setup uses: ruby/setup-ruby@v1 with: ruby-version: '3.3.5' bundler-cache: true cache-version: 0 - name: Build run: bundle exec jekyll build env: JEKYLL_ENV: production - name: Upload uses: actions/upload-artifact@v4 with: name: site path: _site overwrite: true # Push job push: runs-on: ubuntu-latest needs: build steps: - name: Checkout uses: actions/checkout@v4 with: ref: gh-pages - name: Delete run : rm -rf /tmp/site - name: Download uses: actions/download-artifact@v4 with: name: site path: /tmp/site - name: Sync run: rsync -avh --delete --exclude .git /tmp/site/ . - name: Push run: | git status git add . git config --global user.name 'Deploy Bot' git config --global user.email 'deploy-bot@jsonlines.org' git commit --allow-empty -m 'Automated Deployment' git push ================================================ FILE: .gitignore ================================================ # Bundle generated folders .bundle vendor/bundle # Jekyll generated folders _site .sass-cache/ .jekyll-cache/ .jekyll-metadata ================================================ FILE: CNAME ================================================ jsonlines.org ================================================ FILE: Gemfile ================================================ source "https://rubygems.org" gem "jekyll", "~> 4.3.3" ================================================ FILE: README.md ================================================ # jsonlines Documentation for the JSON Lines text file format Visit https://jsonlines.org ## Development ### Jekyll installation Follow steps: - https://jekyllrb.com/docs/installation/ - https://jekyllrb.com/docs ### Bundle installation ```shell bundle config set --local path 'vendor/bundle' bundle install ``` ### Build and serve the site ```shell # just build the website bundle exec jekyll build # build and serve the website on default port bundle exec jekyll serve ``` ================================================ FILE: _config.yml ================================================ # Site settings # These are used to personalize your new site. If you look in the HTML files, # you will see them accessed via {{ site.title }}, {{ site.description }}, and so on. # # You can create any custom variable you would like, and they will be accessible # in the templates via {{ site.myvariable }}. title: JSON Lines description: >- This page describes the JSON Lines text format, also called newline-delimited JSON. JSON Lines is a convenient format for storing structured data that may be processed one record at a time. It works well with unix-style text processing tools and shell pipelines. It's a great format for log files. It's also a flexible format for passing messages between cooperating processes. baseurl: "" # the subpath of your site, e.g. /blog url: "https://jsonlines.org" # the base hostname & protocol for your site, e.g. http://example.com # Build settings # Disable warning related to https://sass-lang.com/d/slash-div sass: quiet_deps: true # Exclude from processing. # The following items will not be processed, by default. # Any item listed under the `exclude:` key here will be automatically added to # the internal "default list". # # Excluded items can be processed by explicitly listing the directories or # their entries' file path in the `include:` list. # exclude: - README.md # - .sass-cache/ # - .jekyll-cache/ # - gemfiles/ # - Gemfile # - Gemfile.lock # - node_modules/ # - vendor/bundle/ # - vendor/cache/ # - vendor/gems/ # - vendor/ruby/ ================================================ FILE: _data/menu.yml ================================================ items: - label: Home url: '/' - label: Examples url: '/examples/' - label: 'Validator' url: '/validator/' - label: 'On the web' url: '/on_the_web/' - label: 'json.org' url: 'https://json.org' ================================================ FILE: _includes/footer.html ================================================ ================================================ FILE: _includes/head.html ================================================ {%- for css in page.custom-css-list -%} {% endfor %} {%- for javascript in page.custom-javascript-list -%} {% endfor %} {%- if page.title != 'JSON Lines' -%}JSON Lines | {%- endif -%}{{ page.title }} ================================================ FILE: _includes/menu.html ================================================ ================================================ FILE: _layouts/default.html ================================================ {% include head.html %}

JSON Lines

{% if page.subtitle %}{{ page.subtitle }}{% else %}{{ page.title }}{% endif %}

{% include menu.html %}
{{ content -}}
{% include footer.html %}
================================================ FILE: examples/index.md ================================================ --- layout: default title: Examples ---

Better than CSV

["Name", "Session", "Score", "Completed"]
["Gilbert", "2013", 24, true]
["Alexa", "2013", 29, true]
["May", "2012B", 14, false]
["Deloise", "2012A", 19, true] 

CSV seems so easy that many programmers have written code to generate it themselves, and almost every implementation is different. Handling broken CSV files is a common and frustrating task. CSV has no standard encoding, no standard column separator and multiple character escaping standards. String is the only type supported for cell values, so some programs attempt to guess the correct types.

JSON Lines handles tabular data cleanly and without ambiguity. Cells may use the standard JSON types.

The biggest missing piece is an import/export filter for popular spreadsheet programs so that non-programmers can use this format.

Self-describing data

{"name": "Gilbert", "session": "2013", "score": 24, "completed": true}
{"name": "Alexa", "session": "2013", "score": 29, "completed": true}
{"name": "May", "session": "2012B", "score": 14, "completed": false}
{"name": "Deloise", "session": "2012A", "score": 19, "completed": true} 

JSON Lines enables applications to read objects line-by-line, with each line fully describing a JSON object. The example above contains the same data as the tabular example above, but allows applications to split files on newline boundaries for parallel loading, and eliminates any ambiguity if fields are omitted or re-ordered.

Easy Nested Data

{"name": "Gilbert", "wins": [["straight", "7♣"], ["one pair", "10♥"]]}
{"name": "Alexa", "wins": [["two pair", "4♠"], ["two pair", "9♠"]]}
{"name": "May", "wins": []}
{"name": "Deloise", "wins": [["three of a kind", "5♣"]]}

JSON Lines' biggest strength is in handling lots of similar nested data structures. One .jsonl file is easier to work with than a directory full of XML files.

If you have large nested structures then reading the JSON Lines text directly isn't recommended. Use the "jq" tool to make viewing large structures easier:

grep pair winning_hands.jsonl | jq .
{
  "name": "Gilbert", 
  "wins": [
    [
      "straight", 
      "7♣"
    ], 
    [
      "one pair", 
      "10♥"
    ]
  ]
}
{
  "name": "Alexa", 
  "wins": [
    [
      "two pair", 
      "4♠"
    ], 
    [
      "two pair", 
      "9♠"
    ]
  ]
}

================================================ FILE: index.md ================================================ --- layout: default title: JSON Lines subtitle: Documentation for the JSON Lines text file format ---

This page describes the JSON Lines text format, also called newline-delimited JSON. JSON Lines is a convenient format for storing structured data that may be processed one record at a time. It works well with unix-style text processing tools and shell pipelines. It's a great format for log files. It's also a flexible format for passing messages between cooperating processes.

The JSON Lines format has three requirements:

1. UTF-8 Encoding

JSON allows encoding Unicode strings with only ASCII escape sequences, however those escapes will be hard to read when viewed in a text editor. The author of the JSON Lines file may choose to escape characters to work with plain ASCII files.

Encodings other than UTF-8 are very unlikely to be valid when decoded as UTF-8 so the chance of accidentally misinterpreting characters in JSON Lines files is low.

Like the JSON standard a byte order mark (U+FEFF) must NOT be included.

2. Each Line is a Valid JSON Value

The most common values will be objects or arrays, but any JSON value is permitted. e.g. null is a valid value but a blank line is not.

See json.org for a definition of JSON values.

3. Line Terminator is '\n'

This means '\r\n' is also supported because surrounding white space is implicitly ignored when parsing JSON values.

Including a line terminator after the last JSON value in a file is strongly recommended but not required. Including a line terminator after every JSON value makes generating and concatenating JSON Lines files easier. If a line terminator follows the last JSON value in a file, it must be the last byte in the file.

Conventions

JSON Lines files may be saved with the file extension .jsonl.

Stream compressors like gzip or bzip2 are recommended for saving space, resulting in .jsonl.gz or .jsonl.bz2 files.

MIME type may be application/jsonl, but this is not yet standardized; any help writing the RFC would be greatly appreciated (see issue).

Text editing programs call the first line of a text file "line 1". The first value in a JSON Lines file should also be called "value 1".

================================================ FILE: javascripts/validator.js ================================================ /* VALIDATOR */ $(document).ready(() => { // CodeMirror editor let editor = CodeMirror.fromTextArea(jQuery('.validator textarea')[0], { lineNumbers: true, theme: 'abbott', mode: 'javascript', }); // clear button jQuery('.validator input[type="button"][value="clear"]').click(() => { editor.setValue(''); }); // validate button jQuery('.validator input[type="button"][value="validate"]').click(() => { let jsonl = editor.getValue(); let lines = jsonl.split('\n'); let errors = []; for (let i = 0; i < lines.length; i++) { let line = lines[i] if (i !== lines.length - 1 || lines[i] !== '') { try { JSON.parse(line); } catch (e) { if (e instanceof SyntaxError) { errors.push(`line ${i + 1}: error ${e}\n`); } else { throw e; } } } } let result = jQuery('.validator div.result ul'); result.empty(); if (0 < errors.length) { errors.forEach((error) => { result.append(`
  • ${error}
  • `); }); } else { result.append('valid jsonl') } }); }); ================================================ FILE: on_the_web/index.md ================================================ --- layout: default title: On The Web ---

    Airbyte is an open-source data integration tool that uses JSON Lines to communicate between containerized source applications that pull data from files/APIs/databses and containerized destination applications that write data to warehouses.

    Apache Spark uses JSONL for reading and writing JSON data.

    ArangoDB is an open source multi-model database. The JSON lines format allows to import huge amounts of documents sequentially (via arangoimport).

    BigQuery uses JSON Lines as one of the supported formats to load data into the database.

    BKL is a layered templating configuration tool that supports JSON Lines input and output.

    Bubbles supports JSON Lines datastores

    ClickHouse is an open source column-oriented DBMS. It supports JSON lines as JSONEachRow format for input and output.

    CSS HTML Validator for Windows v22.0211+ now supports JSON Lines syntax checking.

    Dart uses JSON Lines as one of the possible reporters when running tests.

    Dataflow kit is a web scraping open source framework written in Go. JSON Lines is one of the supported formats for storing results.

    Go Standard library's json.Encoder will produce JSON lines by default. The decoder parses Concatenated JSON, which is compatible with, though less strict than, JSON lines

    Golang JSONL library

    Graylog GELF is format for log messages, their stream is de-facto JSON lines.

    Immich is a self-hosted photo and video management solution. It uses JSON Lines for efficient syncing between its server and mobile clients, enabling incremental, resumable synchronization with minimal memory overhead.

    Kubernetes (k8s) is an open-source container orchestration system. It uses JSON Lines as format for auditing.

    Liquid Studio includes a JSON Lines Editor in a unique split view. The top view can load Terabyte+ JSON Lines files, the bottom view's JSON editor contains the selected JSON lines item, with syntax highlighting, schema aware validation, auto complete/intellisense, and other tools.

    Logstash supports JSON Lines via the json_lines codec

    Mattermost is an open-source, self-hostable online chat service. It uses JSON Lines as the format for bulk data migration on self-hosted instances.

    Miller supports JSON Lines format as input.

    NDJSON is a similar format that also allows blank lines

    Neo4j the open-source graph database supports JSONL export and import via its standard library procedures apoc.export/import.json to allow stream processing of nodes and relationships.

    OpenAI Evals is an AI Evaluations (Evals) application using JSON Lines to pass in bulk data.

    petl is a general purpose Python package for extracting, transforming and loading tables of data. It allows importing and exporting documents/records between many databases and file formats, including JSON lines, in local and remote filesystems and clouds.

    php-jsonl is a PHP library for reading & writing JSON Lines documents, taking advantage of the streaming benefits.

    plot.ly uses JSON Lines for its streaming data API

    pytest-reportlog is a pytest plugin which writes testing report data in JSON lines format

    Rumble is a JSONiq engine that runs on top of Spark. It can process datasets in the JSON lines format that have billions of objects and more.

    Scrapy is a framework for web scraping & crawling, it supports and recommends JSON lines since long -- it might've even coined the term.

    serde-jsonlines is a Rust library for reading & writing JSON Lines documents.

    Shopify GraphQL Bulk Operations API, designed for very large data exports from Shopify stores, returns results in the form of a JSONL file.

    Virtual JSON Viewer is a browser extension for navigating large JSON content which natively supports JSON Lines format.

    ================================================ FILE: params.json ================================================ {"name":"Jsonlines","tagline":"Documentation for the JSON Lines text file format","body":"### JSON Lines: Simple. Like JSON.\r\n\r\nThis page describes the JSON Lines text format. JSON Lines is a convenient format for storing\r\nstructured data that may be processed one record at a time. It works well with unix-style\r\ntext processing tools and shell pipelines.\r\n\r\nJSON Lines files may be saved with the file extension `.jsonl`.\r\n\r\nStream compressors like `gzip` or `bzip2`\r\nare recommended for saving space, resulting in `.jsonl.gz` or `.jsonl.bz2` files.\r\n\r\n### UTF-8 Encoding\r\n\r\nUTF-8 is backwards compatible with ASCII. JSON allows encoding Unicode strings with only ASCII escape sequences, however those escapes are ugly in a text editor.\r\n\r\nChoosing UTF-8 as the standard lets the JSON Lines\r\nauthor choose to escape characters or not. Also, if a file is saved with a different encoding it is very\r\nunlikely to be valid UTF-8, making the mistake quickly obvious.\r\n\r\n### Each Line is a Valid JSON Value\r\n\r\nThe most common values will be objects or arrays, but any of the following is valid:\r\n\r\n* string\r\n* number\r\n* object\r\n* array\r\n* `true`\r\n* `false`\r\n* `null`\r\n\r\nSee for more information.\r\n\r\n### Line Separator is `'\\n'`\r\n\r\nThis means `'\\r\\n'` is also supported because white space within lines is ignored, as dictated\r\nby the JSON spec.\r\n\r\nThe last character in the file *may* be a line separator, and it will be treated the same as\r\nif there was no line separator.\r\n\r\n### Count Lines From 1\r\n\r\nText editing programs call the first line of a text file \"line 1\". We also call the first JSON value in a JSON Lines file value 1.\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} ================================================ FILE: stylesheets/print.css ================================================ html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { margin: 0; padding: 0; border: 0; font-size: 100%; font: inherit; vertical-align: baseline; } /* HTML5 display-role reset for older browsers */ article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { display: block; } body { line-height: 1; } ol, ul { list-style: none; } blockquote, q { quotes: none; } blockquote:before, blockquote:after, q:before, q:after { content: ''; content: none; } table { border-collapse: collapse; border-spacing: 0; } body { font-size: 13px; line-height: 1.5; font-family: 'Helvetica Neue', Helvetica, Arial, serif; color: #000; } a { color: #d5000d; font-weight: bold; } header { padding-top: 35px; padding-bottom: 10px; } header h1 { font-weight: bold; letter-spacing: -1px; font-size: 48px; color: #303030; line-height: 1.2; } header h2 { letter-spacing: -1px; font-size: 24px; color: #aaa; font-weight: normal; line-height: 1.3; } #downloads { display: none; } #main_content { padding-top: 20px; } code, pre { font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal; color: #222; margin-bottom: 30px; font-size: 12px; } code { padding: 0 3px; } pre { border: solid 1px #ddd; padding: 20px; overflow: auto; } pre code { padding: 0; } ul, ol, dl { margin-bottom: 20px; } /* COMMON STYLES */ table { width: 100%; border: 1px solid #ebebeb; } th { font-weight: 500; } td { border: 1px solid #ebebeb; text-align: center; font-weight: 300; } form { background: #f2f2f2; padding: 20px; } /* GENERAL ELEMENT TYPE STYLES */ h1 { font-size: 2.8em; } h2 { font-size: 22px; font-weight: bold; color: #303030; margin-bottom: 8px; } h3 { color: #d5000d; font-size: 18px; font-weight: bold; margin-bottom: 8px; } h4 { font-size: 16px; color: #303030; font-weight: bold; } h5 { font-size: 1em; color: #303030; } h6 { font-size: .8em; color: #303030; } p { font-weight: 300; margin-bottom: 20px; } a { text-decoration: none; } p a { font-weight: 400; } blockquote { font-size: 1.6em; border-left: 10px solid #e9e9e9; margin-bottom: 20px; padding: 0 0 0 30px; } ul li { list-style: disc inside; padding-left: 20px; } ol li { list-style: decimal inside; padding-left: 3px; } dl dd { font-style: italic; font-weight: 100; } footer { margin-top: 40px; padding-top: 20px; padding-bottom: 30px; font-size: 13px; color: #aaa; } footer a { color: #666; } /* MISC */ .clearfix:after { clear: both; content: '.'; display: block; visibility: hidden; height: 0; } .clearfix {display: inline-block;} * html .clearfix {height: 1%;} .clearfix {display: block;} ================================================ FILE: stylesheets/pygment_trac.css ================================================ .highlight { background: #ffffff; } .highlight .c { color: #999988; font-style: italic } /* Comment */ .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ .highlight .k { font-weight: bold } /* Keyword */ .highlight .o { font-weight: bold } /* Operator */ .highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */ .highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */ .highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */ .highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */ .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ .highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gh { color: #999999 } /* Generic.Heading */ .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #800080; font-weight: bold; } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { font-weight: bold } /* Keyword.Constant */ .highlight .kd { font-weight: bold } /* Keyword.Declaration */ .highlight .kn { font-weight: bold } /* Keyword.Namespace */ .highlight .kp { font-weight: bold } /* Keyword.Pseudo */ .highlight .kr { font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #009999 } /* Literal.Number */ .highlight .s { color: #d14 } /* Literal.String */ .highlight .na { color: #008080 } /* Name.Attribute */ .highlight .nb { color: #0086B3 } /* Name.Builtin */ .highlight .nc { color: #445588; font-weight: bold } /* Name.Class */ .highlight .no { color: #008080 } /* Name.Constant */ .highlight .ni { color: #800080 } /* Name.Entity */ .highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #990000; font-weight: bold } /* Name.Function */ .highlight .nn { color: #555555 } /* Name.Namespace */ .highlight .nt { color: #f995a7 } /* Name.Tag */ .highlight .nv { color: #008080 } /* Name.Variable */ .highlight .ow { font-weight: bold } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mf { color: #009999 } /* Literal.Number.Float */ .highlight .mh { color: #009999 } /* Literal.Number.Hex */ .highlight .mi { color: #00c7c7 } /* Literal.Number.Integer */ .highlight .mo { color: #009999 } /* Literal.Number.Oct */ .highlight .sb { color: #d14 } /* Literal.String.Backtick */ .highlight .sc { color: #d14 } /* Literal.String.Char */ .highlight .sd { color: #d14 } /* Literal.String.Doc */ .highlight .s2 { color: #f995a7 } /* Literal.String.Double */ .highlight .se { color: #d14 } /* Literal.String.Escape */ .highlight .sh { color: #d14 } /* Literal.String.Heredoc */ .highlight .si { color: #d14 } /* Literal.String.Interpol */ .highlight .sx { color: #d14 } /* Literal.String.Other */ .highlight .sr { color: #009926 } /* Literal.String.Regex */ .highlight .s1 { color: #d14 } /* Literal.String.Single */ .highlight .ss { color: #990073 } /* Literal.String.Symbol */ .highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */ .highlight .vc { color: #008080 } /* Name.Variable.Class */ .highlight .vg { color: #008080 } /* Name.Variable.Global */ .highlight .vi { color: #008080 } /* Name.Variable.Instance */ .highlight .il { color: #009999 } /* Literal.Number.Integer.Long */ .type-csharp .highlight .k { color: #0000FF } .type-csharp .highlight .kt { color: #0000FF } .type-csharp .highlight .nf { color: #000000; font-weight: normal } .type-csharp .highlight .nc { color: #2B91AF } .type-csharp .highlight .nn { color: #000000 } .type-csharp .highlight .s { color: #A31515 } .type-csharp .highlight .sc { color: #A31515 } ================================================ FILE: stylesheets/stylesheet.css ================================================ /* http://meyerweb.com/eric/tools/css/reset/ v2.0 | 20110126 License: none (public domain) */ html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { margin: 0; padding: 0; border: 0; font-size: 100%; font: inherit; vertical-align: baseline; } /* HTML5 display-role reset for older browsers */ article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { display: block; } body { line-height: 1; } ol, ul { list-style: none; } blockquote, q { quotes: none; } blockquote:before, blockquote:after, q:before, q:after { content: ''; content: none; } table { border-collapse: collapse; border-spacing: 0; } /* LAYOUT STYLES */ body { font-size: 1em; line-height: 1.5; background: #e7e7e7 url(../images/body-bg.png) 0 0 repeat; font-family: 'Helvetica Neue', Helvetica, Arial, serif; text-shadow: 0 1px 0 rgba(255, 255, 255, 0.8); color: #494955; } a { color: #d5000d; } a:hover { color: #c5000c; } header { padding-top: 35px; padding-bottom: 25px; } header h1 { font-family: 'Chivo', 'Helvetica Neue', Helvetica, Arial, serif; font-weight: 900; letter-spacing: -1px; font-size: 48px; color: #303030; line-height: 1.2; } header h2 { letter-spacing: -1px; font-size: 24px; color: #474747; font-weight: normal; line-height: 1.3; } #container { background: transparent url(../images/highlight-bg.jpg) 50% 0 no-repeat; min-height: 595px; } .inner { width: 700px; margin: 0 auto; } #container .inner img { max-width: 100%; } #downloads { margin-bottom: 40px; } a.button { -moz-border-radius: 30px; -webkit-border-radius: 30px; border-radius: 30px; border-top: solid 1px #cbcbcb; border-left: solid 1px #b7b7b7; border-right: solid 1px #b7b7b7; border-bottom: solid 1px #b3b3b3; color: #303030; line-height: 25px; font-weight: bold; font-size: 15px; padding: 12px 8px 12px 8px; display: block; float: left; width: 179px; margin-right: 14px; background: #fdfdfd; /* Old browsers */ background: -moz-linear-gradient(top, #fdfdfd 0%, #f2f2f2 100%); /* FF3.6+ */ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#fdfdfd), color-stop(100%,#f2f2f2)); /* Chrome,Safari4+ */ background: -webkit-linear-gradient(top, #fdfdfd 0%,#f2f2f2 100%); /* Chrome10+,Safari5.1+ */ background: -o-linear-gradient(top, #fdfdfd 0%,#f2f2f2 100%); /* Opera 11.10+ */ background: -ms-linear-gradient(top, #fdfdfd 0%,#f2f2f2 100%); /* IE10+ */ background: linear-gradient(top, #fdfdfd 0%,#f2f2f2 100%); /* W3C */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fdfdfd', endColorstr='#f2f2f2',GradientType=0 ); /* IE6-9 */ -webkit-box-shadow: 10px 10px 5px #888; -moz-box-shadow: 10px 10px 5px #888; box-shadow: 0px 1px 5px #e8e8e8; } a.button:hover { border-top: solid 1px #b7b7b7; border-left: solid 1px #b3b3b3; border-right: solid 1px #b3b3b3; border-bottom: solid 1px #b3b3b3; background: #fafafa; /* Old browsers */ background: -moz-linear-gradient(top, #fdfdfd 0%, #f6f6f6 100%); /* FF3.6+ */ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#fdfdfd), color-stop(100%,#f6f6f6)); /* Chrome,Safari4+ */ background: -webkit-linear-gradient(top, #fdfdfd 0%,#f6f6f6 100%); /* Chrome10+,Safari5.1+ */ background: -o-linear-gradient(top, #fdfdfd 0%,#f6f6f6 100%); /* Opera 11.10+ */ background: -ms-linear-gradient(top, #fdfdfd 0%,#f6f6f6 100%); /* IE10+ */ background: linear-gradient(top, #fdfdfd 0%,#f6f6f6, 100%); /* W3C */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fdfdfd', endColorstr='#f6f6f6',GradientType=0 ); /* IE6-9 */ } a.button span { padding-left: 50px; display: block; height: 23px; } #download-zip span { background: transparent url(../images/zip-icon.png) 12px 50% no-repeat; } #download-tar-gz span { background: transparent url(../images/tar-gz-icon.png) 12px 50% no-repeat; } #view-on-github span { background: transparent url(../images/octocat-icon.png) 12px 50% no-repeat; } #view-on-github { margin-right: 0; } code, pre { font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace; color: #222; margin-bottom: 30px; font-size: 14px; } code { background-color: #f2f2f2; border: solid 1px #ddd; padding: 0 3px; } pre { padding: 20px; background: #262626; color: #f2f2f2; text-shadow: none; overflow: auto; } pre code { color: #f2f2f2; background-color: #303030; border: none; padding: 0; } ul, ol, dl { margin-bottom: 20px; } /* COMMON STYLES */ hr { height: 1px; line-height: 1px; margin-top: 1em; padding-bottom: 1em; border: none; background: transparent url('../images/hr.png') 50% 0 no-repeat; } strong { font-weight: bold; } em { font-style: italic; } table { width: 100%; border: 1px solid #ebebeb; } th { font-weight: 500; } td { border: 1px solid #ebebeb; text-align: center; font-weight: 300; } form { background: #f2f2f2; padding: 20px; } /* GENERAL ELEMENT TYPE STYLES */ h1 { font-size: 32px; } h2 { font-size: 22px; font-weight: bold; color: #303030; margin-bottom: 8px; } h3 { color: #d5000d; font-size: 18px; font-weight: bold; margin-bottom: 8px; } h4 { font-size: 16px; color: #303030; font-weight: bold; } h5 { font-size: 1em; color: #303030; } h6 { font-size: .8em; color: #303030; } p { font-weight: 300; margin-bottom: 20px; } a { text-decoration: none; } p a { font-weight: 400; } blockquote { font-size: 1.6em; border-left: 10px solid #e9e9e9; margin-bottom: 20px; padding: 0 0 0 30px; } ul li { list-style: disc inside; padding-left: 20px; } ol li { list-style: decimal inside; padding-left: 3px; } dl dt { color: #303030; } footer { background: transparent url('../images/hr.png') 0 0 no-repeat; margin-top: 40px; padding-top: 20px; padding-bottom: 30px; font-size: 13px; color: #aaa; } footer a { color: #666; } footer a:hover { color: #444; } nav li { display: inline; list-style-type: none; padding-right: 20px; padding-left: 0; } /* MISC */ .clearfix:after { clear: both; content: '.'; display: block; visibility: hidden; height: 0; } .clearfix {display: inline-block;} * html .clearfix {height: 1%;} .clearfix {display: block;} /* VALIDATOR */ .validator .result { padding: 20px 0 0 0; } /* #Media Queries ================================================== */ /* Smaller than standard 960 (devices and browsers) */ @media only screen and (max-width: 959px) {} /* Tablet Portrait size to standard 960 (devices and browsers) */ @media only screen and (min-width: 768px) and (max-width: 959px) {} /* All Mobile Sizes (devices and browser) */ @media only screen and (max-width: 767px) { header { padding-top: 10px; padding-bottom: 10px; } #downloads { margin-bottom: 25px; } #download-zip, #download-tar-gz { display: none; } .inner { width: 94%; margin: 0 auto; } } /* Mobile Landscape Size to Tablet Portrait (devices and browsers) */ @media only screen and (min-width: 480px) and (max-width: 767px) {} /* Mobile Portrait Size to Mobile Landscape Size (devices and browsers) */ @media only screen and (max-width: 479px) {} ================================================ FILE: validator/index.md ================================================ --- layout: default title: Validator custom-javascript-list: - /javascripts/vendor/jquery-3.7.0.min.js - /javascripts/vendor/codemirror-6.65.7.min.js - /javascripts/vendor/codemirror-6.65.7-javascript.min.js - /javascripts/validator.js custom-css-list: - /stylesheets/vendor/codemirror-6.65.7.min.css - /stylesheets/vendor/codemirror-6.65.7-abbott.min.css ---