├── CNAME ├── .gitignore ├── assets ├── Aileron-Bold.eot ├── Aileron-Bold.ttf ├── Aileron-Bold.woff ├── hipack-logo.png ├── Aileron-Bold.woff2 ├── Aileron-Italic.eot ├── Aileron-Italic.ttf ├── Aileron-Italic.woff ├── Aileron-Regular.eot ├── Aileron-Regular.ttf ├── hipack-encoding.png ├── Aileron-BoldItalic.eot ├── Aileron-BoldItalic.ttf ├── Aileron-Italic.woff2 ├── Aileron-Regular.woff ├── Aileron-Regular.woff2 ├── hipack-logo-full.png ├── Aileron-BoldItalic.woff ├── Aileron-BoldItalic.woff2 ├── hipack-logo.svg ├── reset.css ├── style.css ├── hipack.min.js ├── hipack-logo-full.svg ├── hipack-encoding.svg ├── hipack.min.map ├── Aileron-Regular.svg └── Aileron-Bold.svg ├── robots.txt ├── README.rst ├── LICENSE ├── spec.rst ├── heps └── hep-001.rst └── index.html /CNAME: -------------------------------------------------------------------------------- 1 | hipack.org 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .*.sw[po] 2 | -------------------------------------------------------------------------------- /assets/Aileron-Bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aperezdc/hipack/gh-pages/assets/Aileron-Bold.eot -------------------------------------------------------------------------------- /assets/Aileron-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aperezdc/hipack/gh-pages/assets/Aileron-Bold.ttf -------------------------------------------------------------------------------- /assets/Aileron-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aperezdc/hipack/gh-pages/assets/Aileron-Bold.woff -------------------------------------------------------------------------------- /assets/hipack-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aperezdc/hipack/gh-pages/assets/hipack-logo.png -------------------------------------------------------------------------------- /assets/Aileron-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aperezdc/hipack/gh-pages/assets/Aileron-Bold.woff2 -------------------------------------------------------------------------------- /assets/Aileron-Italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aperezdc/hipack/gh-pages/assets/Aileron-Italic.eot -------------------------------------------------------------------------------- /assets/Aileron-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aperezdc/hipack/gh-pages/assets/Aileron-Italic.ttf -------------------------------------------------------------------------------- /assets/Aileron-Italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aperezdc/hipack/gh-pages/assets/Aileron-Italic.woff -------------------------------------------------------------------------------- /assets/Aileron-Regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aperezdc/hipack/gh-pages/assets/Aileron-Regular.eot -------------------------------------------------------------------------------- /assets/Aileron-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aperezdc/hipack/gh-pages/assets/Aileron-Regular.ttf -------------------------------------------------------------------------------- /assets/hipack-encoding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aperezdc/hipack/gh-pages/assets/hipack-encoding.png -------------------------------------------------------------------------------- /assets/Aileron-BoldItalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aperezdc/hipack/gh-pages/assets/Aileron-BoldItalic.eot -------------------------------------------------------------------------------- /assets/Aileron-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aperezdc/hipack/gh-pages/assets/Aileron-BoldItalic.ttf -------------------------------------------------------------------------------- /assets/Aileron-Italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aperezdc/hipack/gh-pages/assets/Aileron-Italic.woff2 -------------------------------------------------------------------------------- /assets/Aileron-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aperezdc/hipack/gh-pages/assets/Aileron-Regular.woff -------------------------------------------------------------------------------- /assets/Aileron-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aperezdc/hipack/gh-pages/assets/Aileron-Regular.woff2 -------------------------------------------------------------------------------- /assets/hipack-logo-full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aperezdc/hipack/gh-pages/assets/hipack-logo-full.png -------------------------------------------------------------------------------- /assets/Aileron-BoldItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aperezdc/hipack/gh-pages/assets/Aileron-BoldItalic.woff -------------------------------------------------------------------------------- /assets/Aileron-BoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aperezdc/hipack/gh-pages/assets/Aileron-BoldItalic.woff2 -------------------------------------------------------------------------------- /robots.txt: -------------------------------------------------------------------------------- 1 | # www.robotstxt.org/ 2 | # www.google.com/support/webmasters/bin/answer.py?hl=en&answer=156449 3 | 4 | User-agent: * -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | =============== 2 | HiPack.org site 3 | =============== 4 | 5 | This repositor contains the code for the HiPack_ website, 6 | http://hipack.org 7 | 8 | 9 | .. _hipack: http://hipack.org 10 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Adrian Perez 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /assets/hipack-logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 17 | 19 | 20 | 22 | image/svg+xml 23 | 25 | 26 | 27 | 28 | 29 | 51 | 54 | 55 | 57 | 67 | 74 | 80 | 84 | 89 | 90 | 92 | 95 | 100 | 101 | 102 | 104 | 107 | 112 | 113 | 114 | 115 | 117 | 121 | 122 | -------------------------------------------------------------------------------- /assets/reset.css: -------------------------------------------------------------------------------- 1 | /* 2 | HTML5 Reset :: style.css 3 | ---------------------------------------------------------- 4 | We have learned much from/been inspired by/taken code where offered from: 5 | 6 | Eric Meyer :: http://meyerweb.com 7 | HTML5 Doctor :: http://html5doctor.com 8 | and the HTML5 Boilerplate :: http://html5boilerplate.com 9 | 10 | -------------------------------------------------------------------------------*/ 11 | 12 | /* Let's default this puppy out 13 | -------------------------------------------------------------------------------*/ 14 | 15 | html, body, body div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp, small, strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, figure, footer, header, menu, nav, section, time, mark, audio, video, details, summary { 16 | margin: 0; 17 | padding: 0; 18 | border: 0; 19 | font-size: 100%; 20 | font-weight: normal; 21 | vertical-align: baseline; 22 | background: transparent; 23 | } 24 | 25 | article, aside, figure, footer, header, nav, section, details, summary {display: block;} 26 | 27 | /* Handle box-sizing while better addressing child elements: 28 | http://css-tricks.com/inheriting-box-sizing-probably-slightly-better-best-practice/ */ 29 | html { 30 | box-sizing: border-box; 31 | } 32 | 33 | *, 34 | *:before, 35 | *:after { 36 | box-sizing: inherit; 37 | } 38 | 39 | /* consider resetting the default cursor: https://gist.github.com/murtaugh/5247154 */ 40 | 41 | /* Responsive images and other embedded objects 42 | */ 43 | img, 44 | object, 45 | embed {max-width: 100%;} 46 | 47 | /* 48 | Note: keeping IMG here will cause problems if you're using foreground images as sprites. 49 | In fact, it *will* cause problems with Google Maps' controls at small size. 50 | If this is the case for you, try uncommenting the following: 51 | 52 | #map img { 53 | max-width: none; 54 | } 55 | */ 56 | 57 | /* force a vertical scrollbar to prevent a jumpy page */ 58 | html {overflow-y: scroll;} 59 | 60 | /* we use a lot of ULs that aren't bulleted. 61 | don't forget to restore the bullets within content. */ 62 | ul {list-style: none;} 63 | 64 | blockquote, q {quotes: none;} 65 | 66 | blockquote:before, 67 | blockquote:after, 68 | q:before, 69 | q:after {content: ''; content: none;} 70 | 71 | a {margin: 0; padding: 0; font-size: 100%; vertical-align: baseline; background: transparent;} 72 | 73 | del {text-decoration: line-through;} 74 | 75 | abbr[title], dfn[title] {border-bottom: 1px dotted #000; cursor: help;} 76 | 77 | /* tables still need cellspacing="0" in the markup */ 78 | table {border-collapse: collapse; border-spacing: 0;} 79 | th {font-weight: bold; vertical-align: bottom;} 80 | td {font-weight: normal; vertical-align: top;} 81 | 82 | hr {display: block; height: 1px; border: 0; border-top: 1px solid #ccc; margin: 1em 0; padding: 0;} 83 | 84 | input, select {vertical-align: middle;} 85 | 86 | pre { 87 | white-space: pre; /* CSS2 */ 88 | white-space: pre-wrap; /* CSS 2.1 */ 89 | white-space: pre-line; /* CSS 3 (and 2.1 as well, actually) */ 90 | word-wrap: break-word; /* IE */ 91 | } 92 | 93 | input[type="radio"] {vertical-align: text-bottom;} 94 | input[type="checkbox"] {vertical-align: bottom;} 95 | .ie7 input[type="checkbox"] {vertical-align: baseline;} 96 | .ie6 input {vertical-align: text-bottom;} 97 | 98 | select, input, textarea {font: 99% sans-serif;} 99 | 100 | table {font-size: inherit; font: 100%;} 101 | 102 | small {font-size: 85%;} 103 | 104 | strong {font-weight: bold;} 105 | 106 | td, td img {vertical-align: top;} 107 | 108 | /* Make sure sup and sub don't mess with your line-heights http://gist.github.com/413930 */ 109 | sub, sup {font-size: 75%; line-height: 0; position: relative;} 110 | sup {top: -0.5em;} 111 | sub {bottom: -0.25em;} 112 | 113 | /* standardize any monospaced elements */ 114 | pre, code, kbd, samp {font-family: monospace, sans-serif;} 115 | 116 | /* hand cursor on clickable elements */ 117 | .clickable, 118 | label, 119 | input[type=button], 120 | input[type=submit], 121 | input[type=file], 122 | button {cursor: pointer;} 123 | 124 | /* Webkit browsers add a 2px margin outside the chrome of form elements */ 125 | button, input, select, textarea {margin: 0;} 126 | 127 | /* make buttons play nice in IE */ 128 | button, 129 | input[type=button] {width: auto; overflow: visible;} 130 | 131 | /* scale images in IE7 more attractively */ 132 | .ie7 img {-ms-interpolation-mode: bicubic;} 133 | 134 | /* prevent BG image flicker upon hover 135 | (commented out as usage is rare, and the filter syntax messes with some pre-processors) 136 | .ie6 html {filter: expression(document.execCommand("BackgroundImageCache", false, true));} 137 | */ 138 | 139 | /* let's clear some floats */ 140 | .clearfix:before, .clearfix:after { content: "\0020"; display: block; height: 0; overflow: hidden; } 141 | .clearfix:after { clear: both; } 142 | .clearfix { zoom: 1; } 143 | -------------------------------------------------------------------------------- /spec.rst: -------------------------------------------------------------------------------- 1 | ====================== 2 | HiPack Specification 3 | ====================== 4 | 5 | :Version: 1 6 | :Status: **Stable** 7 | :Authors: Adrián Pérez de Castro , 8 | Andrés J. Díaz López , 9 | Óscar García Amor 10 | :Date: 2015/03/11 11 | 12 | Changelog 13 | ========= 14 | 15 | :2022-06-24: Add considerations about null values. This change does not alter 16 | the specification, is just to clarify some obscure points. 17 | 18 | 19 | .. contents:: 20 | 21 | 22 | 23 | Types 24 | ===== 25 | 26 | * *Integer* represents an integer number. 27 | * *Float* represents a floating point number. 28 | * *Bool* represents a ``true`` or ``false`` value. 29 | * *String* represents a string value. 30 | * *List* represents a sequence of values. 31 | * *Dictionary* represents a set of values, each labelled with a *Key*. 32 | 33 | 34 | Integer 35 | ------- 36 | Integral numbers are signed integers with 32 bits of precision. Numbers can be 37 | formatted as decimal, hexadecimal, or octal: 38 | 39 | * ``0x``, or ``0X`` denote the beginning of an hexadecimal number. 40 | * ``0`` (without a following ``x``) denote the beginning of an octal number. 41 | * Otherwise, the number is decimal. 42 | 43 | The first character of a number may specify its sign, which can be either 44 | ``+``, or ``-``. 45 | 46 | 47 | Float 48 | ----- 49 | Floating-point numbers can be formatted both in dotted notation (e.g. 50 | ``-12.4``), or using scientific notation (e.g. ``+2.3e-5``). Additionally, 51 | the following values are recognized, disregarding case: 52 | 53 | * ``NaN`` (Not-a-number). 54 | * ``Inf`` (infinity). 55 | * ``Infinity`` (infinity). 56 | 57 | 58 | Bool 59 | ---- 60 | There are only two possible values, which can optionally be written with 61 | their first letter in caps: 62 | 63 | * ``True`` / ``true`` 64 | * ``False`` / ``false`` 65 | 66 | 67 | Key 68 | --- 69 | Dictionary keys are sequences of unquoted characters that satisfy the 70 | following: 71 | 72 | * None of the following characters are contained in the sequence: ``[]{}:,`` 73 | * The sequence does not contain any whitespace characters. 74 | * Non-ASCII characters are allowed, and they *must* be encoded as UTF-8. 75 | 76 | For more details on the meaning of *whitespace*, check the Encoding_ section. 77 | 78 | 79 | String 80 | ------ 81 | Strings are delimited by double-quote characters (``"``). 82 | 83 | It is possible to introduce arbitrary bytes in a string by escaping its 84 | hexadecimal value with a backslash, followed by two hexadecimal digits: 85 | ``\NN`` represents the byte with value ``0xNN``. This mechanism allows 86 | encoding arbitrary data inside strings. 87 | 88 | For convenience, the following shorthand backslash escape sequences are 89 | defined: 90 | 91 | ======== ========= ===== ================== 92 | Escape Shorthand Value Character 93 | -------- --------- ----- ------------------ 94 | ``\09`` ``\t`` 0x09 Horizontal tab 95 | ``\0A`` ``\n`` 0x0A New line 96 | ``\0D`` ``\r`` 0x0D Carriage return 97 | ``\22`` ``\"`` 0x22 Double quote 98 | ``\5C`` ``\\`` 0x5C Backslash 99 | ======== ========= ===== ================== 100 | 101 | Note that strings may contain any arbitrary data. It is *recommended* to 102 | use hexadecimal escapes to encode non-printable characters (both ASCII 103 | and Unicode), or characters that may not be represented correctly by other 104 | means. Specially when messages are intended to be used by humans. 105 | 106 | Null Values 107 | ----------- 108 | 109 | HiPack does not support null values by design. A null value could means a lot 110 | of things, depending on the target language. Is not easy to convert a ``null`` 111 | to something *typable*. 112 | 113 | :💡 **Tip**: You can represent ``null`` values in a proper way 114 | using value annotations, as described in 115 | `HEP-001 `_. 116 | 117 | 118 | Comments 119 | ======== 120 | 121 | Comments can appear anywhere except inside strings, and they span from an 122 | octothorpe sign (``#``) to the next carriage return character (``\n``, 123 | ASCII code ``0x0D``). 124 | 125 | Note that the grammar_ does not include comments because they are an optional 126 | construct that is intended to be removed by the lexer, before input reaches 127 | the parser. This means that comments are “transparent”: a HiPack message with 128 | its comments removed is always equivalent to itself. 129 | 130 | The motivation of allowing for simple, line-based comments is reusing the 131 | HiPack format for configuration files. When used for this purpose, messages 132 | (read: configuration files) are likely to be written, and read by humans, so 133 | they are likely to be formatted with proper indentation, where line-based 134 | comments blend naturally. 135 | 136 | Comments effectively prevent formatting messages in a more compact form 137 | without carriage returns and unneeded whitespace. This choice has been made 138 | on purpose to *discourage* using comments in this case, where messages are 139 | expected to be as compact as possible. On the other hand, in those cases 140 | where comments are used, it is more likely that humans would read the 141 | messages, in which case it would be desirable to have a more readable 142 | formatting anyway. 143 | 144 | 145 | Encoding 146 | ======== 147 | 148 | All HiPack messages *must* be encoded as UTF-8: 149 | 150 | * Message structure markers, number values, and boolean values, use exclusively 151 | ASCII characters. In particular: 152 | 153 | - Delimiters are the ASCII characters ``:``, ``{``, ``}``, ``[``, ``]``, 154 | ``,``, ``"``, and ``#``. 155 | 156 | - Valid white space are the following ASCII characters: 157 | 158 | - 0x09: Horizontal tab, ``\t``. 159 | - 0x0A: New line, ``\n``. 160 | - 0x0D: Carriage return, ``\r``. 161 | - 0x20: Space. 162 | 163 | * Dictionary keys, and string values may contain any valid UTF-8 character 164 | sequence. 165 | 166 | * Comment text between an octothorpe (``#``) marker and the end of line marker 167 | (``\n``) may contain any valid UTF-8 character sequence. 168 | 169 | 170 | Grammar 171 | ======= 172 | 173 | The syntax for the basic value types is specified in their corresponding 174 | sections: Integer_, Float_, Bool_, String_. 175 | 176 | :: 177 | 178 | Value = Integer 179 | | Float 180 | | Bool 181 | | String 182 | | List 183 | | Dict 184 | 185 | Whitespace = '\t' | '\n' | '\r' | ' ' 186 | 187 | ItemSeparator = ',' 188 | | Whitespace 189 | 190 | ListItem = ItemSeparator Value 191 | 192 | List = '[' ']' 193 | | '[' Value ListItem* ItemSeparator? ']' 194 | 195 | KeyValuePair = Key ':'? Value 196 | 197 | DictItem = ItemSeparator KeyValuePair 198 | 199 | Dict = '{' KeyValuePair DictItem* ItemSeparator? '}' 200 | 201 | Message = Dict 202 | | KeyValuePair* 203 | 204 | 205 | -------------------------------------------------------------------------------- /assets/style.css: -------------------------------------------------------------------------------- 1 | 2 | @font-face { 3 | font-family: 'Aileron'; 4 | src: url('Aileron-Bold.eot'); 5 | src: url('Aileron-Bold.eot?#iefix') format('embedded-opentype'), 6 | url('Aileron-Bold.woff2') format('woff2'), 7 | url('Aileron-Bold.woff') format('woff'), 8 | url('Aileron-Bold.ttf') format('truetype'), 9 | url('Aileron-Bold.svg#aileronbold') format('svg'); 10 | font-weight: bold; 11 | font-style: normal; 12 | 13 | } 14 | 15 | @font-face { 16 | font-family: 'Aileron'; 17 | src: url('Aileron-BoldItalic.eot'); 18 | src: url('Aileron-BoldItalic.eot?#iefix') format('embedded-opentype'), 19 | url('Aileron-BoldItalic.woff2') format('woff2'), 20 | url('Aileron-BoldItalic.woff') format('woff'), 21 | url('Aileron-BoldItalic.ttf') format('truetype'), 22 | url('Aileron-BoldItalic.svg#aileronbold_italic') format('svg'); 23 | font-weight: bold; 24 | font-style: italic; 25 | 26 | } 27 | 28 | @font-face { 29 | font-family: 'Aileron'; 30 | src: url('Aileron-Italic.eot'); 31 | src: url('Aileron-Italic.eot?#iefix') format('embedded-opentype'), 32 | url('Aileron-Italic.woff2') format('woff2'), 33 | url('Aileron-Italic.woff') format('woff'), 34 | url('Aileron-Italic.ttf') format('truetype'), 35 | url('Aileron-Italic.svg#aileronitalic') format('svg'); 36 | font-weight: normal; 37 | font-style: italic; 38 | 39 | } 40 | 41 | @font-face { 42 | font-family: 'Aileron'; 43 | src: url('Aileron-Regular.eot'); 44 | src: url('Aileron-Regular.eot?#iefix') format('embedded-opentype'), 45 | url('Aileron-Regular.woff2') format('woff2'), 46 | url('Aileron-Regular.woff') format('woff'), 47 | url('Aileron-Regular.ttf') format('truetype'), 48 | url('Aileron-Regular.svg#aileronregular') format('svg'); 49 | font-weight: normal; 50 | font-style: normal; 51 | 52 | } 53 | 54 | 55 | body { 56 | font: 16px/24px Aileron, Helmet, Freesans, sans-serif; 57 | } 58 | 59 | ul, ol, dl { 60 | margin-top: 1em; 61 | margin-bottom: 0.5em; 62 | } 63 | 64 | h1 { 65 | font-size: 200%; 66 | margin-top: 2em; 67 | margin-bottom: 0.5em; 68 | border-bottom: 2px solid #800000; 69 | } 70 | 71 | h3 { 72 | font-size: 120%; 73 | font-weight: bold; 74 | padding-bottom: 0.5em; 75 | padding-top: 0.5em; 76 | } 77 | 78 | h1, h3, p, ol, ul, dl { 79 | padding-left: 16px; 80 | padding-right: 16px; 81 | } 82 | 83 | ul.news li { 84 | padding-left: 2em; 85 | } 86 | ul.news li span.date { 87 | color: #888; 88 | margin-left: -2em; 89 | } 90 | ul.news li span.date:after { 91 | content: " •"; 92 | } 93 | 94 | ul.bullet-list { 95 | margin: 0.5em 2.5em; 96 | } 97 | ul.bullet-list li { 98 | margin-bottom: 0.25em; 99 | } 100 | ul.bullet-list li:before { 101 | margin-left: -1em; 102 | margin-right: 0.5em; 103 | content: "▪"; 104 | color: #800000; 105 | } 106 | 107 | body, select, input, textarea {color: #333;} 108 | 109 | a {color: #800000;} 110 | a:hover {color: #550000;} 111 | 112 | /* Custom text-selection colors (remove any text shadows: http://twitter.com/miketaylr/status/12228805301) */ 113 | ::-moz-selection{background: #ff8080; color: #fff; text-shadow: none;} 114 | ::selection {background: #ff8080; color: #fff; text-shadow: none;} 115 | 116 | /* j.mp/webkit-tap-highlight-color */ 117 | a:link {-webkit-tap-highlight-color: #fcd700;} 118 | 119 | ins {background-color: #ff8080; color: #000; text-decoration: none;} 120 | mark {background-color: #ff8080; color: #000; font-style: italic; font-weight: bold;} 121 | 122 | /* Mozilla dosen't style place holders by default */ 123 | input:-moz-placeholder { color:#a9a9a9; } 124 | textarea:-moz-placeholder { color:#a9a9a9; } 125 | 126 | div.wrapper { 127 | width: 720px; 128 | margin: 0 auto; 129 | } 130 | 131 | header { 132 | background: url(hipack-logo-full.png) 0.75em 50% no-repeat; 133 | border-bottom: 3px solid #800000; 134 | height: 100px; 135 | } 136 | 137 | 138 | header h1 { 139 | float: left; 140 | } 141 | 142 | header nav { 143 | float: right; 144 | } 145 | 146 | header nav ol { 147 | text-align: right; 148 | height: 100%; 149 | margin: 0; 150 | padding: 0; 151 | } 152 | 153 | header nav li { 154 | display: block; 155 | float: left; 156 | } 157 | 158 | header nav a { 159 | text-decoration: none; 160 | font-size: 22px; 161 | padding-top: 50px; 162 | padding-left: 0.75em; 163 | padding-right: 0.75em; 164 | height: 100px; 165 | display: block; 166 | border-bottom: 3px solid #800000; 167 | } 168 | 169 | header nav a:hover { 170 | background-color: #C53333; 171 | color: #330000; 172 | } 173 | 174 | 175 | footer { 176 | clear: both; 177 | margin: 2em 0; 178 | padding-top: 5em; 179 | padding-bottom: 1em; 180 | font-size: 80%; 181 | text-align: center; 182 | color: #ccc; 183 | } 184 | 185 | 186 | article { 187 | clear: both; 188 | } 189 | 190 | 191 | /* Column system 192 | -------------------------------------------------------------------------------*/ 193 | .column-30 { width: 30%; } 194 | .column-50 { width: 50%; } 195 | .column-70 { width: 70%; } 196 | .column-left { float: left; } 197 | .column-right { float: right; } 198 | .column-flush { clear: both; } 199 | 200 | 201 | /* Columns of the about blurb 202 | -------------------------------------------------------------------------------*/ 203 | #about-blurb-container { 204 | background: #330000; 205 | border-bottom: 3px solid #800000; 206 | } 207 | 208 | #about-blurb-container .column-left { 209 | background: #5a0000; 210 | color: #ffefef; 211 | padding: 1em 0; 212 | } 213 | 214 | #about-blurb-container .column-left { 215 | } 216 | 217 | 218 | /* Styling for the language support list 219 | -------------------------------------------------------------------------------*/ 220 | 221 | dl.tagged-list > dt { 222 | display: inline; 223 | font-weight: bold; 224 | padding: 0.3em 0.5em; 225 | background: #5a0000; 226 | color: #ff8080; 227 | border-radius: 5px; 228 | margin-right: 0.5em; 229 | } 230 | 231 | dl.tagged-list dt span.tag { 232 | color: #5a0000; 233 | background: #ff8080; 234 | border-radius: 2px; 235 | padding: 0.05em 0.2em; 236 | margin-left: 0.2em; 237 | font-size: 90%; 238 | } 239 | dl.tagged-list dt:first-child span.tag { 240 | margin-left: 0.5em; 241 | } 242 | dl.tagged-list > dd { 243 | display: inline; 244 | } 245 | 246 | dl.tagged-list > dd > span { 247 | margin: 0.5em 1em 1em 1em; 248 | display: block; 249 | } 250 | 251 | #try-convert { 252 | width: 100%; 253 | } 254 | 255 | #try-convert textarea { 256 | background-color: #ffefef; 257 | font-family: monospace; 258 | width: 49%; 259 | height: 320px; 260 | margin: 0; 261 | padding: 0.25em; 262 | border: 2px solid #800000; 263 | border-radius: 3px; 264 | } 265 | 266 | #try-convert-button { 267 | background: #ffefef; 268 | color: #5a0000; 269 | margin: 0.5em 0 0 0; 270 | padding: 0.25em 1em; 271 | font-size: 150%; 272 | border: 3px solid #a00000; 273 | border-radius: 7px; 274 | } 275 | 276 | #try-convert-button:hover { 277 | border-color: #ff8080; 278 | } 279 | 280 | #try-convert-button:active { 281 | border-color: #888; 282 | color: #888; 283 | } 284 | 285 | /* Media queries 286 | -------------------------------------------------------------------------------*/ 287 | 288 | @media screen and (max-width: 480px) { 289 | } 290 | 291 | 292 | 293 | /* Print styles 294 | -------------------------------------------------------------------------------*/ 295 | @media print { 296 | } 297 | -------------------------------------------------------------------------------- /assets/hipack.min.js: -------------------------------------------------------------------------------- 1 | "use strict";(function(){function t(t){switch(t){case 9:case 10:case 13:case 32:return!0;default:return!1}}function e(t){switch(t){case 9:case 10:case 13:case 32:case 91:case 93:case 123:case 125:case 58:case 44:return!1;default:return!0}}function s(t){switch(t){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:case 97:case 65:case 98:case 66:case 99:case 67:case 100:case 68:case 101:case 69:case 102:case 70:return!0;default:return!1}}function r(t){switch(t){case 46:case 43:case 61:return!0;default:return s(t)}}function o(t){return t>48&&56>t}function i(t){switch(t){case 48:return 0;case 49:return 1;case 50:return 2;case 51:return 3;case 52:return 4;case 53:return 5;case 54:return 6;case 55:return 7;case 56:return 8;case 57:return 9;case 97:case 65:return 10;case 98:case 66:return 11;case 99:case 67:return 12;case 100:case 68:return 13;case 101:case 69:return 14;case 102:case 70:return 15}}var h=this,a=h.hipack,n={};if(n.noConflict=function(){return h.hipack=a,n},void 0===u){var u=function(){this._set=Object.create(null)};u.prototype.add=function(t){this._set[t]=!0},u.prototype.remove=function(t){delete this._set[t]},u.prototype.contains=function(t){return!!this._set[t]},u.prototype.clear=function(){this._set=Object.create(null)},u.prototype.empty=function(){return 0==Object.keys(this._set).length},u.prototype.size=function(){return Object.keys(this._set).length},u.prototype.get=function(){return Object.keys(this._set)}}n.ANNOT_INT=".int",n.ANNOT_FLOAT=".float",n.ANNOT_BOOL=".bool",n.ANNOT_STRING=".string",n.ANNOT_LIST=".list",n.ANNOT_DICT=".dict";var c=Object.keys,p=Array.isArray;n.DumpError=function(t){this.message=t,Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=Error().stack},n.value=function(t,e){return t},n.Dumper=function(t,e){void 0===e&&(e=n.value),this.indent=t?-1:0,this.value=e,this.output=""},n.Dumper.prototype.moreIndent=function(){this.indent>=0&&this.indent++},n.Dumper.prototype.lessIndent=function(){this.indent>0&&this.indent--},n.Dumper.prototype.dumpIndent=function(){for(var t=this.indent>=0?this.indent:0;t--;)this.output+=" "},n.Dumper.prototype.dumpString=function(t){this.output+='"';for(var e=0;es?(this.output+="\\",16>s&&(this.output+="0"),this.output+=s.toString(16).toUpperCase()):this.output+=t.charAt(e)}}this.output+='"'},n.Dumper.prototype.dumpBoolean=function(t){this.output+=t?"True":"False"},n.Dumper.prototype.dumpNumber=function(t){this.output+=t.toString()},n.Dumper.prototype.dumpKeyVal=function(t,e){for(var s=0;s=0&&(this.output+=" "),this.dumpValue(r),this.indent>=0?this.output+="\n":s=0&&(this.output+="\n");for(var e=0;e=0?this.output+="\n":e=0&&(this.output+="\n"),this.dumpKeyVal(t,e.sort()),this.lessIndent(),this.dumpIndent(),void(this.output+="}"))},n.Dumper.prototype.dumpValue=function(t){var e=new u;if(t=this.value(t,e),!e.empty()){this.indent<0&&":"!=this.output[this.output.length-1]&&(this.output+=":"),e=e.get();for(var s=0;s=this.input.length)return l;var t=this.input.charCodeAt(this.pos++);return 10==t&&(this.column=0,this.line++),this.column++,t},n.Parser.prototype.nextCharCode=function(){do if(this.look=this.nextCharCodeRaw(),35==this.look)for(;10!=this.look&&this.look!=l;)this.look=this.nextCharCodeRaw();while(this.look!=l&&35==this.look)},n.Parser.prototype.skipWhite=function(){for(;this.look!=l&&t(this.look);)this.nextCharCode()},n.Parser.prototype.matchCharCode=function(t,e){if(this.look!=t)throw void 0===e&&(e="Expected '"+f(t)+"', but '"+f(this.look)+"' was found instead"),new n.ParseError(this,e);this.nextCharCode()},n.Parser.prototype.parseKey=function(){for(var t=null;this.look!=l&&e(this.look);)null===t&&(t=""),t+=f(this.look),this.nextCharCode();if(null===t)throw new n.ParseError(this,"key expected");return t},n.Parser.prototype.parseString=function(t){this.matchCharCode(34);for(var e='"',r="";34!=this.look&&this.look!=l;){if(e+=f(this.look),92==this.look)switch(this.look=this.nextCharCodeRaw()){case 34:this.look=34;break;case 110:this.look=10;break;case 114:this.look=13;break;case 116:this.look=9;break;case 92:this.look=92;break;default:var o=this.nextCharCodeRaw();if(!s(o)||!s(this.look))throw new n.ParseError(this,"invalid escape sequence");this.look=16*i(this.look)+i(o)}r+=f(this.look),this.look=this.nextCharCodeRaw()}return this.matchCharCode(34),e+='"',t.add(n.ANNOT_STRING),this.cast(t,e,r)},n.Parser.prototype.parseList=function(e){this.matchCharCode(91),this.skipWhite();for(var s=[];93!=this.look;){s.push(this.parseValue());var r=t(this.look);if(this.skipWhite(),44==this.look)this.nextCharCode();else if(!r&&!t(this.look))break;this.skipWhite()}return this.matchCharCode(93),e.add(n.ANNOT_LIST),this.cast(e,null,s)},n.Parser.prototype.parseDict=function(t){this.matchCharCode(123),this.skipWhite();var e=this.parseKeyValItems(125);return this.matchCharCode(125),t.add(n.ANNOT_DICT),this.cast(t,null,e)},n.Parser.prototype.parseBoolean=function(t){t.add(n.ANNOT_BOOL);var e=f(this.look);if(84==this.look||116==this.look)return this.nextCharCode(),this.matchCharCode(114),this.matchCharCode(117),this.matchCharCode(101),this.cast(t,e+"rue",!0);if(70==this.look||102==this.look)return this.nextCharCode(),this.matchCharCode(97),this.matchCharCode(108),this.matchCharCode(115),this.matchCharCode(101),this.cast(t,e+"alse",!1);throw new n.ParseError(this,"boolean value expected")},n.Parser.prototype.parseNumber=function(t){var e="",s=!1;(43==this.look||45==this.look)&&(e+=f(this.look),this.nextCharCode(),s=!0);var i=!1,h=!1;48==this.look&&(e+="0",this.nextCharCode(),88==this.look||120==this.look?(e+=f(this.look),this.nextCharCode(),h=!0):o(this.look)&&(i=!0));for(var a=!1,u=!1;this.look!=l&&r(this.look);)if(h||69!=this.look&&101!=this.look){if(46==this.look){if(a||h||i)throw new n.ParseError(this,"invalid number");a=!0}if(43==this.look||45==this.look)throw new n.ParseError(this,"invalid number");e+=f(this.look),this.nextCharCode()}else{if(u)throw new n.ParseError(this,"invalid number");e+="e",u=!0,this.nextCharCode(),(43==this.look||45==this.look)&&(e+=f(this.look),this.nextCharCode())}if(0==e.length)throw new n.ParseError(this,"number expected");if(h){if(u||a)throw new n.ParseError(this,"invalid hex number");return t.add(n.ANNOT_INT),this.cast(t,e,d(e,16))}if(i){if(u||a)throw new n.ParseError(this,"invalid octal number");return t.add(n.ANNOT_INT),this.cast(t,e,d(e,8))}return a||u?(t.add(n.ANNOT_FLOAT),this.cast(t,e,k(e))):(t.add(n.ANNOT_INT),this.cast(t,e,d(e,10)))},n.Parser.prototype.parseAnnotations=function(){for(var t=new u;58==this.look;){this.nextCharCode();var e=this.parseKey();if(t.contains(e))throw new ParseError(this,"duplicate annotation: "+e);t.add(e),this.skipWhite()}return t},n.Parser.prototype.parseValue=function(){var t=this.parseAnnotations();switch(this.look){case 34:return this.parseString(t);case 91:return this.parseList(t);case 123:return this.parseDict(t);case 84:case 116:case 70:case 102:return this.parseBoolean(t);default:return this.parseNumber(t)}},n.Parser.prototype.parseKeyValItems=function(e){for(var s={};this.look!=e&&this.look!=l;){var r=this.parseKey(),o=!1;if(t(this.look)?(o=!0,this.skipWhite()):58==this.look?(o=!0,this.nextCharCode(),this.skipWhite()):(123==this.look||91==this.look)&&(o=!0),!o)throw new n.ParseError(this,"missing separator");if(s[r]=this.parseValue(),44==this.look)this.nextCharCode();else if(this.look!=e&&!t(this.look))break;this.skipWhite()}return s},n.Parser.prototype.parseMessage=function(){var t=null;return this.framed?this.look!=l&&(this.matchCharCode(123),this.nextCharCode(),this.skipWhite(),t=this.parseKeyValItems(125),this.matchCharCode(125,"unterminated message, '}' expected"),this.skipWhite()):t=this.parseKeyValItems(l),t},n.load=function(t,e){return new n.Parser(String(t),e).parseMessage()},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=n),exports.hipack=n):h.hipack=n}).call(this); 2 | //# sourceMappingURL=hipack.min.map -------------------------------------------------------------------------------- /heps/hep-001.rst: -------------------------------------------------------------------------------- 1 | ============================ 2 | HEP-1: Value Annotations 3 | ============================ 4 | 5 | :HEP: 1 6 | :Title: Value Annotations 7 | :Authors: Adrián Pérez de Castro 8 | :Status: **Proposal** 9 | :Date: 2015/11/23 10 | 11 | 12 | Changelog 13 | ========= 14 | 15 | :2022-06-24: Add considerations about null values. This change does not alter 16 | the specification, is just to clarify some obscure points. 17 | 18 | 19 | .. contents:: 20 | 21 | 22 | Abstract 23 | ======== 24 | 25 | This HEP introduces new syntax for allowing arbitrary metadata (“annotations”) 26 | being associated to values in serialized HiPack messages. 27 | 28 | 29 | Rationale 30 | ========= 31 | 32 | Values in HiPack have a certain *intrinsic* type, and the way the 33 | serialization is specified makes the grammar of messages ambiguous. Apart from 34 | the value itself, and its implicit type, each value does not carry any kind 35 | of additional information about itself. While there are ways to workaround 36 | this, it is desirable to provide the possibility of attaching arbitrary 37 | metadata to values. The reasons are multiple: 38 | 39 | * Using workarounds results in artificial additional nesting levels. For 40 | example, if an application wanted to provide additional information about 41 | the values it serializes, using the following message as starting point 42 | (not how it is not possible to know the unit for ``size``):: 43 | 44 | disk { 45 | size: 1 46 | } 47 | 48 | and transform it into:: 49 | 50 | disk { 51 | size { 52 | unit: "GiB" 53 | value: 1 54 | } 55 | } 56 | 57 | Providing a mechanism to attach additional information to value of the 58 | ``size: 1`` dictionary entry would prevent the additional level of nesting. 59 | 60 | * Supporting per-value metadata allows to change the meaning of built-in 61 | types, which in turn allows for serialization of a richer variety of data 62 | types that those specified by HiPack, for those applications which may need 63 | them. 64 | 65 | * Providing type information for compound values (dictionaries and lists) 66 | which allows mapping them to compound types of the application domain. 67 | 68 | 69 | Syntax 70 | ====== 71 | 72 | Annotations are placed before value literals. The first character is always a 73 | colon (``:``) followed by any non-whitespace character except one of 74 | ``{}[]:,``, or in other words: a colon immediately followed by a dictionary 75 | key. 76 | 77 | The example above can thus be rewritten as follows:: 78 | 79 | disk { 80 | size :GiB 1 81 | } 82 | 83 | Or, using a colon separator after the ``size`` key:: 84 | 85 | disk { 86 | size: :GiB 1 87 | } 88 | 89 | Note that the whitespace before the annotation is optional, and the following 90 | form is equivalent as well:: 91 | 92 | disk { 93 | size::GiB 1 94 | } 95 | 96 | On the other hand, note that using two colons (``::``) is necessary and it is 97 | *not possible* to omit one of them: the first colon is the separator between 98 | the dictionary key and the value, while the second colon indicates the 99 | beginning of the annotation. 100 | 101 | Multiple annotations are possible by placing them after one another. With this 102 | in mind, the above example could be modified as follows:: 103 | 104 | disk { 105 | # A cache is present, used both for reads and writes 106 | cache :read :write True 107 | size :GiB 1 108 | } 109 | 110 | Again, the whitespace at the left side of the colon which marks the begin of each 111 | annotation is optional, so the following message is equivalent:: 112 | 113 | disk { 114 | # A cache is present, used both for reads and writes 115 | cache::read:write True 116 | size::GiB 1 117 | } 118 | 119 | In particular, the `syntax`_ has been chosen in a way that makes it 120 | aesthetically pleasant to provide annotations which indicate the type (in the 121 | domain of the application) to which a dictionary value should be mapped to. 122 | For example, the following could be a message used to configure an ``inetd`` 123 | style socket server:: 124 | 125 | http::stream { 126 | exec [ "/usr/libexec/in.httpd", "--document-root=/srv/www" ] 127 | ports [ 80, :tls 443 ] 128 | tls-cert "/etc/ssl/http.pem" 129 | } 130 | time::dgram { 131 | exec [ "/usr/libexec/in.ntpd" ] 132 | ports [ :service "ntp-server" ] 133 | } 134 | 135 | 136 | Grammar 137 | ------- 138 | 139 | The grammar production for the ``Value`` non-terminal is modified to 140 | optionally accept the list of annotations in front of the literal value. The 141 | updated ``Value`` production is updated to allow zero or more annotations:: 142 | 143 | Value = Annotation* Literal 144 | 145 | With ``Literal`` being one of the literal values, as previously produced by 146 | ``Value``:: 147 | 148 | Literal = Integer 149 | | Float 150 | | Bool 151 | | String 152 | | List 153 | | Dict 154 | 155 | The new ``Annotation`` non-terminal is defined as follows:: 156 | 157 | Annotation = Whitespace? ':' Key Whitespace 158 | 159 | Note how the ``Key`` production is reused to allow annotations to contain 160 | almost any character (except those invalid for dictionary keys, including 161 | ``:``), which allows a great deal of flexibility. The choice of using a colon 162 | to indicate the start of an annotation is unambiguous, and keeps the allows 163 | parsers to continue operating using a single look-ahead character. 164 | 165 | 166 | Semantics 167 | ========= 168 | 169 | The colon (``:``) character which introduces an annotation is a delimiter, and 170 | it is not part of the contents of annotations (i.e. the contens of an 171 | annotation ``:foo`` in serialized format are ``foo`` after parsing). 172 | 173 | In general, HiPack does not specify a meaning for the contents of annotations, 174 | and applications are free to use annotations in any suitable way. A provision 175 | for `reserved values`_ is done, in order to allow for future extensibility. 176 | 177 | Reserved Values 178 | --------------- 179 | 180 | All the annotations whose contents start with a period (``.``, ASCII value 181 | ``0x2E``) are reserved for the purposes of the specification of the HiPack 182 | serialized message format, and *must not* be used by applications for their 183 | own purposes. 184 | 185 | Intrinsic Type Annotations 186 | -------------------------- 187 | 188 | Every literal value in HiPack carries implicitly a type. In the same way, it 189 | can be considered that each value carries an implicit annotation which 190 | indicates the type of the value. Those annotations are well-defined `reserved 191 | values`_, with the following correspondence to value types: 192 | 193 | ============== ========================= 194 | Type Intrinsic Type Annotation 195 | -------------- ------------------------- 196 | ``Integer`` ``.int`` 197 | ``Float`` ``.float`` 198 | ``Bool`` ``.bool`` 199 | ``String`` ``.string`` 200 | ``List`` ``.list`` 201 | ``Dictionary`` ``.dict`` 202 | ============== ========================= 203 | 204 | If so desired, type annotations can be written explicitly in serialized 205 | messages, and they indicate the intended type of the value:: 206 | 207 | disk { 208 | size :GiB :.int 1 209 | } 210 | 211 | Note that the textual representation of the value *must* match that expected 212 | for the intended type, if the latter has been indicated explicitly. This means 213 | that the following is invalid because the value is given as an ``Integer`` 214 | literal, but the type annotation is not ``.int``:: 215 | 216 | disk { 217 | size :GiB :.float 1 218 | } 219 | 220 | In these cases, a compliant parser should indicate an error, *even if the 221 | textual representation of the value can be converted to the type which has 222 | been indicated with an annotation*. 223 | 224 | Note that intrinsic type annotations can still be useful in certain scenarios. 225 | As an example, a parser implementor may choose to return the *unconverted* 226 | textual representation of a value and, at the same time, an intrinsic type 227 | annotation (which can be implicit, or explicit in a message) which indicates 228 | the intended type to the application. This way, a value like ``0xC0FEE`` 229 | would be passed to the application as the sequence of bytes ``0xC0FEE`` and 230 | the (implicit) type annotation ``.int``, and in this way the information 231 | that the value was provided in hexadecimal form is available to the 232 | application. 233 | 234 | Using value annotations to generate null values 235 | ----------------------------------------------- 236 | 237 | HiPack does not support ``null`` values natively. This is design consideration 238 | because the representation of a ``null`` value is different depending on the 239 | target language that you are using. For example in C it's a special case of 240 | ``void *`` which indicates a non-valid pointer, in python a ``None`` means 241 | that some variable does not have any value, and so on. With value annotations 242 | you can find a suitable representation of ``null`` values with a special 243 | annotation, for instance: ``field::invalid ""`` could represent an invalid 244 | value for something that suppose to be a string. Sometimes a ``null`` means 245 | “generate automatically a default value”, in which case ``field::default ""`` 246 | could be a better representation. 247 | 248 | 249 | Copyright 250 | ========= 251 | 252 | This document has been placed in the public domain, under the terms of the 253 | `CC0 license `__. 254 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | HiPack: like MessagePack, but human. 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 40 | 41 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 110 | 111 | 112 | 113 | 114 |
115 | 116 |
117 |

