diff --git a/.ci/styles/config/vocabularies/SimplePixelFont/accept.txt b/.ci/styles/config/vocabularies/SimplePixelFont/accept.txt new file mode 100644 index 0000000..0342d66 --- /dev/null +++ b/.ci/styles/config/vocabularies/SimplePixelFont/accept.txt @@ -0,0 +1,2 @@ +(?i)pixmap +(?i)pixmaps \ No newline at end of file diff --git a/.ci/styles/txt b/.ci/styles/txt deleted file mode 100644 index e69de29..0000000 diff --git a/.github/workflows/wiki.yml b/.github/workflows/wiki.yml index b2d38ef..4977c45 100644 --- a/.github/workflows/wiki.yml +++ b/.github/workflows/wiki.yml @@ -11,10 +11,10 @@ jobs: steps: - name: Checkout Repo uses: actions/checkout@v2 - + - name: Process markdown files run: npx https://github.com/The-Nice-One/rail-yard.git preprocess -i ./src -o ./build - + - name: Sync docs to wiki uses: newrelic/wiki-sync-action@main with: diff --git a/.vale.ini b/.vale.ini index bf966b5..c51e7e4 100644 --- a/.vale.ini +++ b/.vale.ini @@ -1,6 +1,9 @@ StylesPath = .ci/styles - +Vocab = SimplePixelFont Packages = Google, write-good, proselint +[.ci/styles/proselint/*.md] +BasedOnStyles = + [*.md] -BasedOnStyles = Vale, Google, write-good, proselint \ No newline at end of file +BasedOnStyles = Vale, Google, write-good, proselint diff --git a/package.json b/package.json index cc32b82..09011a9 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "scripts": { "snippet:generate": "tsx scripts/snippet-tool.ts generate", "snippet:collapse": "tsx scripts/snippet-tool.ts collapse", - "snippet:expand": "tsx scripts/snippet-tool.ts expand" + "snippet:expand": "tsx scripts/snippet-tool.ts expand", + "snippet:document": "tsx scripts/snippet-tool.ts document" }, "devDependencies": { "@types/node": "^25.9.1", diff --git a/scripts/snippet-tool.ts b/scripts/snippet-tool.ts index 0862d63..8226f0f 100644 --- a/scripts/snippet-tool.ts +++ b/scripts/snippet-tool.ts @@ -89,9 +89,13 @@ async function generateStructure(options: Record) { for (const name of configurations) { await writePlaceholder(path.join(root, "configurations", "brief", toFileName(name)), name); + await writePlaceholder(path.join(root, "configurations", "condition", toFileName(name)), `${name} condition`); + await writePlaceholder(path.join(root, "configurations", "flag", toFileName(`use_${name}`)), `use_${name}`); } for (const name of links) { await writePlaceholder(path.join(root, "links", "brief", toFileName(name)), name); + await writePlaceholder(path.join(root, "links", "condition", toFileName(name)), `${name} condition`); + await writePlaceholder(path.join(root, "links", "flag", toFileName(`link_${name}`)), `link_${name}`); } for (const name of modifiers) { await writePlaceholder(path.join(root, "modifiers", "brief", toFileName(name)), name); @@ -99,6 +103,7 @@ async function generateStructure(options: Record) { } for (const name of records) { await writePlaceholder(path.join(root, "records", "brief", toFileName(name)), name); + await writePlaceholder(path.join(root, "records", "condition", toFileName(name)), `${name} condition`); } console.log(`Generated snippet structure for table '${tableName}' at snippets/${tableName}`); @@ -234,8 +239,8 @@ function generateConfigurationsSection( lines.push("| --- | ---- | ----------- |"); for (let i = 0; i < configs.length; i++) { - const configBriefName = configs[i]; // e.g., "constant_codepoint_count" - const flagName = "use_" + configBriefName; // e.g., "use_constant_codepoint_count" + const configBriefName = configs[i]; // e.g., "constant_code_point_count" + const flagName = "use_" + configBriefName; // e.g., "use_constant_code_point_count" const flagPath = getRelativeSnippetPath(snippetType, "configurations/flag", flagName); lines.push( `| ${i} | \`${flagName}\` | \\textinput{${flagPath}} |` @@ -281,7 +286,7 @@ function generateLinksSection( const linkBriefName = links[i]; // e.g., "pixmap_tables" const flagName = "link_" + linkBriefName; // e.g., "link_pixmap_tables" // Note: Template shows looking in condition directory for the flag description - const flagPath = getRelativeSnippetPath(snippetType, "links/condition", flagName); + const flagPath = getRelativeSnippetPath(snippetType, "links/flag", flagName); lines.push( `| ${i} | \`${flagName}\` | \\textinput{${flagPath}} |` ); @@ -337,7 +342,7 @@ function generateRecordsSection( function generateExamplesSection(tableName: string): string { const lines: string[] = []; - lines.push(addTableHeader("Examples\n")); + lines.push(addTableHeader("Record Layout Examples\n")); lines.push( "Provide example records demonstrating various field combinations:\n" ); @@ -370,7 +375,7 @@ async function generateDocument(options: Record) { const tableDir = path.join(process.cwd(), "snippets", tableName); const outputPath = path.resolve( - options.output || path.join(process.cwd(), `${tableName}.md`) + options.output || path.join(process.cwd(), `src/${tableName}.md`) ); // Check if table directory exists @@ -424,7 +429,8 @@ async function generateDocument(options: Record) { await fs.writeFile(outputPath, doc, "utf8"); console.log( - `Generated document for table '${tableName}' at ${path.relative(process.cwd(), outputPath)}` + `Generated document for table '${tableName}' at ${path.relative(process.cwd(), outputPath)} + Make sure to reorder fields accordingly!` ); } diff --git a/snippets/character_table/configurations/brief/constant_code_point_count.md b/snippets/character_table/configurations/brief/constant_code_point_count.md new file mode 100644 index 0000000..43d7150 --- /dev/null +++ b/snippets/character_table/configurations/brief/constant_code_point_count.md @@ -0,0 +1 @@ +The exact code point length of each `code_points` field in this table \ No newline at end of file diff --git a/snippets/character_table/configurations/brief/constant_codepoint_count.md b/snippets/character_table/configurations/brief/constant_codepoint_count.md deleted file mode 100644 index ecb49b4..0000000 --- a/snippets/character_table/configurations/brief/constant_codepoint_count.md +++ /dev/null @@ -1 +0,0 @@ -The exact codepoint length of each `codepoints` field in this table \ No newline at end of file diff --git a/snippets/character_table/configurations/condition/constant_code_point_count.md b/snippets/character_table/configurations/condition/constant_code_point_count.md new file mode 100644 index 0000000..ec5f1d6 --- /dev/null +++ b/snippets/character_table/configurations/condition/constant_code_point_count.md @@ -0,0 +1 @@ +If `use_constant_code_point_count` is enabled. \ No newline at end of file diff --git a/snippets/character_table/configurations/condition/constant_codepoint_count.md b/snippets/character_table/configurations/condition/constant_codepoint_count.md deleted file mode 100644 index 77089a2..0000000 --- a/snippets/character_table/configurations/condition/constant_codepoint_count.md +++ /dev/null @@ -1 +0,0 @@ -If `use_constant_codepoint_count` is enabled. \ No newline at end of file diff --git a/snippets/character_table/configurations/flag/use_constant_code_point_count.md b/snippets/character_table/configurations/flag/use_constant_code_point_count.md new file mode 100644 index 0000000..3d72541 --- /dev/null +++ b/snippets/character_table/configurations/flag/use_constant_code_point_count.md @@ -0,0 +1 @@ +All characters in this table have the same number of code points. \ No newline at end of file diff --git a/snippets/character_table/configurations/flag/use_constant_codepoint_count.md b/snippets/character_table/configurations/flag/use_constant_codepoint_count.md deleted file mode 100644 index 5541d3f..0000000 --- a/snippets/character_table/configurations/flag/use_constant_codepoint_count.md +++ /dev/null @@ -1 +0,0 @@ -All characters in this table have the same number of codepoints. \ No newline at end of file diff --git a/snippets/character_table/links/brief/pixmap_tables.md b/snippets/character_table/links/brief/pixmap_tables.md index cb70157..852ac1c 100644 --- a/snippets/character_table/links/brief/pixmap_tables.md +++ b/snippets/character_table/links/brief/pixmap_tables.md @@ -1 +1 @@ -Vector of Pixmap Table indices this character table references. \ No newline at end of file +Length byte followed by that many Pixmap Table indices this character table may reference. \ No newline at end of file diff --git a/snippets/character_table/modifiers/details/use_pixmap_index.md b/snippets/character_table/modifiers/details/use_pixmap_index.md index b1fb6c9..9f78b98 100644 --- a/snippets/character_table/modifiers/details/use_pixmap_index.md +++ b/snippets/character_table/modifiers/details/use_pixmap_index.md @@ -1 +1 @@ -When disabled, the pixmap index defaults to match the character record index (1:1 mapping). \ No newline at end of file +When disabled, the pixmap index defaults to match the character record index creating a one to one mapping. \ No newline at end of file diff --git a/snippets/character_table/records/brief/code_points.md b/snippets/character_table/records/brief/code_points.md new file mode 100644 index 0000000..89c573e --- /dev/null +++ b/snippets/character_table/records/brief/code_points.md @@ -0,0 +1 @@ +UTF-8 encoded code point sequence, null-terminated unless `constant_code_point_count` is set. \ No newline at end of file diff --git a/snippets/character_table/records/brief/pixmap_index.md b/snippets/character_table/records/brief/pixmap_index.md index ac0c402..9ae2c77 100644 --- a/snippets/character_table/records/brief/pixmap_index.md +++ b/snippets/character_table/records/brief/pixmap_index.md @@ -1 +1 @@ -If `use_pixmap_index` modifier is enabled. \ No newline at end of file +Index of the pixmap within the referenced Pixmap Tables. \ No newline at end of file diff --git a/snippets/character_table/records/brief/pixmap_table_index.md b/snippets/character_table/records/brief/pixmap_table_index.md index 3776f02..3b46389 100644 --- a/snippets/character_table/records/brief/pixmap_table_index.md +++ b/snippets/character_table/records/brief/pixmap_table_index.md @@ -1 +1 @@ -If `use_pixmap_table_index` modifier is enabled. \ No newline at end of file +Index of the specific Pixmap Table to use for this character. \ No newline at end of file diff --git a/snippets/character_table/records/brief/codepoints.md b/snippets/character_table/records/condition/code_points.md similarity index 100% rename from snippets/character_table/records/brief/codepoints.md rename to snippets/character_table/records/condition/code_points.md diff --git a/snippets/character_table/records/condition/codepoints.md b/snippets/character_table/records/condition/codepoints.md deleted file mode 100644 index eb77441..0000000 --- a/snippets/character_table/records/condition/codepoints.md +++ /dev/null @@ -1 +0,0 @@ -UTF-8 encoded codepoint sequence (null-terminated unless `constant_codepoint_count` is set). \ No newline at end of file diff --git a/snippets/character_table/records/condition/pixmap_index.md b/snippets/character_table/records/condition/pixmap_index.md index e289f97..ac0c402 100644 --- a/snippets/character_table/records/condition/pixmap_index.md +++ b/snippets/character_table/records/condition/pixmap_index.md @@ -1 +1 @@ -Index of the pixmap within the referenced Pixmap Table(s). \ No newline at end of file +If `use_pixmap_index` modifier is enabled. \ No newline at end of file diff --git a/snippets/character_table/records/condition/pixmap_table_index.md b/snippets/character_table/records/condition/pixmap_table_index.md index 3b46389..3776f02 100644 --- a/snippets/character_table/records/condition/pixmap_table_index.md +++ b/snippets/character_table/records/condition/pixmap_table_index.md @@ -1 +1 @@ -Index of the specific Pixmap Table to use for this character. \ No newline at end of file +If `use_pixmap_table_index` modifier is enabled. \ No newline at end of file diff --git a/snippets/color_table/brief.md b/snippets/color_table/brief.md index 107e876..9f5e6c4 100644 --- a/snippets/color_table/brief.md +++ b/snippets/color_table/brief.md @@ -1,3 +1,6 @@ -# color_table table +Stores RGBA color values that can be referenced by pixmap data. -Write the documentation content for color_table table here. \ No newline at end of file +## Use Cases + +- **Pixmap palettes** - When linked to a Pixmap Table, provides the color palette for indexed pixel data. +- **Color storage** - Can store color sets independently for other purposes. \ No newline at end of file diff --git a/snippets/color_table/configurations/brief/constant_alpha.md b/snippets/color_table/configurations/brief/constant_alpha.md index 7f826b6..47b8835 100644 --- a/snippets/color_table/configurations/brief/constant_alpha.md +++ b/snippets/color_table/configurations/brief/constant_alpha.md @@ -1,3 +1 @@ -# constant_alpha - -Write the documentation content for constant_alpha here. \ No newline at end of file +The alpha channel value applied to all colors in this table. \ No newline at end of file diff --git a/snippets/color_table/configurations/condition/constant_alpha.md b/snippets/color_table/configurations/condition/constant_alpha.md new file mode 100644 index 0000000..adf9daf --- /dev/null +++ b/snippets/color_table/configurations/condition/constant_alpha.md @@ -0,0 +1 @@ +If `use_constant_alpha` is enabled. \ No newline at end of file diff --git a/snippets/color_table/configurations/flag/use_constant_alpha.md b/snippets/color_table/configurations/flag/use_constant_alpha.md new file mode 100644 index 0000000..eecd81e --- /dev/null +++ b/snippets/color_table/configurations/flag/use_constant_alpha.md @@ -0,0 +1 @@ +All colors in this table share the same alpha value. \ No newline at end of file diff --git a/snippets/color_table/modifiers/brief/use_color_type.md b/snippets/color_table/modifiers/brief/use_color_type.md index 157cd30..a034088 100644 --- a/snippets/color_table/modifiers/brief/use_color_type.md +++ b/snippets/color_table/modifiers/brief/use_color_type.md @@ -1,3 +1 @@ -# use_color_type - -Write the documentation content for use_color_type here. \ No newline at end of file +Each record includes a `color_type` field indicating the color mutability type. \ No newline at end of file diff --git a/snippets/color_table/modifiers/details/use_color_type.md b/snippets/color_table/modifiers/details/use_color_type.md index de312b3..aa8785e 100644 --- a/snippets/color_table/modifiers/details/use_color_type.md +++ b/snippets/color_table/modifiers/details/use_color_type.md @@ -1,3 +1 @@ -# use_color_type details - -Write the documentation content for use_color_type details here. \ No newline at end of file +When disabled, the default color type is dynamic. The rendering engine may change the RGBA color to support features such as, but not limited to; text color, and/or palette theming. \ No newline at end of file diff --git a/snippets/color_table/records/brief/alpha.md b/snippets/color_table/records/brief/alpha.md index ef43a25..d18c10f 100644 --- a/snippets/color_table/records/brief/alpha.md +++ b/snippets/color_table/records/brief/alpha.md @@ -1,3 +1 @@ -# alpha - -Write the documentation content for alpha here. \ No newline at end of file +Alpha channel value (0 = fully transparent, 255 = fully opaque). \ No newline at end of file diff --git a/snippets/color_table/records/brief/blue.md b/snippets/color_table/records/brief/blue.md index b8af9da..97f092d 100644 --- a/snippets/color_table/records/brief/blue.md +++ b/snippets/color_table/records/brief/blue.md @@ -1,3 +1 @@ -# blue - -Write the documentation content for blue here. \ No newline at end of file +Blue channel value. \ No newline at end of file diff --git a/snippets/color_table/records/brief/color_type.md b/snippets/color_table/records/brief/color_type.md index 67ef467..d8bf647 100644 --- a/snippets/color_table/records/brief/color_type.md +++ b/snippets/color_table/records/brief/color_type.md @@ -1,3 +1 @@ -# color_type - -Write the documentation content for color_type here. \ No newline at end of file +Color Type value (0 = Dynamic, 1 = Absolute). \ No newline at end of file diff --git a/snippets/color_table/records/brief/green.md b/snippets/color_table/records/brief/green.md index 21c49bd..d8c8819 100644 --- a/snippets/color_table/records/brief/green.md +++ b/snippets/color_table/records/brief/green.md @@ -1,3 +1 @@ -# green - -Write the documentation content for green here. \ No newline at end of file +Green channel value. \ No newline at end of file diff --git a/snippets/color_table/records/brief/red.md b/snippets/color_table/records/brief/red.md index 201aceb..27c40df 100644 --- a/snippets/color_table/records/brief/red.md +++ b/snippets/color_table/records/brief/red.md @@ -1,3 +1 @@ -# red - -Write the documentation content for red here. \ No newline at end of file +Red channel value. \ No newline at end of file diff --git a/snippets/color_table/records/condition/alpha.md b/snippets/color_table/records/condition/alpha.md new file mode 100644 index 0000000..502041c --- /dev/null +++ b/snippets/color_table/records/condition/alpha.md @@ -0,0 +1 @@ +If `constant_alpha` configuration is **not** set \ No newline at end of file diff --git a/snippets/color_table/records/condition/blue.md b/snippets/color_table/records/condition/blue.md new file mode 100644 index 0000000..439dd4b --- /dev/null +++ b/snippets/color_table/records/condition/blue.md @@ -0,0 +1 @@ +Always present \ No newline at end of file diff --git a/snippets/color_table/records/condition/color_type.md b/snippets/color_table/records/condition/color_type.md new file mode 100644 index 0000000..85be9fd --- /dev/null +++ b/snippets/color_table/records/condition/color_type.md @@ -0,0 +1 @@ +If `use_color_type` modifier is enabled. \ No newline at end of file diff --git a/snippets/color_table/records/condition/green.md b/snippets/color_table/records/condition/green.md new file mode 100644 index 0000000..439dd4b --- /dev/null +++ b/snippets/color_table/records/condition/green.md @@ -0,0 +1 @@ +Always present \ No newline at end of file diff --git a/snippets/color_table/records/condition/red.md b/snippets/color_table/records/condition/red.md new file mode 100644 index 0000000..439dd4b --- /dev/null +++ b/snippets/color_table/records/condition/red.md @@ -0,0 +1 @@ +Always present \ No newline at end of file diff --git a/snippets/font_table/brief.md b/snippets/font_table/brief.md index 69b28b0..6d2c5bd 100644 --- a/snippets/font_table/brief.md +++ b/snippets/font_table/brief.md @@ -1,3 +1,5 @@ -# font_table table - -Write the documentation content for font_table table here. \ No newline at end of file +Groups Character Tables into named fonts and carries the metadata to identify them. + +## Use Cases + +- **Sub-font grouping** - A single file can carry several related fonts, such as Regular, Bold, and Italic, each pointing at its own Character Tables. \ No newline at end of file diff --git a/snippets/font_table/links/brief/character_tables.md b/snippets/font_table/links/brief/character_tables.md index 925e6db..a2e0aee 100644 --- a/snippets/font_table/links/brief/character_tables.md +++ b/snippets/font_table/links/brief/character_tables.md @@ -1,3 +1 @@ -# character_tables - -Write the documentation content for character_tables here. \ No newline at end of file +Length byte followed by that many Character Table indices this font table may reference. \ No newline at end of file diff --git a/snippets/font_table/links/condition/character_tables.md b/snippets/font_table/links/condition/character_tables.md new file mode 100644 index 0000000..ffb677d --- /dev/null +++ b/snippets/font_table/links/condition/character_tables.md @@ -0,0 +1 @@ +If `link_character_tables` is enabled. \ No newline at end of file diff --git a/snippets/font_table/links/flag/link_character_tables.md b/snippets/font_table/links/flag/link_character_tables.md new file mode 100644 index 0000000..c7549ec --- /dev/null +++ b/snippets/font_table/links/flag/link_character_tables.md @@ -0,0 +1 @@ +This table links to one or more Character Tables. \ No newline at end of file diff --git a/snippets/font_table/records/brief/author.md b/snippets/font_table/records/brief/author.md index 72cc428..40d51e0 100644 --- a/snippets/font_table/records/brief/author.md +++ b/snippets/font_table/records/brief/author.md @@ -1,3 +1 @@ -# author - -Write the documentation content for author here. \ No newline at end of file +Author, manufacturer, or credits for the font. \ No newline at end of file diff --git a/snippets/font_table/records/brief/character_table_indexes.md b/snippets/font_table/records/brief/character_table_indexes.md index 606449c..172fd1c 100644 --- a/snippets/font_table/records/brief/character_table_indexes.md +++ b/snippets/font_table/records/brief/character_table_indexes.md @@ -1,3 +1 @@ -# character_table_indexes - -Write the documentation content for character_table_indexes here. \ No newline at end of file +Length byte followed by that many Character Table indices this font may access and use. \ No newline at end of file diff --git a/snippets/font_table/records/brief/font_type.md b/snippets/font_table/records/brief/font_type.md index 5361012..f1140e4 100644 --- a/snippets/font_table/records/brief/font_type.md +++ b/snippets/font_table/records/brief/font_type.md @@ -1,3 +1 @@ -# font_type - -Write the documentation content for font_type here. \ No newline at end of file +Style of this font (0 = Regular, 1 = Bold, 2 = Italic). \ No newline at end of file diff --git a/snippets/font_table/records/brief/name.md b/snippets/font_table/records/brief/name.md index 44891f8..cda885b 100644 --- a/snippets/font_table/records/brief/name.md +++ b/snippets/font_table/records/brief/name.md @@ -1,3 +1 @@ -# name - -Write the documentation content for name here. \ No newline at end of file +Human-readable font name. \ No newline at end of file diff --git a/snippets/font_table/records/brief/version.md b/snippets/font_table/records/brief/version.md index eb818fb..6309a5b 100644 --- a/snippets/font_table/records/brief/version.md +++ b/snippets/font_table/records/brief/version.md @@ -1,3 +1 @@ -# version - -Write the documentation content for version here. \ No newline at end of file +Revision number of this font, \ No newline at end of file diff --git a/snippets/font_table/records/condition/author.md b/snippets/font_table/records/condition/author.md new file mode 100644 index 0000000..23aba0f --- /dev/null +++ b/snippets/font_table/records/condition/author.md @@ -0,0 +1 @@ +Always present. \ No newline at end of file diff --git a/snippets/font_table/records/condition/character_table_indexes.md b/snippets/font_table/records/condition/character_table_indexes.md new file mode 100644 index 0000000..23aba0f --- /dev/null +++ b/snippets/font_table/records/condition/character_table_indexes.md @@ -0,0 +1 @@ +Always present. \ No newline at end of file diff --git a/snippets/font_table/records/condition/font_type.md b/snippets/font_table/records/condition/font_type.md new file mode 100644 index 0000000..23aba0f --- /dev/null +++ b/snippets/font_table/records/condition/font_type.md @@ -0,0 +1 @@ +Always present. \ No newline at end of file diff --git a/snippets/font_table/records/condition/name.md b/snippets/font_table/records/condition/name.md new file mode 100644 index 0000000..23aba0f --- /dev/null +++ b/snippets/font_table/records/condition/name.md @@ -0,0 +1 @@ +Always present. \ No newline at end of file diff --git a/snippets/font_table/records/condition/version.md b/snippets/font_table/records/condition/version.md new file mode 100644 index 0000000..23aba0f --- /dev/null +++ b/snippets/font_table/records/condition/version.md @@ -0,0 +1 @@ +Always present. \ No newline at end of file diff --git a/snippets/pixmap_table/brief.md b/snippets/pixmap_table/brief.md index 1ccdfd4..bd0e19b 100644 --- a/snippets/pixmap_table/brief.md +++ b/snippets/pixmap_table/brief.md @@ -1,3 +1,5 @@ -# pixmap_table table +Stores glyph data as collections of pixels within pixmaps, representing the visual appearance of a character. -Write the documentation content for pixmap_table table here. \ No newline at end of file +## Use Cases + +- **Glyph storage** - Contains the pixmap images for font characters diff --git a/snippets/pixmap_table/configurations/brief/constant_bits_per_pixel.md b/snippets/pixmap_table/configurations/brief/constant_bits_per_pixel.md index 32df24b..b35cb2d 100644 --- a/snippets/pixmap_table/configurations/brief/constant_bits_per_pixel.md +++ b/snippets/pixmap_table/configurations/brief/constant_bits_per_pixel.md @@ -1,3 +1 @@ -# constant_bits_per_pixel - -Write the documentation content for constant_bits_per_pixel here. \ No newline at end of file +The bits per pixel shared by all pixmaps in this table (only 1-8 supported). \ No newline at end of file diff --git a/snippets/pixmap_table/configurations/brief/constant_height.md b/snippets/pixmap_table/configurations/brief/constant_height.md index 936e729..70a5e0f 100644 --- a/snippets/pixmap_table/configurations/brief/constant_height.md +++ b/snippets/pixmap_table/configurations/brief/constant_height.md @@ -1,3 +1 @@ -# constant_height - -Write the documentation content for constant_height here. \ No newline at end of file +The height in pixels shared by all pixmaps in this table. \ No newline at end of file diff --git a/snippets/pixmap_table/configurations/brief/constant_width.md b/snippets/pixmap_table/configurations/brief/constant_width.md index eda1ddc..fa126c4 100644 --- a/snippets/pixmap_table/configurations/brief/constant_width.md +++ b/snippets/pixmap_table/configurations/brief/constant_width.md @@ -1,3 +1 @@ -# constant_width - -Write the documentation content for constant_width here. \ No newline at end of file +The width in pixels shared by all pixmaps in this table. \ No newline at end of file diff --git a/snippets/pixmap_table/configurations/condition/constant_bits_per_pixel.md b/snippets/pixmap_table/configurations/condition/constant_bits_per_pixel.md new file mode 100644 index 0000000..4243c8d --- /dev/null +++ b/snippets/pixmap_table/configurations/condition/constant_bits_per_pixel.md @@ -0,0 +1 @@ +If `use_constant_bits_per_pixel` is enabled \ No newline at end of file diff --git a/snippets/pixmap_table/configurations/condition/constant_height.md b/snippets/pixmap_table/configurations/condition/constant_height.md new file mode 100644 index 0000000..71e5197 --- /dev/null +++ b/snippets/pixmap_table/configurations/condition/constant_height.md @@ -0,0 +1 @@ +If `use_constant_height` is enabled. \ No newline at end of file diff --git a/snippets/pixmap_table/configurations/condition/constant_width.md b/snippets/pixmap_table/configurations/condition/constant_width.md new file mode 100644 index 0000000..728f9ad --- /dev/null +++ b/snippets/pixmap_table/configurations/condition/constant_width.md @@ -0,0 +1 @@ +If `use_constant_width` is enabled. \ No newline at end of file diff --git a/snippets/pixmap_table/configurations/flag/use_constant_bits_per_pixel.md b/snippets/pixmap_table/configurations/flag/use_constant_bits_per_pixel.md new file mode 100644 index 0000000..cb935c5 --- /dev/null +++ b/snippets/pixmap_table/configurations/flag/use_constant_bits_per_pixel.md @@ -0,0 +1 @@ +All pixmaps in this table use the same number of bits to represent a pixel. \ No newline at end of file diff --git a/snippets/pixmap_table/configurations/flag/use_constant_height.md b/snippets/pixmap_table/configurations/flag/use_constant_height.md new file mode 100644 index 0000000..f3e4a08 --- /dev/null +++ b/snippets/pixmap_table/configurations/flag/use_constant_height.md @@ -0,0 +1 @@ +All pixmaps in this table share the same height. \ No newline at end of file diff --git a/snippets/pixmap_table/configurations/flag/use_constant_width.md b/snippets/pixmap_table/configurations/flag/use_constant_width.md new file mode 100644 index 0000000..de552bb --- /dev/null +++ b/snippets/pixmap_table/configurations/flag/use_constant_width.md @@ -0,0 +1 @@ +All pixmaps in this table share the same width. \ No newline at end of file diff --git a/snippets/pixmap_table/links/brief/color_tables.md b/snippets/pixmap_table/links/brief/color_tables.md index 554ebb2..44d9223 100644 --- a/snippets/pixmap_table/links/brief/color_tables.md +++ b/snippets/pixmap_table/links/brief/color_tables.md @@ -1,3 +1 @@ -# color_tables - -Write the documentation content for color_tables here. \ No newline at end of file +Length byte followed by that many Color Table indices supplying the palette that pixel values index into. \ No newline at end of file diff --git a/snippets/pixmap_table/links/condition/color_tables.md b/snippets/pixmap_table/links/condition/color_tables.md new file mode 100644 index 0000000..5b1f06c --- /dev/null +++ b/snippets/pixmap_table/links/condition/color_tables.md @@ -0,0 +1 @@ +If `link_color_tables` is enabled. \ No newline at end of file diff --git a/snippets/pixmap_table/links/flag/link_color_tables.md b/snippets/pixmap_table/links/flag/link_color_tables.md new file mode 100644 index 0000000..3a0e8f6 --- /dev/null +++ b/snippets/pixmap_table/links/flag/link_color_tables.md @@ -0,0 +1 @@ +This table links to one or more Color Tables for palette mapping \ No newline at end of file diff --git a/snippets/pixmap_table/records/brief/bits_per_pixel.md b/snippets/pixmap_table/records/brief/bits_per_pixel.md index 7091d01..02021ec 100644 --- a/snippets/pixmap_table/records/brief/bits_per_pixel.md +++ b/snippets/pixmap_table/records/brief/bits_per_pixel.md @@ -1,3 +1 @@ -# bits_per_pixel - -Write the documentation content for bits_per_pixel here. \ No newline at end of file +Bits used to represent each pixel of this pixmap (only 1-8 supported). \ No newline at end of file diff --git a/snippets/pixmap_table/records/brief/data.md b/snippets/pixmap_table/records/brief/data.md index bd849a7..20ab5f2 100644 --- a/snippets/pixmap_table/records/brief/data.md +++ b/snippets/pixmap_table/records/brief/data.md @@ -1,3 +1 @@ -# data - -Write the documentation content for data here. \ No newline at end of file +Packed pixel data as a bit array \ No newline at end of file diff --git a/snippets/pixmap_table/records/brief/height.md b/snippets/pixmap_table/records/brief/height.md index 154ea86..299130e 100644 --- a/snippets/pixmap_table/records/brief/height.md +++ b/snippets/pixmap_table/records/brief/height.md @@ -1,3 +1 @@ -# height - -Write the documentation content for height here. \ No newline at end of file +Height of this pixmap in pixels. \ No newline at end of file diff --git a/snippets/pixmap_table/records/brief/width.md b/snippets/pixmap_table/records/brief/width.md index 28f6238..4f2d132 100644 --- a/snippets/pixmap_table/records/brief/width.md +++ b/snippets/pixmap_table/records/brief/width.md @@ -1,3 +1 @@ -# width - -Write the documentation content for width here. \ No newline at end of file +Width of this pixmap in pixels. \ No newline at end of file diff --git a/snippets/pixmap_table/records/condition/bits_per_pixel.md b/snippets/pixmap_table/records/condition/bits_per_pixel.md new file mode 100644 index 0000000..853ed5e --- /dev/null +++ b/snippets/pixmap_table/records/condition/bits_per_pixel.md @@ -0,0 +1 @@ +If `use_constant_bits_per_pixel` is not enabled. \ No newline at end of file diff --git a/snippets/pixmap_table/records/condition/data.md b/snippets/pixmap_table/records/condition/data.md new file mode 100644 index 0000000..23aba0f --- /dev/null +++ b/snippets/pixmap_table/records/condition/data.md @@ -0,0 +1 @@ +Always present. \ No newline at end of file diff --git a/snippets/pixmap_table/records/condition/height.md b/snippets/pixmap_table/records/condition/height.md new file mode 100644 index 0000000..feb657c --- /dev/null +++ b/snippets/pixmap_table/records/condition/height.md @@ -0,0 +1 @@ +If `use_constant_height` is not enabled. \ No newline at end of file diff --git a/snippets/pixmap_table/records/condition/width.md b/snippets/pixmap_table/records/condition/width.md new file mode 100644 index 0000000..6952f69 --- /dev/null +++ b/snippets/pixmap_table/records/condition/width.md @@ -0,0 +1 @@ +If `use_constant_width` is not enabled. \ No newline at end of file diff --git a/src/Character Table.md b/src/Character Table.md index b1cfa5f..bfeeb52 100644 --- a/src/Character Table.md +++ b/src/Character Table.md @@ -1,4 +1,4 @@ -\textinput{../snippets/character_table/breif.md} +\textinput{../snippets/character_table/brief.md} ## Table Structure @@ -24,20 +24,20 @@ | Bit | Name | Description | | --- | ------------------------------ | --------------------------------------------------------------- | -| 0 | `use_constant_codepoint_count` | \textinput{../snippets/character_table/configurations/flag/use_constant_codepoint_count.md} | +| 0 | `use_constant_code_point_count` | \textinput{../snippets/character_table/configurations/flag/use_constant_code_point_count.md} | | 1-7 | — | \textinput{../snippets/phrase/reserved.md} | #### Configuration Values | Name | Type | Condition | Description | | -------------------------- | ---- | -------------------------------------------- | ------------------------------------------------------------------- | -| `constant_codepoint_count` | `u8` | \textinput{../snippets/character_table/configurations/condition/constant_codepoint_count.md} | \textinput{../snippets/character_table/configurations/brief/constant_codepoint_count.md} | +| `constant_code_point_count` | `u8` | \textinput{../snippets/character_table/configurations/condition/constant_code_point_count.md} | \textinput{../snippets/character_table/configurations/brief/constant_code_point_count.md} | ### Table Links | Bit | Name | Description | | --- | -------------------- | --------------------------------------------- | -| 0 | `link_pixmap_tables` | \textinput{../snippets/character_table/links/condition/link_pixmap_tables.md} | +| 0 | `link_pixmap_tables` | \textinput{../snippets/character_table/links/flag/link_pixmap_tables.md} | | 1-7 | — | \textinput{../snippets/phrase/reserved.md} | #### Link Arrays @@ -54,80 +54,91 @@ Each character record contains the following fields in order: | -------------------- | -------------------- | ----------------------------------------------- | ------------------------------------------------------------------------------------------- | | `advance_x` | `u8` | \textinput{../snippets/character_table/records/condition/advance_x.md} | \textinput{../snippets/character_table/records/brief/advance_x.md} | | `pixmap_index` | `u8` | \textinput{../snippets/character_table/records/condition/pixmap_index.md} | \textinput{../snippets/character_table/records/brief/pixmap_index.md} | -| `pixmap_table_index` | `Index` | \textinput{../snippets/character_table/records/condition/pixmap_table_index.md} | \textinput{../snippets/character_table/records/brief/pixmap_table_index.md} | -| `codepoints` | `str` | \textinput{../snippets/character_table/records/condition/codepoints.md} | \textinput{../snippets/character_table/records/brief/codepoints.md} | +| `pixmap_table_index` | `u8` | \textinput{../snippets/character_table/records/condition/pixmap_table_index.md} | \textinput{../snippets/character_table/records/brief/pixmap_table_index.md} | +| `code_points` | `String` | \textinput{../snippets/character_table/records/condition/code_points.md} | \textinput{../snippets/character_table/records/brief/code_points.md} | ### Record Layout Examples - -**Example 1: Minimal record** (no modifiers) -``` -Character 'A' with default pixmap index 0 and default advance - -Byte layout: [codepoints] [null] -Binary: 01000001 00000000 -Hex: 41 00 -Represents: 'A' (U+0041) -``` - -**Example 2: With custom advance** -``` -Character 'W' with custom 12-pixel advance - -Byte layout: [advance_x] [codepoints] [null] -Binary: 00001100 01010111 00000000 -Hex: 0C 57 00 -Represents: advance=12, 'W' (U+0057) -``` - -**Example 3: With pixmap index** -``` -Character 'é' using pixmap at index 5 - -Byte layout: [pixmap_index] [codepoints] [null] -Binary: 00000101 11000011 10101001 00000000 -Hex: 05 C3 A9 00 -Represents: pixmap_index=5, 'é' (U+00E9, UTF-8: 0xC3 0xA9) -``` - + +**Example 1: Minimal record** (no modifier flags enabled) + +Character `A`, using the default advance and the default pixmap index. + +| Byte | Field | Binary | Hex | Description | +| ---- | ------------- | ---------- | ---- | ------------------------- | +| 1 | `code_points` | `01000001` | `41` | `A` (U+0041) | +| 2 | — | `00000000` | `00` | Null terminator | + +**Example 2: With custom advance** (`use_advance_x`) + +Character `W` with a custom 12 pixel advance. + +| Byte | Field | Binary | Hex | Description | +| ---- | ------------- | ---------- | ---- | ------------------------- | +| 1 | `advance_x` | `00001100` | `0C` | Advance 12 pixels | +| 2 | `code_points` | `01010111` | `57` | `W` (U+0057) | +| 3 | — | `00000000` | `00` | Null terminator | + +**Example 3: With pixmap index** (`use_pixmap_index`) + +Character `é` drawn with the pixmap at index 5. The code point needs two UTF-8 bytes. + +| Byte | Field | Binary | Hex | Description | +| ---- | -------------- | ---------- | ---- | ---------------------------------- | +| 1 | `pixmap_index` | `00000101` | `05` | Pixmap 5 | +| 2 | `code_points` | `11000011` | `C3` | `é` (U+00E9), byte 1 of 2 | +| 3 | `code_points` | `10101001` | `A9` | `é` (U+00E9), byte 2 of 2 | +| 4 | — | `00000000` | `00` | Null terminator | + **Example 4: With all optional fields** -``` -Character '👍' with advance=16, pixmap_index=42, pixmap_table_index=1 - -Byte layout: [advance_x] [pixmap_index] [table_index] [codepoints (4 bytes)] [null] -Binary: 00010000 00101010 00000001 11110000 10011111 10010001 10001101 00000000 -Hex: 10 2A 01 F0 9F 91 8D 00 -Represents: advance=16, pixmap=42, table=1, '👍' (U+1F44D, UTF-8: 0xF0 0x9F 0x91 0x8D) -``` - -**Example 5: With constant cluster codepoints** -``` -Configuration: constant_cluster_codepoints = 1 (all ASCII) -Character 'B' with fixed 1-byte length - -Byte layout: [grapheme_cluster] -Binary: 01000010 -Hex: 42 -Represents: 'B' (U+0042, no null terminator needed) -``` - + +Character `👍` with advance 16, pixmap index 42, drawn from linked Pixmap Table 1. + +| Byte | Field | Binary | Hex | Description | +| ---- | -------------------- | ---------- | ---- | ---------------------------------- | +| 1 | `advance_x` | `00010000` | `10` | Advance 16 pixels | +| 2 | `pixmap_index` | `00101010` | `2A` | Pixmap 42 | +| 3 | `pixmap_table_index` | `00000001` | `01` | Pixmap Table 1 | +| 4 | `code_points` | `11110000` | `F0` | `👍` (U+1F44D), byte 1 of 4 | +| 5 | `code_points` | `10011111` | `9F` | `👍` (U+1F44D), byte 2 of 4 | +| 6 | `code_points` | `10010001` | `91` | `👍` (U+1F44D), byte 3 of 4 | +| 7 | `code_points` | `10001101` | `8D` | `👍` (U+1F44D), byte 4 of 4 | +| 8 | — | `00000000` | `00` | Null terminator | + +**Example 5: With a constant code point count** + +Configuration: `constant_code_point_count = 1`, so every character in the table is exactly one code point. + +| Byte | Field | Binary | Hex | Description | +| ---- | ------------- | ---------- | ---- | ------------------------------------ | +| 1 | `code_points` | `01000010` | `42` | `B` (U+0042), no terminator required | + +**Example 6: Multi-code-point cluster** + +The ligature `!=` stored as a single character, with no constant code point count set. + +| Byte | Field | Binary | Hex | Description | +| ---- | ------------- | ---------- | ---- | --------------------------------- | +| 1 | `code_points` | `00100001` | `21` | `!` (U+0021), code point 1 of 2 | +| 2 | `code_points` | `00111101` | `3D` | `=` (U+003D), code point 2 of 2 | +| 3 | — | `00000000` | `00` | Null terminator ends the cluster | + ## Complete Table Example - -The following byte sequence defines a minimal Character Table with two characters ('A' and 'B'), using custom advance values and linking to one Pixmap Table: - + +The following byte sequence defines a minimal Character Table with two characters (`A` and `B`), using custom advance values and linking to one Pixmap Table: + | Byte(s) | Binary | Hex | Description | | ------- | ---------- | ---- | -------------------------------------------------------------- | | 1 | `00000001` | `01` | Table identifier for Character Table | | 2 | `00000011` | `03` | Modifier flags: `use_advance_x` and `use_pixmap_index` enabled | -| 3 | `00000001` | `01` | Configuration flags: `constant_codepoint_count` enabled | -| 4 | `00000001` | `01` | Configuration value: cluster length = 1 byte | -| 5 | `00000001` | `01` | Table links: `pixmap_tables` enabled | +| 3 | `00000001` | `01` | Configuration flags: `use_constant_code_point_count` enabled | +| 4 | `00000001` | `01` | `constant_code_point_count` = 1 code point | +| 5 | `00000001` | `01` | Table links: `link_pixmap_tables` enabled | | 6 | `00000001` | `01` | Pixmap table array length = 1 | | 7 | `00000000` | `00` | Link to Pixmap Table at index 0 | | 8 | `00000010` | `02` | Record count = 2 characters | -| 9 | `00001000` | `08` | Record 0: advance_x = 8 pixels | -| 10 | `00000000` | `00` | Record 0: pixmap_index = 0 | -| 11 | `01000001` | `41` | Record 0: codepoints = 'A' | -| 12 | `00001000` | `08` | Record 1: advance_x = 8 pixels | -| 13 | `00000001` | `01` | Record 1: pixmap_index = 1 | -| 14 | `01000010` | `42` | Record 1: codepoints = 'B' | - +| 9 | `00001000` | `08` | Character 0: `advance_x` = 8 pixels | +| 10 | `00000000` | `00` | Character 0: `pixmap_index` = 0 | +| 11 | `01000001` | `41` | Character 0: `code_points` = `A` | +| 12 | `00001000` | `08` | Character 1: `advance_x` = 8 pixels | +| 13 | `00000001` | `01` | Character 1: `pixmap_index` = 1 | +| 14 | `01000010` | `42` | Character 1: `code_points` = `B` | diff --git a/src/Color Table.md b/src/Color Table.md new file mode 100644 index 0000000..e9573d9 --- /dev/null +++ b/src/Color Table.md @@ -0,0 +1,115 @@ +\textinput{../snippets/color_table/brief.md} + +## Table Structure + +### Identifier +- **Value**: `0x03` + + +## Modifier Flags + +| Bit | Name | Description | +| --- | ---- | ----------- | +| 0 | `use_color_type` | \textinput{../snippets/color_table/modifiers/brief/use_color_type.md} | +| 1-7 | — | \textinput{../snippets/phrase/reserved.md} | + +### Flag Details + +- **`use_color_type`**: \textinput{../snippets/color_table/modifiers/details/use_color_type.md} + +## Configuration Flags + +| Bit | Name | Description | +| --- | ---- | ----------- | +| 0 | `use_constant_alpha` | \textinput{../snippets/color_table/configurations/flag/use_constant_alpha.md} | +| 1-7 | — | \textinput{../snippets/phrase/reserved.md} | + +### Configuration Values + +| Name | Type | Condition | Description | +| ---- | ---- | --------- | ----------- | +| `constant_alpha` | `u8` | \textinput{../snippets/color_table/configurations/condition/constant_alpha.md} | \textinput{../snippets/color_table/configurations/brief/constant_alpha.md} | + +### Table Links + +| Bit | Name | Description | +| --- | ---- | ------------------------ | +| 0-7 | — | Reserved for future use. | + +The Color Table links to no other table. The byte is still written, as `0x00`. + +## Record Fields + + +Each record contains the following fields in order: + +| Field | Type | Condition | Description | +| ----- | ---- | --------- | ----------- | +| `color_type` | `u8` | \textinput{../snippets/color_table/records/condition/color_type.md} | \textinput{../snippets/color_table/records/brief/color_type.md} | +| `alpha` | `u8` | \textinput{../snippets/color_table/records/condition/alpha.md} | \textinput{../snippets/color_table/records/brief/alpha.md} | +| `red` | `u8` | \textinput{../snippets/color_table/records/condition/red.md} | \textinput{../snippets/color_table/records/brief/red.md} | +| `green` | `u8` | \textinput{../snippets/color_table/records/condition/green.md} | \textinput{../snippets/color_table/records/brief/green.md} | +| `blue` | `u8` | \textinput{../snippets/color_table/records/condition/blue.md} | \textinput{../snippets/color_table/records/brief/blue.md} | + + +### Record Layout Examples + +**Example 1: Minimal record** + +No modifier flags, and `use_constant_alpha` enabled so the table supplies alpha. + +| Byte | Field | Binary | Hex | Description | +| ---- | ------- | ---------- | ---- | ------------- | +| 1 | `red` | `11111111` | `FF` | Red = 255 | +| 2 | `green` | `00000000` | `00` | Green = 0 | +| 3 | `blue` | `10101010` | `AA` | Blue = 170 | + +Result: `rgb(255, 0, 170)`, a magenta taking its alpha from `constant_alpha`. + +**Example 2: With custom alpha** + +`use_constant_alpha` is not set, so every record carries its own alpha. + +| Byte | Field | Binary | Hex | Description | +| ---- | ------- | ---------- | ---- | ------------------------- | +| 1 | `alpha` | `10000000` | `80` | Alpha = 128, roughly 50% | +| 2 | `red` | `11111111` | `FF` | Red = 255 | +| 3 | `green` | `11111111` | `FF` | Green = 255 | +| 4 | `blue` | `11111111` | `FF` | Blue = 255 | + +Result: `rgba(255, 255, 255, 128)`, a 50% transparent white. + +**Example 3: With all optional fields** + +`use_color_type` enabled and no `constant_alpha` set. + +| Byte | Field | Binary | Hex | Description | +| ---- | ------------ | ---------- | ---- | ---------------------------- | +| 1 | `color_type` | `00000001` | `01` | 1 = Absolute | +| 2 | `alpha` | `11111111` | `FF` | Alpha = 255, fully opaque | +| 3 | `red` | `00000000` | `00` | Red = 0 | +| 4 | `green` | `00000000` | `00` | Green = 0 | +| 5 | `blue` | `00000000` | `00` | Blue = 0 | + +Result: `rgba(0, 0, 0, 255)`, an absolute black that a renderer should not recolor. + +## Complete Table Example + +The following byte sequence defines a two-entry palette with a shared alpha, one dynamic color and one absolute color: + +| Bytes | Binary | Hex | Description | +| ------- | ---------- | ---- | -------------------------------------------------- | +| 1 | `00000011` | `03` | Table identifier for Color Table | +| 2 | `00000001` | `01` | Modifier flags: `use_color_type` enabled | +| 3 | `00000001` | `01` | Configuration flags: `use_constant_alpha` enabled | +| 4 | `11111111` | `FF` | `constant_alpha` = 255, fully opaque | +| 5 | `00000000` | `00` | Table links: none set | +| 6 | `00000010` | `02` | Record count = 2 colors | +| 7 | `00000000` | `00` | Color 0: `color_type` = 0 (Dynamic) | +| 8 | `00000000` | `00` | Color 0: `red` = 0 | +| 9 | `00000000` | `00` | Color 0: `green` = 0 | +| 10 | `00000000` | `00` | Color 0: `blue` = 0 | +| 11 | `00000001` | `01` | Color 1: `color_type` = 1 (Absolute) | +| 12 | `11111111` | `FF` | Color 1: `red` = 255 | +| 13 | `11111111` | `FF` | Color 1: `green` = 255 | +| 14 | `11111111` | `FF` | Color 1: `blue` = 255 | diff --git a/src/Font Table.md b/src/Font Table.md new file mode 100644 index 0000000..5140453 --- /dev/null +++ b/src/Font Table.md @@ -0,0 +1,150 @@ +\textinput{../snippets/font_table/brief.md} + +## Table Structure + +### Identifier +- **Value**: `0x04` + +### Modifier Flags + +| Bit | Name | Description | +| --- | ---- | ------------------------ | +| 0-7 | — | Reserved for future use. | + +The Font Table has no modifier flags currently. The byte is still written, as `0x00`. + +### Configuration Flags + +| Bit | Name | Description | +| --- | ---- | ------------------------ | +| 0-7 | — | Reserved for future use. | + +The Font Table has no configuration flags currently, and therefore no configuration values. The byte is still written, as `0x00`. + +## Table Links + +| Bit | Name | Description | +| --- | ---- | ----------- | +| 0 | `link_character_tables` | \textinput{../snippets/font_table/links/flag/link_character_tables.md} | +| 1-7 | — | \textinput{../snippets/phrase/reserved.md} | + +### Link Arrays + +| Name | Type | Condition | Description | +| ---- | ---- | --------- | ----------- | +| `character_tables` | `Vec` | \textinput{../snippets/font_table/links/condition/character_tables.md} | \textinput{../snippets/font_table/links/brief/character_tables.md} | + +## Record Fields + + +Each record contains the following fields in order: + +| Field | Type | Condition | Description | +| ----- | ---- | --------- | ----------- | +| `name` | `CString` | \textinput{../snippets/font_table/records/condition/name.md} | \textinput{../snippets/font_table/records/brief/name.md} | +| `author` | `CString` | \textinput{../snippets/font_table/records/condition/author.md} | \textinput{../snippets/font_table/records/brief/author.md} | +| `version` | `u8` | \textinput{../snippets/font_table/records/condition/version.md} | \textinput{../snippets/font_table/records/brief/version.md} | +| `font_type` | `u8` | \textinput{../snippets/font_table/records/condition/font_type.md} | \textinput{../snippets/font_table/records/brief/font_type.md} | +| `character_table_indexes` | `Vec` | \textinput{../snippets/font_table/records/condition/character_table_indexes.md} | \textinput{../snippets/font_table/records/brief/character_table_indexes.md} | + +### Record Layout Examples + +**Example 1: Minimal record** + +An unnamed, uncredited font drawing from a single Character Table. + +| Byte | Field | Binary | Hex | Description | +| ---- | ------------------ | ---------- | ---- | ------------------------------------ | +| 1 | `name` | `00000000` | `00` | Empty name, terminator only | +| 2 | `author` | `00000000` | `00` | Empty author, terminator only | +| 3 | `version` | `00000001` | `01` | Version 1 | +| 4 | `font_type` | `00000000` | `00` | 0 = Regular | +| 5 | `character_table_indexes` | `00000001` | `01` | Array length = 1 | +| 6 | `character_table_indexes` | `00000000` | `00` | Uses Character Table 0 | + +**Example 2: Typical record** + +The font `Toys` by `Nice`, linking one Character Table. + +| Byte | Field | Binary | Hex | Description | +| ---- | ------------------ | ---------- | ---- | ------------------------------------ | +| 1 | `name` | `01010100` | `54` | `T` | +| 2 | `name` | `01101111` | `6F` | `o` | +| 3 | `name` | `01111001` | `79` | `y` | +| 4 | `name` | `01110011` | `73` | `s` | +| 5 | — | `00000000` | `00` | Null terminator ends `name` | +| 6 | `author` | `01001110` | `4E` | `N` | +| 7 | `author` | `01101001` | `69` | `i` | +| 8 | `author` | `01100011` | `63` | `c` | +| 9 | `author` | `01100101` | `65` | `e` | +| 10 | — | `00000000` | `00` | Null terminator ends `author` | +| 11 | `version` | `00000001` | `01` | Version 1 | +| 12 | `font_type` | `00000000` | `00` | 0 = Regular | +| 13 | `character_table_indexes` | `00000001` | `01` | Array length = 1 | +| 14 | `character_table_indexes` | `00000000` | `00` | Uses Character Table 0 | + +**Example 3: Non-ASCII metadata and multiple Character Tables** + +The font `Toys` by `Nicé`, a bold variant drawing from two Character Tables. The author's last code point needs two UTF-8 bytes. + +| Byte | Field | Binary | Hex | Description | +| ---- | ------------------ | ---------- | ---- | ------------------------------------ | +| 1 | `name` | `01010100` | `54` | `T` | +| 2 | `name` | `01101111` | `6F` | `o` | +| 3 | `name` | `01111001` | `79` | `y` | +| 4 | `name` | `01110011` | `73` | `s` | +| 5 | — | `00000000` | `00` | Null terminator ends `name` | +| 6 | `author` | `01001110` | `4E` | `N` | +| 7 | `author` | `01101001` | `69` | `i` | +| 8 | `author` | `01100011` | `63` | `c` | +| 9 | `author` | `11000011` | `C3` | `é` (U+00E9), byte 1 of 2 | +| 10 | `author` | `10101001` | `A9` | `é` (U+00E9), byte 2 of 2 | +| 11 | — | `00000000` | `00` | Null terminator ends `author` | +| 12 | `version` | `00000010` | `02` | Version 2 | +| 13 | `font_type` | `00000001` | `01` | 1 = Bold | +| 14 | `character_table_indexes` | `00000010` | `02` | Array length = 2 | +| 15 | `character_table_indexes` | `00000000` | `00` | Uses Character Table 0 | +| 16 | `character_table_indexes` | `00000010` | `02` | Uses Character Table 2 | + +## Complete Table Example + +The following byte sequence defines a Font Table holding two fonts, a Regular and a Bold. Between them they use the two Character Tables the table links to: + +| Byte | Binary | Hex | Description | +| ------- | ---------- | ---- | -------------------------------------------------- | +| 1 | `00000100` | `04` | Table identifier for Font Table | +| 2 | `00000000` | `00` | Modifier flags: none set | +| 3 | `00000000` | `00` | Configuration flags: none set | +| 4 | `00000001` | `01` | Table links: `link_character_tables` enabled | +| 5 | `00000010` | `02` | Character table array length = 2 | +| 6 | `00000000` | `00` | Link to Character Table at index 0 | +| 7 | `00000001` | `01` | Link to Character Table at index 1 | +| 8 | `00000010` | `02` | Record count = 2 fonts | +| 9 | `01010100` | `54` | Font 0: `name` = `T` | +| 10 | `01101111` | `6F` | Font 0: `name` = `o` | +| 11 | `01111001` | `79` | Font 0: `name` = `y` | +| 12 | `01110011` | `73` | Font 0: `name` = `s` | +| 13 | `00000000` | `00` | Font 0: `name` terminator | +| 14 | `01001110` | `4E` | Font 0: `author` = `N` | +| 15 | `01101001` | `69` | Font 0: `author` = `i` | +| 16 | `01100011` | `63` | Font 0: `author` = `c` | +| 17 | `01100101` | `65` | Font 0: `author` = `e` | +| 18 | `00000000` | `00` | Font 0: `author` terminator | +| 19 | `00000001` | `01` | Font 0: `version` = 1 | +| 20 | `00000000` | `00` | Font 0: `font_type` = 0 (Regular) | +| 21 | `00000001` | `01` | Font 0: character table array length = 1 | +| 22 | `00000000` | `00` | Font 0: uses Character Table 0 | +| 23 | `01010100` | `54` | Font 1: `name` = `T` | +| 24 | `01101111` | `6F` | Font 1: `name` = `o` | +| 25 | `01111001` | `79` | Font 1: `name` = `y` | +| 26 | `01110011` | `73` | Font 1: `name` = `s` | +| 27 | `00000000` | `00` | Font 1: `name` terminator | +| 28 | `01001110` | `4E` | Font 1: `author` = `N` | +| 29 | `01101001` | `69` | Font 1: `author` = `i` | +| 30 | `01100011` | `63` | Font 1: `author` = `c` | +| 31 | `01100101` | `65` | Font 1: `author` = `e` | +| 32 | `00000000` | `00` | Font 1: `author` terminator | +| 33 | `00000001` | `01` | Font 1: `version` = 1 | +| 34 | `00000001` | `01` | Font 1: `font_type` = 1 (Bold) | +| 35 | `00000001` | `01` | Font 1: character table array length = 1 | +| 36 | `00000001` | `01` | Font 1: uses Character Table 1 | diff --git a/src/Home.md b/src/Home.md new file mode 100644 index 0000000..b89d9e8 --- /dev/null +++ b/src/Home.md @@ -0,0 +1,3 @@ +Welcome to the SimplePixelFont (SPF) Format Specifications. + +**Note: This wiki is under development.** \ No newline at end of file diff --git a/src/Pixmap Table.md b/src/Pixmap Table.md new file mode 100644 index 0000000..41df871 --- /dev/null +++ b/src/Pixmap Table.md @@ -0,0 +1,193 @@ +\textinput{../snippets/pixmap_table/brief.md} + +## Table Structure + +### Identifier +- **Value**: `0x02` + + +## Configuration Flags + +| Bit | Name | Description | +| --- | ---- | ----------- | +| 0 | `use_constant_width` | \textinput{../snippets/pixmap_table/configurations/flag/use_constant_width.md} | +| 1 | `use_constant_height` | \textinput{../snippets/pixmap_table/configurations/flag/use_constant_height.md} | +| 2 | `use_constant_bits_per_pixel` | \textinput{../snippets/pixmap_table/configurations/flag/use_constant_bits_per_pixel.md} | +| 3-7 | — | \textinput{../snippets/phrase/reserved.md} | + +### Configuration Values + +| Name | Type | Condition | Description | +| ---- | ---- | --------- | ----------- | +| `constant_width` | `u8` | \textinput{../snippets/pixmap_table/configurations/condition/constant_width.md} | \textinput{../snippets/pixmap_table/configurations/brief/constant_width.md} | +| `constant_height` | `u8` | \textinput{../snippets/pixmap_table/configurations/condition/constant_height.md} | \textinput{../snippets/pixmap_table/configurations/brief/constant_height.md} | +| `constant_bits_per_pixel` | `u8` | \textinput{../snippets/pixmap_table/configurations/condition/constant_bits_per_pixel.md} | \textinput{../snippets/pixmap_table/configurations/brief/constant_bits_per_pixel.md} | + +## Table Links + +| Bit | Name | Description | +| --- | ---- | ----------- | +| 0 | `link_color_tables` | \textinput{../snippets/pixmap_table/links/flag/link_color_tables.md} | +| 1-7 | — | \textinput{../snippets/phrase/reserved.md} | + +### Link Arrays + +| Name | Type | Condition | Description | +| ---- | ---- | --------- | ----------- | +| `color_tables` | `Vec` | \textinput{../snippets/pixmap_table/links/condition/color_tables.md} | \textinput{../snippets/pixmap_table/links/brief/color_tables.md} | + +## Record Fields + + +Each record contains the following fields in order: + +| Field | Type | Condition | Description | +| ----- | ---- | --------- | ----------- | +| `width` | `u8` | \textinput{../snippets/pixmap_table/records/condition/width.md} | \textinput{../snippets/pixmap_table/records/brief/width.md} | +| `height` | `u8` | \textinput{../snippets/pixmap_table/records/condition/height.md} | \textinput{../snippets/pixmap_table/records/brief/height.md} | +| `bits_per_pixel` | `u8` | \textinput{../snippets/pixmap_table/records/condition/bits_per_pixel.md} | \textinput{../snippets/pixmap_table/records/brief/bits_per_pixel.md} | +| `data` | `Vec` | \textinput{../snippets/pixmap_table/records/condition/data.md} | \textinput{../snippets/pixmap_table/records/brief/data.md} | + +### Pixel Data Encoding + +Resolve `width`, `height`, and `bits_per_pixel` first, taking the table constant where one exists and the record's own value otherwise, then: + +| Quantity | Formula | +| --------------------- | -------------------------------------- | +| `total_bits` | `width × height × bits_per_pixel` | +| `complete_bytes_used` | `total_bits / 8` | +| `remainder_bits` | `total_bits % 8` | + +Pixels are stored row-major, origin top-left, left to right then top to bottom, and packed least significant bit first: pixel 0 takes the lowest unused bits of the first byte (LSB), each following pixel uses the next bits available, resuming at bit 0 of the next byte if cut off. + +Every pixel value is an index into the linked Color Table. If no Color Table is linked, then the renderer should assume 0 as transparent and 1 as opaque. `bits_per_pixel` determines how many records from the Color Table the pixmap can address. + +The final partial byte is where the file-level `compact` property applies: + +| `compact` | Trailing bits | +| --------- | ---------------------------------------------------------------------------------------------------- | +| Disabled | The remainder is written as a full padded byte, wasting up to 7 bits but keeping every record byte-aligned. | +| Enabled | Only `remainder_bits` bits are written, so the next record or table begins mid-byte. | + +### Record Layout Examples + +**Example 1: Fully constant table** + +Configuration: `constant_width = 8`, `constant_height = 8`, `constant_bits_per_pixel = 1`. All three dimensions come from the table, so the record is nothing but data. 8 × 8 × 1 = 64 bits = 8 whole bytes, no remainder. + +| Byte | Field | Binary | Hex | Description | +| ---- | ------ | ---------- | ---- | --------------------------- | +| 1 | `data` | `11111111` | `FF` | Row 0 | +| 2 | `data` | `10000001` | `81` | Row 1 | +| 3 | `data` | `10000001` | `81` | Row 2 | +| 4 | `data` | `10000001` | `81` | Row 3 | +| 5 | `data` | `10000001` | `81` | Row 4 | +| 6 | `data` | `10000001` | `81` | Row 5 | +| 7 | `data` | `10000001` | `81` | Row 6 | +| 8 | `data` | `11111111` | `FF` | Row 7 | + +The result is an 8 × 8 square outline, one byte per row. + +**Example 2: Custom width and height** + +Configuration: `constant_bits_per_pixel = 1` only. A 5 × 3 glyph addressing a two-entry palette. 5 × 3 × 1 = 15 bits, so one whole byte plus 7 remainder bits. + +| Byte | Field | Binary | Hex | Description | +| ---- | -------- | ---------- | ---- | ----------------------------------------------- | +| 1 | `width` | `00000101` | `05` | 5 pixels wide | +| 2 | `height` | `00000011` | `03` | 3 pixels tall | +| 3 | `data` | `10011111` | `9F` | Pixels 0-7 | +| 4 | `data` | `00010000` | `10` | Pixels 8-14 in the low 7 bits, 1 bit padding | + +Unpacked into rows: + +| Row | Palette indices | Shape / Visual | +| --- | --------------- | ------- | +| 0 | `1 1 1 1 1` | `#####` | +| 1 | `0 0 1 0 0` | `..#..` | +| 2 | `0 0 1 0 0` | `..#..` | + +**Example 3: Custom bits per pixel** + +Configuration: `constant_width = 4`, `constant_height = 4`. A 4 × 4 glyph with 2 bits per pixel, so 4 palette entries. 4 × 4 × 2 = 32 bits = 4 whole bytes. + +| Byte | Field | Binary | Hex | Description | +| ---- | ---------------- | ---------- | ---- | ------------------------------------------ | +| 1 | `bits_per_pixel` | `00000010` | `02` | 2 bits per pixel | +| 2 | `data` | `11100100` | `E4` | Row 0: palette indices 0, 1, 2, 3 | +| 3 | `data` | `11100100` | `E4` | Row 1: palette indices 0, 1, 2, 3 | +| 4 | `data` | `11100100` | `E4` | Row 2: palette indices 0, 1, 2, 3 | +| 5 | `data` | `11100100` | `E4` | Row 3: palette indices 0, 1, 2, 3 | + +**Example 4: Fully custom record** + +No configuration constants set. A 3 × 3 glyph at 8 bits per pixel, so every pixel is one byte holding a palette index. 3 × 3 × 8 = 72 bits = 9 whole bytes. + +| Byte | Field | Binary | Hex | Description | +| ---- | ---------------- | ---------- | ---- | ------------------------------------ | +| 1 | `width` | `00000011` | `03` | 3 pixels wide | +| 2 | `height` | `00000011` | `03` | 3 pixels tall | +| 3 | `bits_per_pixel` | `00001000` | `08` | 8 bits per pixel, up to 256 entries | +| 4 | `data` | `00000001` | `01` | Row 0, pixel 0: palette index 1 | +| 5 | `data` | `00000000` | `00` | Row 0, pixel 1: palette index 0 | +| 6 | `data` | `00000000` | `00` | Row 0, pixel 2: palette index 0 | +| 7 | `data` | `00000000` | `00` | Row 1, pixel 0: palette index 0 | +| 8 | `data` | `00000001` | `01` | Row 1, pixel 1: palette index 1 | +| 9 | `data` | `00000000` | `00` | Row 1, pixel 2: palette index 0 | +| 10 | `data` | `00000000` | `00` | Row 2, pixel 0: palette index 0 | +| 11 | `data` | `00000000` | `00` | Row 2, pixel 1: palette index 0 | +| 12 | `data` | `00000001` | `01` | Row 2, pixel 2: palette index 1 | + +The result is a diagonal drawn in palette entry 1 over a background of palette entry 0. + +**Example 5: Partial trailing byte** + +Configuration: `constant_height = 1`, `constant_bits_per_pixel = 2`. A 6 × 1 strip. 6 × 1 × 2 = 12 bits, so one whole byte plus 4 remainder bits. + +| Byte | Field | Binary | Hex | Description | +| ---- | ------- | ---------- | ---- | ---------------------------------------- | +| 1 | `width` | `00000110` | `06` | 6 pixels wide | +| 2 | `data` | `00011011` | `1B` | Pixels 0-3 | +| 3 | `data` | `00001001` | `09` | Pixels 4-5 in the low 4 bits | + +Pixel by pixel: + +| Pixel | Bits | Palette index | Location | +| ----- | ---- | ------------- | ------------------- | +| 0 | `11` | 3 | Byte 2, bits 1-0 | +| 1 | `10` | 2 | Byte 2, bits 3-2 | +| 2 | `01` | 1 | Byte 2, bits 5-4 | +| 3 | `00` | 0 | Byte 2, bits 7-6 | +| 4 | `01` | 1 | Byte 3, bits 1-0 | +| 5 | `10` | 2 | Byte 3, bits 3-2 | + +Byte 3 holds four used bits, so its value `0x09` stays within the `(1 << 4) - 1 = 0x0F` limit. In a compact file only those four bits are written and the next record begins mid-byte. + +## Complete Table Example + +The following byte sequence defines a Pixmap Table with two 5 × 3 pixmaps at 1 bit per pixel, all three dimensions fixed at the table level, linked to one Color Table: + +| Bytes | Binary | Hex | Description | +| ------- | ---------- | ---- | ---------------------------------------------------------------------------------------------- | +| 1 | `00000010` | `02` | Table identifier for Pixmap Table | +| 2 | `00000000` | `00` | Modifier flags: none set | +| 3 | `00000111` | `07` | Configuration flags: `use_constant_width`, `use_constant_height`, `use_constant_bits_per_pixel` | +| 4 | `00000101` | `05` | `constant_width` = 5 pixels | +| 5 | `00000011` | `03` | `constant_height` = 3 pixels | +| 6 | `00000001` | `01` | `constant_bits_per_pixel` = 1 | +| 7 | `00000001` | `01` | Table links: `link_color_tables` enabled | +| 8 | `00000001` | `01` | Color table array length = 1 | +| 9 | `00000000` | `00` | Link to Color Table at index 0 | +| 10 | `00000010` | `02` | Record count = 2 pixmaps | +| 11 | `10011111` | `9F` | Pixmap 0: pixels 0-7 | +| 12 | `00010000` | `10` | Pixmap 0: pixels 8-14 in the low 7 bits | +| 13 | `00100001` | `21` | Pixmap 1: pixels 0-7 | +| 14 | `01111100` | `7C` | Pixmap 1: pixels 8-14 in the low 7 bits | + +Pixmap 0 is the `T` shape from Example 2. Pixmap 1 unpacks to \ +`#....` \ +`#....` \ +`#####`,\ +an `L`. + +Bytes 12 and 14 each carry seven used bits. Assume the parent Layout has compact set to false, and therefore each data field is padded out to a full byte. In a compact file only the seven bits are written, so pixmap 1 and everything following it shifts by one bit. diff --git a/src/Table Architecture.md b/src/Table Architecture.md new file mode 100644 index 0000000..4b0b6ac --- /dev/null +++ b/src/Table Architecture.md @@ -0,0 +1,11 @@ +# Table Architecture + +SimplePixelFont uses tables to structure each component of your font in an expressive and modular way. Each table defines properties for a certain aspect of your font. A table consists of five sections: `identifier`, `modifiers`, `configurations`, `links`, and `records`. The following is a chart with explanations of what each section is for: + +| Section | Structure | +| ------- | ----- | +| `Identifier` | This is a single byte used by the parser to determine how to parse the table's data. | +| `Modifiers` | This is a single byte that behaves as a series of bit flags; each bit, if true, alters the data stored in the `Records` section. | +| `Configurations` | The first byte behaves as a series of bit flags; each bit, if true, allows a configuration value to be supplied after the first byte. Configurations are often used to supply values to each `Record`. The order of the supplied configuration values is based on the flags enabled, starting from the rightmost bit and skipping values for any flag not enabled. | +| `Links` | Similarly, the first byte is a flag byte; each bit, if true, allows you to specify a set of table links after the byte. Each set of table links uses the first byte to specify the length of the next array of links, and the following bytes correspond to the index of the table linked. | +| `Records` | This is the main data section of a table; it contains indexed sets of data referred to as records. The table type defines the structure that will be used by the records. | \ No newline at end of file diff --git a/vale.log b/vale.log new file mode 100644 index 0000000..db1f761 --- /dev/null +++ b/vale.log @@ -0,0 +1,204 @@ + {"message": "[write-good.Passive] 'is enabled' may be passive voice. Use active voice if you can.", "location": {"path": "snippets/character_table/configurations/condition/constant_codepoint_count.md", "range": {"start": {"line": 1, "column": 35}}}, "severity": "WARNING"} + {"message": "[Google.Passive] In general, use active voice instead of passive voice ('is enabled').", "location": {"path": "snippets/character_table/configurations/condition/constant_codepoint_count.md", "range": {"start": {"line": 1, "column": 35}}}, "severity": "INFO"} + {"message": "[write-good.E-Prime] Try to avoid using 'is'.", "location": {"path": "snippets/character_table/configurations/condition/constant_codepoint_count.md", "range": {"start": {"line": 1, "column": 35}}}, "severity": "INFO"} + {"message": "[Vale.Spelling] Did you really mean 'codepoint'?", "location": {"path": "snippets/character_table/configurations/brief/constant_codepoint_count.md", "range": {"start": {"line": 1, "column": 11}}}, "severity": "ERROR"} + {"message": "[Vale.Spelling] Did you really mean 'codepoints'?", "location": {"path": "snippets/character_table/configurations/flag/use_constant_codepoint_count.md", "range": {"start": {"line": 1, "column": 54}}}, "severity": "ERROR"} + {"message": "[Vale.Spelling] Did you really mean 'Pixmap'?", "location": {"path": "snippets/character_table/links/brief/pixmap_tables.md", "range": {"start": {"line": 1, "column": 11}}}, "severity": "ERROR"} + {"message": "[Google.Passive] In general, use active voice instead of passive voice ('is enabled').", "location": {"path": "snippets/character_table/links/condition/pixmap_tables.md", "range": {"start": {"line": 1, "column": 25}}}, "severity": "INFO"} + {"message": "[write-good.E-Prime] Try to avoid using 'is'.", "location": {"path": "snippets/character_table/links/condition/pixmap_tables.md", "range": {"start": {"line": 1, "column": 25}}}, "severity": "INFO"} + {"message": "[write-good.Passive] 'is enabled' may be passive voice. Use active voice if you can.", "location": {"path": "snippets/character_table/links/condition/pixmap_tables.md", "range": {"start": {"line": 1, "column": 25}}}, "severity": "WARNING"} + {"message": "[Vale.Spelling] Did you really mean 'codepoint'?", "location": {"path": "snippets/character_table/brief.md", "range": {"start": {"line": 1, "column": 32}}}, "severity": "ERROR"} + {"message": "[Google.Parens] Use parentheses judiciously.", "location": {"path": "snippets/character_table/brief.md", "range": {"start": {"line": 1, "column": 52}}}, "severity": "INFO"} + {"message": "[Vale.Spelling] Did you really mean 'pixmaps'?", "location": {"path": "snippets/character_table/brief.md", "range": {"start": {"line": 1, "column": 99}}}, "severity": "ERROR"} + {"message": "[Google.Headings] 'Use Cases' should use sentence-style capitalization.", "location": {"path": "snippets/character_table/brief.md", "range": {"start": {"line": 3, "column": 4}}}, "severity": "WARNING"} + {"message": "[Vale.Spelling] Did you really mean 'codepoints'?", "location": {"path": "snippets/character_table/brief.md", "range": {"start": {"line": 5, "column": 86}}}, "severity": "ERROR"} + {"message": "[Vale.Spelling] Did you really mean 'pixmap'?", "location": {"path": "snippets/character_table/brief.md", "range": {"start": {"line": 5, "column": 143}}}, "severity": "ERROR"} + {"message": "[Vale.Spelling] Did you really mean 'Pixmap'?", "location": {"path": "snippets/character_table/links/flag/link_pixmap_tables.md", "range": {"start": {"line": 1, "column": 33}}}, "severity": "ERROR"} + {"message": "[Vale.Spelling] Did you really mean 'pixmap'?", "location": {"path": "snippets/character_table/modifiers/brief/use_pixmap_index.md", "range": {"start": {"line": 1, "column": 71}}}, "severity": "ERROR"} + {"message": "[Vale.Spelling] Did you really mean 'Pixmap'?", "location": {"path": "snippets/character_table/modifiers/brief/use_pixmap_table_index.md", "range": {"start": {"line": 1, "column": 75}}}, "severity": "ERROR"} + {"message": "[Google.WordList] Use 'turn off' or 'off' instead of 'disabled'.", "location": {"path": "snippets/character_table/modifiers/details/use_pixmap_index.md", "range": {"start": {"line": 1, "column": 6}}}, "severity": "WARNING"} + {"message": "[Vale.Spelling] Did you really mean 'pixmap'?", "location": {"path": "snippets/character_table/modifiers/details/use_pixmap_index.md", "range": {"start": {"line": 1, "column": 20}}}, "severity": "ERROR"} + {"message": "[Google.Parens] Use parentheses judiciously.", "location": {"path": "snippets/character_table/modifiers/details/use_pixmap_index.md", "range": {"start": {"line": 1, "column": 78}}}, "severity": "INFO"} + {"message": "[Google.WordList] Use 'turn off' or 'off' instead of 'disabled'.", "location": {"path": "snippets/character_table/modifiers/details/use_advance_x.md", "range": {"start": {"line": 1, "column": 6}}}, "severity": "WARNING"} + {"message": "[write-good.E-Prime] Try to avoid using 'is'.", "location": {"path": "snippets/character_table/modifiers/details/use_advance_x.md", "range": {"start": {"line": 1, "column": 36}}}, "severity": "INFO"} + {"message": "[Vale.Spelling] Did you really mean 'pixmap's'?", "location": {"path": "snippets/character_table/modifiers/details/use_advance_x.md", "range": {"start": {"line": 1, "column": 43}}}, "severity": "ERROR"} + {"message": "[write-good.Passive] 'is added' may be passive voice. Use active voice if you can.", "location": {"path": "snippets/character_table/modifiers/details/use_advance_x.md", "range": {"start": {"line": 1, "column": 83}}}, "severity": "WARNING"} + {"message": "[Google.Passive] In general, use active voice instead of passive voice ('is added').", "location": {"path": "snippets/character_table/modifiers/details/use_advance_x.md", "range": {"start": {"line": 1, "column": 83}}}, "severity": "INFO"} + {"message": "[write-good.E-Prime] Try to avoid using 'is'.", "location": {"path": "snippets/character_table/modifiers/details/use_advance_x.md", "range": {"start": {"line": 1, "column": 83}}}, "severity": "INFO"} + {"message": "[write-good.E-Prime] Try to avoid using 'is'.", "location": {"path": "snippets/character_table/records/brief/pixmap_index.md", "range": {"start": {"line": 1, "column": 32}}}, "severity": "INFO"} + {"message": "[write-good.Passive] 'is enabled' may be passive voice. Use active voice if you can.", "location": {"path": "snippets/character_table/records/brief/pixmap_index.md", "range": {"start": {"line": 1, "column": 32}}}, "severity": "WARNING"} + {"message": "[Google.Passive] In general, use active voice instead of passive voice ('is enabled').", "location": {"path": "snippets/character_table/records/brief/pixmap_index.md", "range": {"start": {"line": 1, "column": 32}}}, "severity": "INFO"} + {"message": "[Google.Passive] In general, use active voice instead of passive voice ('is enabled').", "location": {"path": "snippets/character_table/records/brief/pixmap_table_index.md", "range": {"start": {"line": 1, "column": 38}}}, "severity": "INFO"} + {"message": "[write-good.E-Prime] Try to avoid using 'is'.", "location": {"path": "snippets/character_table/records/brief/pixmap_table_index.md", "range": {"start": {"line": 1, "column": 38}}}, "severity": "INFO"} + {"message": "[write-good.Passive] 'is enabled' may be passive voice. Use active voice if you can.", "location": {"path": "snippets/character_table/records/brief/pixmap_table_index.md", "range": {"start": {"line": 1, "column": 38}}}, "severity": "WARNING"} + {"message": "[Google.WordList] Use 'turn off' or 'off' instead of 'disabled'.", "location": {"path": "snippets/character_table/modifiers/details/use_pixmap_table_index.md", "range": {"start": {"line": 1, "column": 6}}}, "severity": "WARNING"} + {"message": "[Vale.Spelling] Did you really mean 'Pixmap'?", "location": {"path": "snippets/character_table/modifiers/details/use_pixmap_table_index.md", "range": {"start": {"line": 1, "column": 45}}}, "severity": "ERROR"} + {"message": "[Vale.Spelling] Did you really mean 'pixmap'?", "location": {"path": "snippets/character_table/modifiers/details/use_pixmap_table_index.md", "range": {"start": {"line": 1, "column": 90}}}, "severity": "ERROR"} + {"message": "[Vale.Spelling] Did you really mean 'pixmap'?", "location": {"path": "snippets/character_table/modifiers/details/use_pixmap_table_index.md", "range": {"start": {"line": 1, "column": 133}}}, "severity": "ERROR"} + {"message": "[Google.Will] Avoid using 'will'.", "location": {"path": "snippets/character_table/modifiers/details/use_pixmap_table_index.md", "range": {"start": {"line": 1, "column": 147}}}, "severity": "WARNING"} + {"message": "[write-good.E-Prime] Try to avoid using 'is'.", "location": {"path": "snippets/character_table/records/condition/advance_x.md", "range": {"start": {"line": 1, "column": 29}}}, "severity": "INFO"} + {"message": "[write-good.Passive] 'is enabled' may be passive voice. Use active voice if you can.", "location": {"path": "snippets/character_table/records/condition/advance_x.md", "range": {"start": {"line": 1, "column": 29}}}, "severity": "WARNING"} + {"message": "[Google.Passive] In general, use active voice instead of passive voice ('is enabled').", "location": {"path": "snippets/character_table/records/condition/advance_x.md", "range": {"start": {"line": 1, "column": 29}}}, "severity": "INFO"} + {"message": "[Google.Parens] Use parentheses judiciously.", "location": {"path": "snippets/character_table/records/condition/codepoints.md", "range": {"start": {"line": 1, "column": 1}}}, "severity": "INFO"} + {"message": "[Vale.Spelling] Did you really mean 'codepoint'?", "location": {"path": "snippets/character_table/records/condition/codepoints.md", "range": {"start": {"line": 1, "column": 15}}}, "severity": "ERROR"} + {"message": "[Google.Passive] In general, use active voice instead of passive voice ('is set').", "location": {"path": "snippets/character_table/records/condition/codepoints.md", "range": {"start": {"line": 1, "column": 85}}}, "severity": "INFO"} + {"message": "[write-good.E-Prime] Try to avoid using 'is'.", "location": {"path": "snippets/character_table/records/condition/codepoints.md", "range": {"start": {"line": 1, "column": 85}}}, "severity": "INFO"} + {"message": "[write-good.Passive] 'is set' may be passive voice. Use active voice if you can.", "location": {"path": "snippets/character_table/records/condition/codepoints.md", "range": {"start": {"line": 1, "column": 85}}}, "severity": "WARNING"} + {"message": "[Vale.Spelling] Did you really mean 'pixmap'?", "location": {"path": "snippets/character_table/records/condition/pixmap_index.md", "range": {"start": {"line": 1, "column": 14}}}, "severity": "ERROR"} + {"message": "[Vale.Spelling] Did you really mean 'Pixmap'?", "location": {"path": "snippets/character_table/records/condition/pixmap_index.md", "range": {"start": {"line": 1, "column": 43}}}, "severity": "ERROR"} + {"message": "[Google.OptionalPlurals] Don't use plurals in parentheses such as in 'Table(s)'.", "location": {"path": "snippets/character_table/records/condition/pixmap_index.md", "range": {"start": {"line": 1, "column": 50}}}, "severity": "ERROR"} + {"message": "[Google.Parens] Use parentheses judiciously.", "location": {"path": "snippets/character_table/records/condition/pixmap_index.md", "range": {"start": {"line": 1, "column": 55}}}, "severity": "INFO"} + {"message": "[Vale.Spelling] Did you really mean 'Pixmap'?", "location": {"path": "snippets/character_table/records/condition/pixmap_table_index.md", "range": {"start": {"line": 1, "column": 23}}}, "severity": "ERROR"} + {"message": "[Google.Headings] 'constant_alpha' should use sentence-style capitalization.", "location": {"path": "snippets/color_table/configurations/brief/constant_alpha.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "WARNING"} + {"message": "[Vale.Spelling] Did you really mean 'constant_alpha'?", "location": {"path": "snippets/color_table/configurations/brief/constant_alpha.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "ERROR"} + {"message": "[Vale.Spelling] Did you really mean 'constant_alpha'?", "location": {"path": "snippets/color_table/configurations/brief/constant_alpha.md", "range": {"start": {"line": 3, "column": 37}}}, "severity": "ERROR"} + {"message": "[Google.Headings] 'color_table table' should use sentence-style capitalization.", "location": {"path": "snippets/color_table/brief.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "WARNING"} + {"message": "[Vale.Spelling] Did you really mean 'color_table'?", "location": {"path": "snippets/color_table/brief.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "ERROR"} + {"message": "[Vale.Spelling] Did you really mean 'color_table'?", "location": {"path": "snippets/color_table/brief.md", "range": {"start": {"line": 3, "column": 37}}}, "severity": "ERROR"} + {"message": "[Vale.Spelling] Did you really mean 'use_color_type'?", "location": {"path": "snippets/color_table/modifiers/brief/use_color_type.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "ERROR"} + {"message": "[Google.Headings] 'use_color_type' should use sentence-style capitalization.", "location": {"path": "snippets/color_table/modifiers/brief/use_color_type.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "WARNING"} + {"message": "[Vale.Spelling] Did you really mean 'use_color_type'?", "location": {"path": "snippets/color_table/modifiers/brief/use_color_type.md", "range": {"start": {"line": 3, "column": 37}}}, "severity": "ERROR"} + {"message": "[Vale.Spelling] Did you really mean 'use_color_type'?", "location": {"path": "snippets/color_table/modifiers/details/use_color_type.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "ERROR"} + {"message": "[Google.Headings] 'use_color_type details' should use sentence-style capitalization.", "location": {"path": "snippets/color_table/modifiers/details/use_color_type.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "WARNING"} + {"message": "[Vale.Spelling] Did you really mean 'use_color_type'?", "location": {"path": "snippets/color_table/modifiers/details/use_color_type.md", "range": {"start": {"line": 3, "column": 37}}}, "severity": "ERROR"} + {"message": "[Google.Headings] 'alpha' should use sentence-style capitalization.", "location": {"path": "snippets/color_table/records/brief/alpha.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "WARNING"} + {"message": "[Google.Headings] 'blue' should use sentence-style capitalization.", "location": {"path": "snippets/color_table/records/brief/blue.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "WARNING"} + {"message": "[Google.Headings] 'color_type' should use sentence-style capitalization.", "location": {"path": "snippets/color_table/records/brief/color_type.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "WARNING"} + {"message": "[Vale.Spelling] Did you really mean 'color_type'?", "location": {"path": "snippets/color_table/records/brief/color_type.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "ERROR"} + {"message": "[Vale.Spelling] Did you really mean 'color_type'?", "location": {"path": "snippets/color_table/records/brief/color_type.md", "range": {"start": {"line": 3, "column": 37}}}, "severity": "ERROR"} + {"message": "[Google.Headings] 'green' should use sentence-style capitalization.", "location": {"path": "snippets/color_table/records/brief/green.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "WARNING"} + {"message": "[Google.Headings] 'red' should use sentence-style capitalization.", "location": {"path": "snippets/color_table/records/brief/red.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "WARNING"} + {"message": "[Google.Headings] 'font_table table' should use sentence-style capitalization.", "location": {"path": "snippets/font_table/brief.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "WARNING"} + {"message": "[Vale.Spelling] Did you really mean 'font_table'?", "location": {"path": "snippets/font_table/brief.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "ERROR"} + {"message": "[Vale.Spelling] Did you really mean 'font_table'?", "location": {"path": "snippets/font_table/brief.md", "range": {"start": {"line": 3, "column": 37}}}, "severity": "ERROR"} + {"message": "[Google.Headings] 'author' should use sentence-style capitalization.", "location": {"path": "snippets/font_table/records/brief/author.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "WARNING"} + {"message": "[Google.Headings] 'character_tables' should use sentence-style capitalization.", "location": {"path": "snippets/font_table/links/brief/character_tables.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "WARNING"} + {"message": "[Vale.Spelling] Did you really mean 'character_tables'?", "location": {"path": "snippets/font_table/links/brief/character_tables.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "ERROR"} + {"message": "[Vale.Spelling] Did you really mean 'character_tables'?", "location": {"path": "snippets/font_table/links/brief/character_tables.md", "range": {"start": {"line": 3, "column": 37}}}, "severity": "ERROR"} + {"message": "[Vale.Spelling] Did you really mean 'character_table_indexes'?", "location": {"path": "snippets/font_table/records/brief/character_table_indexes.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "ERROR"} + {"message": "[Google.Headings] 'character_table_indexes' should use sentence-style capitalization.", "location": {"path": "snippets/font_table/records/brief/character_table_indexes.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "WARNING"} + {"message": "[Vale.Spelling] Did you really mean 'character_table_indexes'?", "location": {"path": "snippets/font_table/records/brief/character_table_indexes.md", "range": {"start": {"line": 3, "column": 37}}}, "severity": "ERROR"} + {"message": "[Google.Headings] 'font_type' should use sentence-style capitalization.", "location": {"path": "snippets/font_table/records/brief/font_type.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "WARNING"} + {"message": "[Vale.Spelling] Did you really mean 'font_type'?", "location": {"path": "snippets/font_table/records/brief/font_type.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "ERROR"} + {"message": "[Vale.Spelling] Did you really mean 'font_type'?", "location": {"path": "snippets/font_table/records/brief/font_type.md", "range": {"start": {"line": 3, "column": 37}}}, "severity": "ERROR"} + {"message": "[Google.Headings] 'version' should use sentence-style capitalization.", "location": {"path": "snippets/font_table/records/brief/version.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "WARNING"} + {"message": "[Vale.Spelling] Did you really mean 'pixmap_table'?", "location": {"path": "snippets/pixmap_table/brief.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "ERROR"} + {"message": "[Google.Headings] 'pixmap_table table' should use sentence-style capitalization.", "location": {"path": "snippets/pixmap_table/brief.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "WARNING"} + {"message": "[Vale.Spelling] Did you really mean 'pixmap_table'?", "location": {"path": "snippets/pixmap_table/brief.md", "range": {"start": {"line": 3, "column": 37}}}, "severity": "ERROR"} + {"message": "[Google.Headings] 'name' should use sentence-style capitalization.", "location": {"path": "snippets/font_table/records/brief/name.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "WARNING"} + {"message": "[Vale.Spelling] Did you really mean 'constant_bits_per_pixel'?", "location": {"path": "snippets/pixmap_table/configurations/brief/constant_bits_per_pixel.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "ERROR"} + {"message": "[Google.Headings] 'constant_bits_per_pixel' should use sentence-style capitalization.", "location": {"path": "snippets/pixmap_table/configurations/brief/constant_bits_per_pixel.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "WARNING"} + {"message": "[Vale.Spelling] Did you really mean 'constant_bits_per_pixel'?", "location": {"path": "snippets/pixmap_table/configurations/brief/constant_bits_per_pixel.md", "range": {"start": {"line": 3, "column": 37}}}, "severity": "ERROR"} + {"message": "[Vale.Spelling] Did you really mean 'constant_height'?", "location": {"path": "snippets/pixmap_table/configurations/brief/constant_height.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "ERROR"} + {"message": "[Google.Headings] 'constant_height' should use sentence-style capitalization.", "location": {"path": "snippets/pixmap_table/configurations/brief/constant_height.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "WARNING"} + {"message": "[Vale.Spelling] Did you really mean 'constant_height'?", "location": {"path": "snippets/pixmap_table/configurations/brief/constant_height.md", "range": {"start": {"line": 3, "column": 37}}}, "severity": "ERROR"} + {"message": "[Vale.Spelling] Did you really mean 'bits_per_pixel'?", "location": {"path": "snippets/pixmap_table/records/brief/bits_per_pixel.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "ERROR"} + {"message": "[Google.Headings] 'bits_per_pixel' should use sentence-style capitalization.", "location": {"path": "snippets/pixmap_table/records/brief/bits_per_pixel.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "WARNING"} + {"message": "[Vale.Spelling] Did you really mean 'bits_per_pixel'?", "location": {"path": "snippets/pixmap_table/records/brief/bits_per_pixel.md", "range": {"start": {"line": 3, "column": 37}}}, "severity": "ERROR"} + {"message": "[Google.Headings] 'constant_width' should use sentence-style capitalization.", "location": {"path": "snippets/pixmap_table/configurations/brief/constant_width.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "WARNING"} + {"message": "[Vale.Spelling] Did you really mean 'constant_width'?", "location": {"path": "snippets/pixmap_table/configurations/brief/constant_width.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "ERROR"} + {"message": "[Vale.Spelling] Did you really mean 'constant_width'?", "location": {"path": "snippets/pixmap_table/configurations/brief/constant_width.md", "range": {"start": {"line": 3, "column": 37}}}, "severity": "ERROR"} + {"message": "[Google.Headings] 'data' should use sentence-style capitalization.", "location": {"path": "snippets/pixmap_table/records/brief/data.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "WARNING"} + {"message": "[Google.Headings] 'height' should use sentence-style capitalization.", "location": {"path": "snippets/pixmap_table/records/brief/height.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "WARNING"} + {"message": "[Vale.Spelling] Did you really mean 'color_tables'?", "location": {"path": "snippets/pixmap_table/links/brief/color_tables.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "ERROR"} + {"message": "[Google.Headings] 'color_tables' should use sentence-style capitalization.", "location": {"path": "snippets/pixmap_table/links/brief/color_tables.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "WARNING"} + {"message": "[Vale.Spelling] Did you really mean 'color_tables'?", "location": {"path": "snippets/pixmap_table/links/brief/color_tables.md", "range": {"start": {"line": 3, "column": 37}}}, "severity": "ERROR"} + {"message": "[Google.Headings] 'width' should use sentence-style capitalization.", "location": {"path": "snippets/pixmap_table/records/brief/width.md", "range": {"start": {"line": 1, "column": 3}}}, "severity": "WARNING"} + {"message": "[Vale.Spelling] Did you really mean 'Suchow'?", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 1, "column": 31}}}, "severity": "ERROR"} + {"message": "[Google.OxfordComma] Use the Oxford comma in 'Redistribution and use in source and binary forms, with or'.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 4, "column": 1}}}, "severity": "WARNING"} + {"message": "[write-good.Passive] 'are permitted' may be passive voice. Use active voice if you can.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 4, "column": 82}}}, "severity": "WARNING"} + {"message": "[Google.Passive] In general, use active voice instead of passive voice ('are permitted').", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 4, "column": 82}}}, "severity": "INFO"} + {"message": "[write-good.E-Prime] Try to avoid using 'are'.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 4, "column": 82}}}, "severity": "INFO"} + {"message": "[write-good.TooWordy] 'provided that' is too wordy.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 4, "column": 96}}}, "severity": "WARNING"} + {"message": "[write-good.Passive] 'are met' may be passive voice. Use active voice if you can.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 4, "column": 135}}}, "severity": "WARNING"} + {"message": "[Google.Passive] In general, use active voice instead of passive voice ('are met').", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 4, "column": 135}}}, "severity": "INFO"} + {"message": "[write-good.E-Prime] Try to avoid using 'are'.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 4, "column": 135}}}, "severity": "INFO"} + {"message": "[Vale.Spelling] Did you really mean 'Redistributions'?", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 6, "column": 4}}}, "severity": "ERROR"} + {"message": "[write-good.TooWordy] 'retain' is too wordy.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 6, "column": 40}}}, "severity": "WARNING"} + {"message": "[Google.WordList] Use 'preceding' instead of 'above'.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 6, "column": 51}}}, "severity": "WARNING"} + {"message": "[Vale.Spelling] Did you really mean 'Redistributions'?", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 8, "column": 4}}}, "severity": "ERROR"} + {"message": "[Google.WordList] Use 'preceding' instead of 'above'.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 8, "column": 54}}}, "severity": "WARNING"} + {"message": "[write-good.Passive] 'be used' may be passive voice. Use active voice if you can.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 10, "column": 83}}}, "severity": "WARNING"} + {"message": "[write-good.E-Prime] Try to avoid using 'be'.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 10, "column": 83}}}, "severity": "INFO"} + {"message": "[Google.Passive] In general, use active voice instead of passive voice ('be used').", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 10, "column": 83}}}, "severity": "INFO"} + {"message": "[Google.Acronyms] Spell out 'THIS', if it's unfamiliar to the audience.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 1}}}, "severity": "INFO"} + {"message": "[write-good.Passive] 'IS PROVIDED' may be passive voice. Use active voice if you can.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 15}}}, "severity": "WARNING"} + {"message": "[Google.Passive] In general, use active voice instead of passive voice ('IS PROVIDED').", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 15}}}, "severity": "INFO"} + {"message": "[write-good.E-Prime] Try to avoid using 'IS'.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 15}}}, "severity": "INFO"} + {"message": "[Google.Acronyms] Spell out 'THE', if it's unfamiliar to the audience.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 30}}}, "severity": "INFO"} + {"message": "[Google.Acronyms] Spell out 'AND', if it's unfamiliar to the audience.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 52}}}, "severity": "INFO"} + {"message": "[Google.Acronyms] Spell out 'AND', if it's unfamiliar to the audience.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 77}}}, "severity": "INFO"} + {"message": "[Google.Acronyms] Spell out 'ANY', if it's unfamiliar to the audience.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 81}}}, "severity": "INFO"} + {"message": "[Google.Acronyms] Spell out 'BUT', if it's unfamiliar to the audience.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 127}}}, "severity": "INFO"} + {"message": "[Google.Acronyms] Spell out 'NOT', if it's unfamiliar to the audience.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 131}}}, "severity": "INFO"} + {"message": "[Google.Acronyms] Spell out 'THE', if it's unfamiliar to the audience.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 147}}}, "severity": "INFO"} + {"message": "[Google.Acronyms] Spell out 'AND', if it's unfamiliar to the audience.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 189}}}, "severity": "INFO"} + {"message": "[Google.Acronyms] Spell out 'FOR', if it's unfamiliar to the audience.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 201}}}, "severity": "INFO"} + {"message": "[Google.Passive] In general, use active voice instead of passive voice ('ARE DISCLAIMED').", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 226}}}, "severity": "INFO"} + {"message": "[write-good.E-Prime] Try to avoid using 'ARE'.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 226}}}, "severity": "INFO"} + {"message": "[write-good.Passive] 'ARE DISCLAIMED' may be passive voice. Use active voice if you can.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 226}}}, "severity": "WARNING"} + {"message": "[Google.Acronyms] Spell out 'ARE', if it's unfamiliar to the audience.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 226}}}, "severity": "INFO"} + {"message": "[Google.Acronyms] Spell out 'EVENT', if it's unfamiliar to the audience.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 248}}}, "severity": "INFO"} + {"message": "[write-good.TooWordy] 'SHALL' is too wordy.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 254}}}, "severity": "WARNING"} + {"message": "[Google.Acronyms] Spell out 'SHALL', if it's unfamiliar to the audience.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 254}}}, "severity": "INFO"} + {"message": "[Google.Acronyms] Spell out 'THE', if it's unfamiliar to the audience.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 260}}}, "severity": "INFO"} + {"message": "[write-good.E-Prime] Try to avoid using 'BE'.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 297}}}, "severity": "INFO"} + {"message": "[Google.Acronyms] Spell out 'FOR', if it's unfamiliar to the audience.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 307}}}, "severity": "INFO"} + {"message": "[Google.Acronyms] Spell out 'ANY', if it's unfamiliar to the audience.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 311}}}, "severity": "INFO"} + {"message": "[Google.Parens] Use parentheses judiciously.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 390}}}, "severity": "INFO"} + {"message": "[Google.Acronyms] Spell out 'NOT', if it's unfamiliar to the audience.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 406}}}, "severity": "INFO"} + {"message": "[Google.Acronyms] Spell out 'GOODS', if it's unfamiliar to the audience.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 448}}}, "severity": "INFO"} + {"message": "[Google.Semicolons] Use semicolons judiciously.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 465}}}, "severity": "INFO"} + {"message": "[Google.Acronyms] Spell out 'LOSS', if it's unfamiliar to the audience.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 467}}}, "severity": "INFO"} + {"message": "[Google.Acronyms] Spell out 'USE', if it's unfamiliar to the audience.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 475}}}, "severity": "INFO"} + {"message": "[Google.Acronyms] Spell out 'DATA', if it's unfamiliar to the audience.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 480}}}, "severity": "INFO"} + {"message": "[Google.Semicolons] Use semicolons judiciously.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 496}}}, "severity": "INFO"} + {"message": "[write-good.TooWordy] 'HOWEVER' is too wordy.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 524}}}, "severity": "WARNING"} + {"message": "[Google.Acronyms] Spell out 'AND', if it's unfamiliar to the audience.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 539}}}, "severity": "INFO"} + {"message": "[Google.Acronyms] Spell out 'ANY', if it's unfamiliar to the audience.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 546}}}, "severity": "INFO"} + {"message": "[Google.Acronyms] Spell out 'TORT', if it's unfamiliar to the audience.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 613}}}, "severity": "INFO"} + {"message": "[Google.Acronyms] Spell out 'ANY', if it's unfamiliar to the audience.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 665}}}, "severity": "INFO"} + {"message": "[Google.Acronyms] Spell out 'WAY', if it's unfamiliar to the audience.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 669}}}, "severity": "INFO"} + {"message": "[Google.Acronyms] Spell out 'OUT', if it's unfamiliar to the audience.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 673}}}, "severity": "INFO"} + {"message": "[Google.Acronyms] Spell out 'THE', if it's unfamiliar to the audience.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 680}}}, "severity": "INFO"} + {"message": "[Google.Acronyms] Spell out 'USE', if it's unfamiliar to the audience.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 684}}}, "severity": "INFO"} + {"message": "[Google.Acronyms] Spell out 'THIS', if it's unfamiliar to the audience.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 691}}}, "severity": "INFO"} + {"message": "[Google.Acronyms] Spell out 'EVEN', if it's unfamiliar to the audience.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 706}}}, "severity": "INFO"} + {"message": "[Google.Acronyms] Spell out 'SUCH', if it's unfamiliar to the audience.", "location": {"path": ".ci/styles/proselint/README.md", "range": {"start": {"line": 12, "column": 744}}}, "severity": "INFO"} + {"message": "[Vale.Spelling] Did you really mean 'bitflags'?", "location": {"path": "src/Specification Glossary.md", "range": {"start": {"line": 3, "column": 31}}}, "severity": "ERROR"} + {"message": "[Vale.Spelling] Did you really mean 'Serializer'?", "location": {"path": "src/Specification Glossary.md", "range": {"start": {"line": 5, "column": 3}}}, "severity": "ERROR"} + {"message": "[Google.WordList] Use 'capability' or 'feature' instead of 'functionality'.", "location": {"path": "src/Specification Glossary.md", "range": {"start": {"line": 5, "column": 30}}}, "severity": "WARNING"} + {"message": "[Google.WordList] Use 'app' instead of 'application'.", "location": {"path": "src/Specification Glossary.md", "range": {"start": {"line": 5, "column": 50}}}, "severity": "WARNING"} + {"message": "[Vale.Spelling] Did you really mean 'Deserializer'?", "location": {"path": "src/Specification Glossary.md", "range": {"start": {"line": 7, "column": 3}}}, "severity": "ERROR"} + {"message": "[Google.WordList] Use 'capability' or 'feature' instead of 'functionality'.", "location": {"path": "src/Specification Glossary.md", "range": {"start": {"line": 7, "column": 32}}}, "severity": "WARNING"} + {"message": "[Google.WordList] Use 'app' instead of 'application'.", "location": {"path": "src/Specification Glossary.md", "range": {"start": {"line": 7, "column": 52}}}, "severity": "WARNING"} + {"message": "[Google.Headings] 'Table Structure' should use sentence-style capitalization.", "location": {"path": "src/Character Table.md", "range": {"start": {"line": 3, "column": 4}}}, "severity": "WARNING"} + {"message": "[Google.Headings] 'Modifier Flags' should use sentence-style capitalization.", "location": {"path": "src/Character Table.md", "range": {"start": {"line": 8, "column": 5}}}, "severity": "WARNING"} + {"message": "[Google.Headings] 'Flag Details' should use sentence-style capitalization.", "location": {"path": "src/Character Table.md", "range": {"start": {"line": 17, "column": 6}}}, "severity": "WARNING"} + {"message": "[Google.Headings] 'Configuration Flags' should use sentence-style capitalization.", "location": {"path": "src/Character Table.md", "range": {"start": {"line": 23, "column": 5}}}, "severity": "WARNING"} + {"message": "[Google.Headings] 'Configuration Values' should use sentence-style capitalization.", "location": {"path": "src/Character Table.md", "range": {"start": {"line": 30, "column": 6}}}, "severity": "WARNING"} + {"message": "[Google.Headings] 'Table Links' should use sentence-style capitalization.", "location": {"path": "src/Character Table.md", "range": {"start": {"line": 36, "column": 5}}}, "severity": "WARNING"} + {"message": "[Google.Headings] 'Link Arrays' should use sentence-style capitalization.", "location": {"path": "src/Character Table.md", "range": {"start": {"line": 43, "column": 6}}}, "severity": "WARNING"} + {"message": "[Google.Headings] 'Character Record' should use sentence-style capitalization.", "location": {"path": "src/Character Table.md", "range": {"start": {"line": 49, "column": 4}}}, "severity": "WARNING"} + {"message": "[Google.Headings] 'Record Layout Examples' should use sentence-style capitalization.", "location": {"path": "src/Character Table.md", "range": {"start": {"line": 60, "column": 5}}}, "severity": "WARNING"} + {"message": "[Google.Colons] ': M' should be in lowercase.", "location": {"path": "src/Character Table.md", "range": {"start": {"line": 62, "column": 12}}}, "severity": "WARNING"} + {"message": "[Google.Parens] Use parentheses judiciously.", "location": {"path": "src/Character Table.md", "range": {"start": {"line": 62, "column": 31}}}, "severity": "INFO"} + {"message": "[Google.Colons] ': W' should be in lowercase.", "location": {"path": "src/Character Table.md", "range": {"start": {"line": 72, "column": 12}}}, "severity": "WARNING"} + {"message": "[Google.Colons] ': W' should be in lowercase.", "location": {"path": "src/Character Table.md", "range": {"start": {"line": 82, "column": 12}}}, "severity": "WARNING"} + {"message": "[Vale.Spelling] Did you really mean 'pixmap'?", "location": {"path": "src/Character Table.md", "range": {"start": {"line": 82, "column": 19}}}, "severity": "ERROR"} + {"message": "[Google.Colons] ': W' should be in lowercase.", "location": {"path": "src/Character Table.md", "range": {"start": {"line": 92, "column": 12}}}, "severity": "WARNING"} + {"message": "[Google.Colons] ': W' should be in lowercase.", "location": {"path": "src/Character Table.md", "range": {"start": {"line": 102, "column": 12}}}, "severity": "WARNING"} + {"message": "[Vale.Spelling] Did you really mean 'codepoints'?", "location": {"path": "src/Character Table.md", "range": {"start": {"line": 102, "column": 36}}}, "severity": "ERROR"} + {"message": "[Google.Headings] 'Complete Table Example' should use sentence-style capitalization.", "location": {"path": "src/Character Table.md", "range": {"start": {"line": 113, "column": 4}}}, "severity": "WARNING"} + {"message": "[Google.Parens] Use parentheses judiciously.", "location": {"path": "src/Character Table.md", "range": {"start": {"line": 115, "column": 83}}}, "severity": "INFO"} + {"message": "[Vale.Spelling] Did you really mean 'Pixmap'?", "location": {"path": "src/Character Table.md", "range": {"start": {"line": 115, "column": 145}}}, "severity": "ERROR"} + {"message": "[Google.OptionalPlurals] Don't use plurals in parentheses such as in 'Byte(s)'.", "location": {"path": "src/Character Table.md", "range": {"start": {"line": 117, "column": 3}}}, "severity": "ERROR"} + {"message": "[Google.Parens] Use parentheses judiciously.", "location": {"path": "src/Character Table.md", "range": {"start": {"line": 117, "column": 7}}}, "severity": "INFO"} + {"message": "[Vale.Spelling] Did you really mean 'Pixmap'?", "location": {"path": "src/Character Table.md", "range": {"start": {"line": 124, "column": 33}}}, "severity": "ERROR"} + {"message": "[Vale.Spelling] Did you really mean 'Pixmap'?", "location": {"path": "src/Character Table.md", "range": {"start": {"line": 125, "column": 41}}}, "severity": "ERROR"} + {"message": "[Vale.Spelling] Did you really mean 'advance_x'?", "location": {"path": "src/Character Table.md", "range": {"start": {"line": 127, "column": 43}}}, "severity": "ERROR"} + {"message": "[Vale.Spelling] Did you really mean 'pixmap_index'?", "location": {"path": "src/Character Table.md", "range": {"start": {"line": 128, "column": 43}}}, "severity": "ERROR"} + {"message": "[Vale.Spelling] Did you really mean 'codepoints'?", "location": {"path": "src/Character Table.md", "range": {"start": {"line": 129, "column": 43}}}, "severity": "ERROR"} + {"message": "[Vale.Spelling] Did you really mean 'advance_x'?", "location": {"path": "src/Character Table.md", "range": {"start": {"line": 130, "column": 43}}}, "severity": "ERROR"} + {"message": "[Vale.Spelling] Did you really mean 'pixmap_index'?", "location": {"path": "src/Character Table.md", "range": {"start": {"line": 131, "column": 43}}}, "severity": "ERROR"} + {"message": "[Vale.Spelling] Did you really mean 'codepoints'?", "location": {"path": "src/Character Table.md", "range": {"start": {"line": 132, "column": 43}}}, "severity": "ERROR"}