HiPack

118 | 126 |
127 | 128 |
129 |
130 |
131 |

Serialization,
132 | for humans.

133 |

134 | HiPack is a human-friendly serialization format. 135 | Unlike MessagePack, it is not binary, but text-based. 136 | Like JSON, it can be understood by machines and 137 | humans — with emphasis on the later. 138 |

139 |
140 |
141 | Comparison of HiPack, JSON, and MessagePack 143 |
144 |
145 |
146 |
147 | 148 |
149 |

Try It

150 |

151 | Use the left box to input text in JSON, and check how it 152 | would look converted into HiPack, optionally in “compact” form. 153 |

154 |
157 |
158 | 174 | 175 |
176 | 177 |
178 | 179 | 180 |
181 |
182 |
183 | 184 |
185 |

News

186 |
    187 |
  • 2019/08/20 Updated Try It 188 | section in the website to use hipack-js 189 | instead of relying on a remote REST service. 190 |
  • 191 |
  • 2015/11/23 HiPack 193 | v1 is now stable. The list of implementations 194 | and tools have been updated to indicate which 195 | versions of the HiPack specification are supported by each one of them. 196 |
  • 197 |
198 |
199 | 200 | 218 | 219 |
220 |

Code

221 | 222 |

223 | HiPack can be used with the following programming 224 | languages: 225 |

226 | 227 |
228 |
C v1 hep-1
229 |
230 | hipack-c 231 | Reference implementation. 232 |
233 | 234 |
C
235 |
236 | sixpack 237 | Small implementation with a SAX-style API, suitable for embedded 238 | devices, and may be built to avoid memory allocations. 239 |
240 | 241 |
JavaScript v1 hep-1
242 |
243 | hipack-js 244 | Works in NodeJS, IoJS, and in the browser. Installable 245 | using NPM, and 246 | Bower using the 247 | hipack-js module name. 248 | Maintained by the HiPack team. 249 |
250 | 251 |
Python v1 hep-1
252 |
253 | hipack-python 254 | Maintained by the HiPack team, too. 255 |
256 | 257 |
Rust
258 |
259 | hipack-rs 260 | Minimal dependencies, uses only the Rust standard 261 | library. 262 |
263 | 264 |
C
265 |
266 | wheel 267 | Implementation included in libwheel. 268 |
269 |
270 |
271 | 272 |
273 |

Tools

274 | 275 |
276 |
Vim v1 hep-1
277 |
278 | hipack-vim 279 | Syntax highlighting and auto-indentation support for 280 | Vim. Works in NeoVim, too. 281 |
282 |
283 |
284 | 285 |
286 |

© 2015, The HiPack contributors.

287 |
288 |
289 | 290 | 291 | 292 | -------------------------------------------------------------------------------- /assets/hipack-logo-full.svg: -------------------------------------------------------------------------------- 1 | 2 | 20 | 22 | 23 | 25 | image/svg+xml 26 | 28 | 29 | 30 | 31 | 32 | 55 | 58 | 59 | 61 | 71 | 78 | 84 | 88 | 93 | 94 | 96 | 99 | 105 | 106 | 107 | 109 | 112 | 118 | 119 | 120 | 121 | 123 | 130 | 136 | 141 | 146 | 151 | 156 | 162 | 169 | 174 | 180 | 181 | -------------------------------------------------------------------------------- /assets/hipack-encoding.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 21 | 39 | 41 | 42 | 44 | image/svg+xml 45 | 47 | 48 | 49 | 50 | 51 | 55 | 62 | JSON 27 bytes 77 | MessagePack 18 bytes 90 | { "compact" : true, "schema" : 0 } 103 | compact : true , schema : 0 116 | HiPack 21 bytes 131 | 134 | 82 A7 compact C3 A6 schema 00 146 | 153 | 160 | 167 | 174 | 181 | 182 | 191 | 192 | 193 | -------------------------------------------------------------------------------- /assets/hipack.min.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["hipack.js"],"names":["isHiPackWhitespace","ch","isHiPackKeyCharacter","isHexDigit","isNumberCharacter","isOctalNonZeroDigit","hexDigitToInt","xdigit","root","this","previousModule","hipack","noConflict","undefined","Set","_set","Object","create","prototype","add","item","remove","contains","clear","empty","keys","length","size","get","ANNOT_INT","ANNOT_FLOAT","ANNOT_BOOL","ANNOT_STRING","ANNOT_LIST","ANNOT_DICT","_objectKeys","_isArray","Array","isArray","DumpError","message","Error","captureStackTrace","constructor","stack","value","obj","annotations","Dumper","compact","indent","output","moreIndent","lessIndent","dumpIndent","dumpString","i","charCodeAt","toString","toUpperCase","charAt","dumpBoolean","dumpNumber","dumpKeyVal","dumpValue","dumpList","list","dumpDict","dict","sort","valueType","dump","data","dumper","Boolean","EOF","_parseInt","Number","parseInt","_parseFloat","parseFloat","_fromCharCode","String","fromCharCode","ParseError","parser","position","pos","line","column","cast","input","Parser","look","nextCharCode","skipWhite","framed","nextCharCodeRaw","matchCharCode","errmsg","parseKey","key","parseString","s","str","extra","parseList","push","parseValue","gotWhitespace","parseDict","parseKeyValItems","parseBoolean","parseNumber","number","hasSign","isOctal","isHex","dotSeen","expSeen","parseAnnotations","eos","gotSeparator","parseMessage","result","load","exports","module","call"],"mappings":"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","file":"hipack.min.js"} -------------------------------------------------------------------------------- /assets/Aileron-Regular.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | -------------------------------------------------------------------------------- /assets/Aileron-Bold.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | --------------------------------------------------------------------------------