{"id":13760750,"url":"https://github.com/viresh-ratnakar/exolve","last_synced_at":"2025-05-10T11:31:42.111Z","repository":{"id":40002677,"uuid":"195445224","full_name":"viresh-ratnakar/exolve","owner":"viresh-ratnakar","description":"Online interactive crossword software in JavaScript","archived":false,"fork":false,"pushed_at":"2025-04-26T00:46:26.000Z","size":3063,"stargazers_count":78,"open_issues_count":4,"forks_count":16,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-04-26T01:38:18.404Z","etag":null,"topics":["clues","configurable","crossword","crosswords","grid","interactive","javascript","multilingual","open","player","puzzle","software","solver","source","web"],"latest_commit_sha":null,"homepage":"","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/viresh-ratnakar.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2019-07-05T17:21:40.000Z","updated_at":"2025-04-26T00:46:29.000Z","dependencies_parsed_at":"2024-01-15T03:57:25.284Z","dependency_job_id":"6dde74e5-3280-4eda-a7ba-647c80b3315b","html_url":"https://github.com/viresh-ratnakar/exolve","commit_stats":null,"previous_names":[],"tags_count":17,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/viresh-ratnakar%2Fexolve","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/viresh-ratnakar%2Fexolve/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/viresh-ratnakar%2Fexolve/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/viresh-ratnakar%2Fexolve/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/viresh-ratnakar","download_url":"https://codeload.github.com/viresh-ratnakar/exolve/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253410642,"owners_count":21904129,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["clues","configurable","crossword","crosswords","grid","interactive","javascript","multilingual","open","player","puzzle","software","solver","source","web"],"created_at":"2024-08-03T13:01:20.265Z","updated_at":"2025-05-10T11:31:42.096Z","avatar_url":"https://github.com/viresh-ratnakar.png","language":"HTML","funding_links":[],"categories":["HTML"],"sub_categories":[],"readme":"# Exolve\n\n## An Easily Configurable Interactive Crossword Solver\n\n### Version: Exolve v1.62, April 25, 2025\n\nExolve can help you create online interactively solvable crosswords (simple\nones with blocks and/or bars as well as those that are jumbles or are\ndiagramless or are 3-D, etc.) in any language.\n\nThe file [exolve.html](exolve.html) contains *all* the code you need: just\nmake a copy and then replace the part that contains the example grid with your\nown puzzle specification, starting at the `exolve-begin` line and ending at the\n`exolve-end` line.\n\nThe files [exolve-m.html](exolve-m.html), [exolve-m.css](exolve-m.css),\n[exolve-m.js](exolve-m.js) have the same  content as\n[exolve.html](exolve.html), except that it is split into separate parts: HTML\n(including the puzzle specification), CSS, and JavaScript. This allows the\nJavaScript and CSS to be reused across multiple puzzles.\n\nAnother simple option is to just use the\n[exolve-m-simple.html](exolve-m-simple.html) file: this is essentially a copy\nof [exolve-m.html](exolve-m.html), but it does not require you to host the\n[exolve-m.css](exolve-m.css) and [exolve-m.js](exolve-m.js) files, as it\nlinks to their latest copies on a website that I maintain, hosted on GitHub.\n\nYet another option is to embed the Exolve puzzle within arbitrary web pages\n(like blog posts) in a \"widget\". See the details in the\n[Exolve widget](#exolve-widget) section.\n\nThe [Exolve Player](https://exolve.app) web app can be used to play crossword\nfiles in several formats (including .puz and even just the clues copied from\na PDF in many cases). An easy-to-remember URL for this web app is\n[exolve.app](https://exolve.app).\n\nYou can also use the file [exolve-embedder.html](exolve-embedder.html) to\nserve .puz and .ipuz files using Exolve. See the details in the\n[Exolve Embedder](#exolve-embedder) section.\n\nHere is an example of the puzzle specification:\n\n```\nexolve-begin\n  exolve-width: 5\n  exolve-height: 5\n  exolve-grid:\n    HELLO\n    O.A.L\n    WORLD\n    L.G.E\n    STEER\n  exolve-across:\n    1 Greeting (5)\n    4 Earth (5)\n    5 Guide (5)\n  exolve-down:\n    1 Emits cry (5)\n    2 Big (5)\n    3 More ancient (5)\nexolve-end\n```\n\nThe format is very simple and uses plain text (but the parsing code is\nalso occasionally simplistic and not very forgiving, so please go through the\nformat documentation). The setter has the option to provide solutions (as in the\nexample above), or to just use 0 to indicate a square that needs to be filled\n(i.e., is a part of a \"light,\" in crossword terms).\n\nA few example puzzles are also included in this directory, each in a file with\nthe \".exolve\" extension. These showcase some of the available features, such as\nninas, additional clues or questions, submission, barred puzzles, diagramless\npuzzles, etc. To try one of these, create a copy of [exolve.html](exolve.html)\nand edit it as described above, splicing in the whole .exolve file from\n`exolve-begin` to `exolve-end`. A whole suite of test-\\*.html files is also\navailable in this directory. I use them to test new releases, but you can use\nthem to see examples of usage of most Exolve features.\n\n## Controls\nThe basic control is to click on a square and enter a letter in it. If a square\nis a part of both an across clue and a down clue, then clicking on that square\nwhile it is the current square (or pressing the Enter key) will toggle the\nactive direction (unless the shift key is also pressed with a click, in which\ncase no directon-toggling will happen, which is useful when navigating back\nto the grid from some other input element).\n\nThe control buttons (*Clear this*, *Clear all!*, *Check this*, *Check all!*,\n*Reveal this*, and *Reveal all!*) work as suggested by their names (\"this\"\nrefers to the currently selected light(s)). You can click on a clue to jump to\nits squares. If the setter has not provided all solutions, then only the\n\"Clear this/all\" control buttons are shown, the \"Check/Reveal\" buttons do not\nget shown.\n\nThe \"Clear this\" button at first only clears letters that do not cross other\nfully filled lights, if there are any. If there are none (i.e., if all remaining\nletters in the current light also cross other fully filled lights), only then\nwill these remaining letters get cleared.\n\nA long click on either of \"Check this\" or \"Reveal this\" will toggle the text\n\"this\" to \"cell,\" and the checking/revealing will then only happen on the\ncurrent cell (as opposed to the whole light), for that particular activation\nof the button. Caveat: this does not seem to work on phones and tablets (only\ntested on Android devices though).\n\nSetters can use [`exolve-option`](#exolve-option) `show-cell-level-buttons`\nto additionally show an extra row of buttons containing these two cell-level\nbuttons: \"Check cell\" and \"Reveal cell.\"\n\nExolve supports diagramless puzzles, where the blocked squares are not\nidentified and the solver has to figure out their locations. In fact, exolve\nsupports *partially* diagramless puzzless, where only some squares or some\npartial areas of the grid do not show where the blocked squares are. While\nsolving such a puzzle, the solver can press the space bar in a diagramless\nsquare to posit that it is a blocked square (the dark square character, ⬛,\nwill get placed in that square. It can be deleted just like any other regular\nentry). Further, when a user enters or clears a blocked square in a diagramless\ncell, the appropriate action will also be taken in the square that is the\nsymmetric counterpart of the current square.\n\nIf the setter has provided annotations by appending annotations at the end of\nsome clues, then these annotations get shown when the solver clicks\n\"Reveal all!\". Clue-specific annotations get revealed/hidden with\n\"Reveal/Clear this\" buttons (unless the clue only has diagramless cells).\nIn a puzzle in which solutions are not provided, the \"Reveal this\" button will\nstill get shown if there are any clues for which annotations are present (these\nannotations may be full solutions or just hints, possibly).\n\nIf the setter has provided the location of one or more ninas (through\n[`exolve-nina`](#exolve-nina) sections), then an additional button control,\n*Show ninas*, gets shown, for the solver to see where the ninas are. The button\ncan be clicked again to hide the nina locations. Ninas also get shown on\nclicking \"Reveal all\".\n\nIf the setter has asked additional questions in the puzzle (through\n[`exolve-question`](#exolve-question) sections), then input fields for these get\nshown too. \"Reveal/Clear all\" controls buttons also include revealing/clearing\nanswers to these questions apart from showing/hiding annos/explanations/ninas.\n\nIf the setter has set up a submit URL (with an [`exolve-submit`](#exolve-submit)\nsection—the URL can be set up using a Google Form, for instance), then there is\na *Submit* buttion.\n\nWhen the solver enters a letter in a square, the cursor automatically jumps to\nthe next square for the currently active clue (the next square can be from a\ndifferent clue, when there are linked clues that \"cover\" multiple clues).\n\nIf the solver changes a cell entry from a non-blank letter to a different\nnon-blank letter, then that changed letter is highlighted by showing in a\ndifferent colour for a short while. This animation's\n[start/end colours (`overwritten-start` and `overwritten-end`)](#colour-schemes)\nand the [duration (`highlight-overwritten-seconds`)](#exolve-option) can be\nconfigured.\n\nIf the solver hits the delete key, it will erase the contents of the current\nsquare without advancing.\n\nThe solver can press Tab/Shift-Tab to navigate to the next/previous clue. The\nsolver can use the arrow keys to navigate to the next/previous light cells in\nthe direction of the arrow. If there is no light cell anywhere further in the\ndirection of the arrow, but there is a light cell immediately diagonally in\nthat direction to one side, then the cursor moves there (this is intuitively\nhelpful in tiled grids created using `exolve-shaped-cell`).\n\nThe software tries to keep the current clue visible when scrolling, as long\nas the square with the cursor is visible.\n\n\"Clear/Check/Reveal all\" buttons, the \"Show ninas\" button, and the \"Submit\"\nbutton solicit additional confirmation from the solver.\n\nClicking on a clue in the clues table makes that clue active. If that clue\nwas not the previously active clue, then the keyboard focus goes to the\nfirst letter of that clue, in the grid. If the clue was already active,\nthen the focus stays with the clue, letting you select and copy parts of\nthe clue/anno if needed.\n\nYou can click on the black background or on the puzzle title, setter, or\npreamble (if present) to unhighlight the current clue (for printing or\nscreenshotting, for example).\n\n## Extended chessboard notation\nIn a few cases (such as when specifying colouring or ninas or locations of\nsome clue numbers in diagramless puzzles), you might need to specify the location\nof a square in the grid. You can do that in one of the following ways:\n```\na3 (column \"a\": the 1st column from the left, and row 3 from the bottom)\nf11 (column \"f\": the 6th column from the left, and row 11 from the bottom)\n```\nThe letters (a-z) must be in lower case and must precede the row number, with\nno intervening space.\n\nThis chessboard notation is insufficient if your grid has more than 26 columns.\nYou can directly specify the row and the column too, like this:\n```\nc1r3 (the 1st column from the left, and row 3 from the bottom)\nr11c6 (the 6th column from the left, and row 11 from the bottom)\n```\n\n## Exolve format overview\nThe puzzle can contain the following \"sections\" between the `exolve-begin` line\nand the `exolve-end` line:\n\n* **`exolve-width`**\n* **`exolve-height`**\n* **`exolve-grid`**\n* `exolve-title`\n* `exolve-setter`\n* `exolve-email`\n* `exolve-id`\n* `exolve-copyright`\n* `exolve-credits`\n* `exolve-preamble` / `exolve-prelude`\n* `exolve-across`\n* `exolve-down`\n* `exolve-nodir`\n* `exolve-reversals`\n* `exolve-3d`\n* `exolve-3d-across`\n* `exolve-3d-away`\n* `exolve-3d-down`\n* `exolve-explanations`\n* `exolve-nina`\n* `exolve-colour` / `exolve-color`\n* `exolve-no-rebus`\n* `exolve-question`\n* `exolve-submit`\n* `exolve-option`\n* `exolve-language`\n* `exolve-relabel`\n* `exolve-maker`\n* `exolve-force-hyphen-right`\n* `exolve-force-hyphen-below`\n* `exolve-force-bar-right`\n* `exolve-force-bar-below`\n* `exolve-cell-size`\n* `exolve-grid-spacing`\n* `exolve-grid-bounds`\n* `exolve-cell-decorator`\n* `exolve-postscript`\n* `exolve-shaped-cell`\n\nEach section has the section name (`exolve-something`), followed by a colon.\nOther than the `exolve-preamble`/`exolve-prelude`, `exolve-grid`,\n`exolve-across`, `exolve-down`, `exolve-nodir`,\n`exolve-explanations`, and `exolve-postscript` sections, all other sections\noccupy a single line (some can be repeated though). For such single-line\nsections, the \"value\" of the section is the text following the colon on the\nsame line.\n\nThe bolded sections, namely, `exolve-width`, `exolve-height`, and\n`exolve-grid` are required. The other sections are optional, but\n`exolve-across`, `exolve-down`, (or `exolve-nodir`), `exolve-title`, `exolve-setter`\nshould probably be present in most puzzles.\n\nAny line (or trailing part of a line) that begins with a \"# \" is treated\nas a comment and is ignored. A \"#\" with an end-of-line after it is also treated\nas a comment. Note that a \"#\" with a non-space character after or before it is\nNOT treated as a comment. This is so because we may have things like \"#1\" or\n\"Phone#\" in clues, or \"#\" in URLs, or HTML colour names such as #FF00FF in\n`exolve-colour` sections, or we may have clues in which their grid-location is\nindicated in the #xN notation—[see this section](#extended-chessboard-notation).\nI did not use \"//\" as the comment marker as it is used in URLs.\n\nAny text appearing before `exolve-begin` or after `exolve-end` is ingored.\n\n## `exolve-width`, `exolve-height`\nThe width and height of the puzzle—i.e., how many squares across and how many\nsquares down is the crossword grid. Example:\n```\n  exolve-width: 15\n  exolve-height: 15\n```\n\n## `exolve-grid`\nThe grid specification starts from the line *after* the `exolve-grid` line and\ngoes all the way to the next `exolve-something` section. There should be exactly\nas many lines in this section as the height of the grid. On each line, the\nsquares in that row of the grid are specified.\n\nThere are two kinds of puzzles: with solutions provided and without solutions\nprovided. Here are simple examples of both:\n\nGrid with solutions provided:\n```\n  exolve-grid:\n    ACE\n    R.R\n    EAR\n```\nThis is a 3x3 grid with one blocked square in the center (\".\" is used to\nindicate blocked squares). In this grid, 1 Across = ACE, 1 Down = ARE,\n3 Down = ERR, and 3 Across = EAR. When solution letters are included like this,\nthe control buttons for checking/revealing answers get shown. \n\nIn a grid with solutions provided, setters may use the letter '?' as a\nplaceholder in any light square for which they have not yet decided what\nletter to place.\n\nGrid without solutions provided:\n```\n  exolve-grid:\n    000\n    0.0\n    000\n```\nThis is also a 3x3 grid, but no solutions have been provided (every light is\nshown using the letter \"0\"). In such a grid, the control buttons for checking/\nrevealing answers do not get shown.\n\nIt is also possible to specify barred grids, instead of blocked ones. In fact,\nit is possible to specify a a grid that uses both bars and blocks. Bars (and\nsome other special treatments) are specified using letters that follow the main\ngrid square specifier, which we'll refer to as *decorators*. A bar to the right\nof a square is specified using the decorator |. A bar under a square is\nspecified using the decorator \\_. A square that has both a bar after and a bar\nunder can use \"|\\_\" or the shortcut for that, \"+\". Arbitrary many spaces are\nallowed between grid square specifications, and spaces can (*should!*) be used\nto line up the squares in the presence of decorators. Here is an example 3x3\ngrid that uses both bars and blocked squares:\n```\n  exolve-grid:\n    A M|B\n    X . E\n    E|A T\n```\n\nThe decorator \"@\" can also be used to inscribe circles inside some squares, and\nthe decorator \"\\*\" can be used to indicate that a square is to be diagramless.\nHere's the last example again, this time with circles around some cells, and\nsome cells being diagramless:\n```\n  exolve-grid:\n    A  M|@B\n    X* .  E*\n    E| A  T\n```\n\nThe decorator \"!\" can be used to mark a cell as pre-filled (its solution letter\nmust be provided). The solution letter will be pre-filled and will not be\neditable. If all entries in a light are prefilled, and an anno is provided\nfor that clue, the anno will be shown automatically at start-up. Even if no anno\nis given for a fully prefilled clue, the solution will be displayed at the\nend of the clue (unless the no-auto-solution-in-anno option is set).\n\nThe decorator \"\\~\" can be used to mark a cell that starts an across/down clue\nas one in which normal clue numbering should be skipped. Such a cell gets\nno clue number. The clue number that it *would* have got will instead be\nused for the next cell that starts a clue. The light(s) that start at such\n\"skipped number\" cells would have to be clued in some other way (for example,\nwith a clue that is specified or revealed separately). One way the clue can\nbe provided is with a [nodir clue or a non-numerically labelled\nclue](#exolve-across-exolve-down-exolve-nodir), as described later.\n\nAs a convenient reference, here again is the complete list of decorators:\n| Decorator | Meaning                            |\n|-----------|------------------------------------|\n| `\\|`      | Has a bar after it, to the right.  |\n| `_`       | Has a bar under it. at the bottom. |\n| `+`       | Has bars both after and under.     |\n| `@`       | Has an inscribed circle.           |\n| `*`       | Is diagramless.                    |\n| `!`       | Is prefilled.                      |\n| `~`       | Skips normal numbering             |\n\nApart from these standard decorators, you can also create arbitrary SVG based\ndecorators (see [`exolve-cell-decorator`](#exolve-cell-decorator). A cell\ncan be decorated with the kth (k = 1, 2, ...) `exolve-cell-decorator`by suffixing\nits entry in the grid with `{k}` (or comma-separated lists of numbers, like\n`{k1,k2,...}`).\n\nIf you use a language/Script that uses compound letters made up of multiple\nUnicode characters (for example, Devanagari—see the\n[`exolve-language`](#exolve-language) section), or if you have\n[rebus cells](#rebus-cells), then your _must_ separate grid\nletters (when specifying a grid with solutions) with a space (unless they are\nalready separated by a decorator). For example, this will *not* work:\n```\n  exolve-grid:\n     सेहत\n```\nThis will work:\n```\n  exolve-grid:\n     से ह त\n```\n\nYou can also create grids with arbitary geometries of cells (such as hexagonal\ncells), using [`exolve-shaped-cell`](#exolve-shaped-cell), described later.\n\n### Digits and special characters\n\nNormally, only the letters of the alphabet (A-Z, or script-specific) can be\nused in solution letters. However using [`exolve-option`](#exolve-option)\n`allow-digits` or `allow-chars:\u003cchars\u003e`, you may allow some non-alphabetic\ncharacters. If any of these characters is also a decorator or has a special\nmeaning in grid specifications (i.e., is one of `|_+@!~*.?{[`), then it should\nbe prefixed with `\u0026` in the grid specifications. If `\u0026` itself needs to be used\nin the grid, then it too should be prefixed with an `\u0026`. For example:\n```\n  exolve-option: allow-chars:@.\u0026\n  exolve-grid:\n    A \u0026@ B \u0026. C O M\n    \u0026\u0026 . . .  . . .\n```    \n\nEven though `0` has a special meaning in grid specifications, you do not\nhave to escape `0` using an `\u0026` prefix if `0` has been allowed in the grid via\n`allow-digits` or `allow-chars`. A technical caveat (for the sake of\ncompleteness) is that you cannot create a degenerate grid that has all entries\nmade up entirely of `0s`.\n\n### Rebus cells\n\nIf you want the crossword solution to include some cells that have multiple\nletters (aka \"rebus cells\"), then you have to use `exolve-option: rebus-cells`\n(and you *have* to separate grid solution entries with spaces as mentioned\nearlier).\n\nFor example:\n```\n  exolve-width: 3\n  exolve-height: 3\n  exolve-option: rebus-cells\n  exolve-grid:\n    RAN G E\n     DO . A\n      M E T\n```\n\nIf there are rebus cells, then you can enter multiple letters into any\ncell after double-clicking on it, or by pressing down the Shift key while\nentering a letter. If a cell already has previously entered multiple letters,\nthen when you come to it again (by clicking on it or auto-advancing from\nan adjacent cell), you will be able to enter multiple letters into it (without\nhaving to use the Shift key or double-click).\n\nWhen multiple letters are entered into a cell, the font size of cell text is\nadjusted to try to fit all the letters. If you have some long rebus entries\nthat do not fit the default cell size then you should use bigger cells, using\n[`exolve-cell-size`](#exolve-cell-size).\n\nIf there are rebus cells, then the across-direction indicator arrow in the\ncurrent cell is placed below the text intsead of to the right of it, to leave\nmore space for the text.\n\nWhen there are rebus cells, sometimes you want to exclude some cells/lights\nfrom allowing multiple-letter entries (i.e., you only want certain cells to\nhave rebus entries). You can do that by adding a section called\n`exolve-no-rebus`. Just like `exolve-nina` and `exolve-color`, this section\naccepts any combination of lights and cells\n(using the [extended chessboard notation](#extended-chessboard-notation))\nin its listing of where multiple-letter entries should be disallowed. For\nexample,\n\n```\n  exolve-option: rebus-cells\n  exolve-no-rebus: 6A 6D d5 c3r4\n```\n\nThis would disallow multiple-letter entry into all the cells involved in the\nlights `6A`, `6D` as well as the cells `d5` and `c3r4`. Note that in a 3-d\ncrossword you can specify lights using names such as `6aw` etc.\n(see the [`exolve-3d`](#exolve-3d) section).\n\nYou cannot have rebus cells in crosswords that use languages with\nmax-char-codes greater than one and in crosswords with diagramless cells (this\nallows us to keep the code simpler).\n\n### Alternative letters\n\nSometimes you would want to permit alternative spellings of some words. You\ncan do that by using one or more `exolve-alternatives` sections. Each such\nsingle-line section has one or more space-separated entries that specify\nalternative letters for specific cells (identified using the\n[extended chessboard notation](#extended-chessboard-notation)). Example:\n```\n  exolve-width: 7\n  exolve-height: 3\n  exolve-grid:\n    OXIDISE\n    U.....V\n    REALISE\n  exolve-alternatives: r1c6:Z\n  exolve-alternatives: r3c6:Z\n```\n\nBoth S and Z will be allowed by \"Check this\" and \"Check all!\", in\nOXIDISE/OXIDIZE (1a) and REALISE/REALIZE (3a). Similarly, \"Reveal this\" and\n\"Reveal all!\" will not change any letter that the solver might have entered in\na cell, if it's listed as an alternative for that cell.\n\nIf an exolve-alternatives section has more than one cell, then it is treated\nas an all-or-nothing group. For example, we can add this line to the above:\n```\n  exolve-alternatives: r2c1:A r2c7:Y\n```\nHere, there is an alternative solution to the puzzle in which 1d is OAR _and_\n2d is EYE. This can be used to craft puzzles that might have\ntwo (or more!) distinct solutions, such as this\n[famous example](https://viresh-ratnakar.github.io/test-farrell-quantum.html)\nby Jeremiah Farrell.\n\nWe disallow specifying the same cell in more than one `exolve-alternatives`\nsection. The reason is to avoid the possibility of puzzles where the solver\nmay reach a dead-end conflict in choices from two groups. Dealing with such\nconflicts would have required adding code complexity as well as user interface\ncomplexity.\n\nThe above way of specifying alternatives, with the non-duplicated-cell\nconstraint just described, means that you cannot specify more than one\nalternative for a cell. We think that's reasonable, but if someone comes\nup with an interesting puzzle in which more than one alternative is warranted\nfor some cell, please let us know and we can consider supporting that scenario.\n\nRevealed in-clue solutions will include all possible solutions for a clue.\nThe solutions where some `exolve-alternatives` groups are used will be\nshown with a superscript that is a comma-separated list of all group numbers\nused in crafting that alternative. For example, 1a will show \"OXIDISE,\nOXIDIZE\u003csup\u003e2\u003c/sup\u003e\", and 3a will show \"REALISE, REALIZE\u003csup\u003e1\u003c/sup\u003e\". The\nrevealed in-clue solutions also show the following help-text when hovered\nover:\n\n\u003e This is an alternative solution to the clue. Clicking on it\n\u003e will set any currently visible letters in it to this variant. If\n\u003e the setter has created an alternative solution group with more than one\n\u003e cell (group numbers are shown in superscripts of solution variants)\n\u003e then clicking will set all revealed visible letters in the group to\n\u003e reflect this variant.\n\nAs described in the above help-text, clicking on any variant will set\nall currently visible revealed cells to the values implied by the\nalternatives groups used in that variant.\n\nWe disallow using `exolve-alternatives` when there ar diagramless cells or\nwhen any cell does not have a solution. We disallow more than 3 distinct groups\nof alternatives within any single clue (as it's an unlikely scenario and the\nlisting of all possible solutions would be too long).\n\n### Some details about diagramless cells\nNote that \"diagramlessness\" only hides from the solver whether a square is\nin a light or is a blocked square—if the setter has used any bars, they do get\ndisplayed to the solver, even in diagramless cells.\n\nIf a puzzle with diagramless squares has specified all solutions, then\ncheck/reveal controls get displayed. For example, revealing a blocked\ndiagramless square will show the dark square character, ⬛, in that square. \n\nIf the setter wants to *not* provide solutions for a puzzle that has some\ndiagramless squares, then the blocked square marker (\".\") should not be used\nin the blocked squares that are also diagramless (otherwise the solver can peak\ninto the HTML source and see where the blocked squares are). Each diagramless\nsquare in such a puzzle should be specified with a \"0\" followed by the\ndiagramless decorator, i.e., as \"0\\*\". But then, even the Exolve software has no\nway of knowing which grid square any clue starts on. However, sometimes, even\nin a puzzle with diagramless squares, the setter may want to provide the clue\nstart locations for *some* clues. Exolve provides a way to do this: the setter\ncan optionally include the location of the square where a clue starts for any\nclue, using the extended chessboard notation. Details are provided in the next\nsection.\n\n## `exolve-title`, `exolve-setter`\nThe title of the puzzle and the name/pseudonym of the crossword setter. Example:\n```\n  exolve-title: My Lovely Crossword\n  exolve-setter: Narsi Sus\n```\n\n## `exolve-email`\nOptional email address (or comma-separated addresses) where solvers can contact\nthe crossword creator(s). From the \"Notes\" panel, you can send your notes to\nthis email address.\n\n## `exolve-id`\nOptionally provide a unique id for this crossword puzzle. This id is used as\nthe key for saving/restoring state and also to distinguish between multiple\npuzzles on a single page. You can create an unsolved version of a puzzle (to\nrun a contest, for example) and, later, a version of the same puzzle that has\nthe solutions, giving them both the same `exolve-id`. Then, when solvers visit\nthe version with solutions, they can see their own entries and see which\nmistakes they made, if any. Example:\n```\n  exolve-id: tiny-42\n```\n\nIf you do not provide an id, the software will create one from a signature of\nthe grid and the clues. This will ensure that if you load the same crossword\nwithout making any changes to the clues or the grid, then you will recover\nthe state, even without an explicit id.\n\n## `exolve-copyright`\nIf your provide this, it will be displayed with the copyright symbol, under\nthe rendered puzzle grid. Example:\n```\n  exolve-copyright: 2019 Viresh Ratnakar\n```\n\n## `exolve-credits`\nIf your provide this, it will be displayed under the copyright. You can provide\nmultiple instance of this.\nExample:\n```\n  exolve-credits: Test solver: Zaphod Beeblebrox\n  exolve-credits: Custom code: H. A. C. Ker\n```\n\n## `exolve-preamble`, `exolve-prelude`\nCrossword puzzles often come with a preamble that contains special instructions\nand/or hints. The preamble text occupies multiple lines—starting from the\nline *after* the `exolve-preamble` (or `exolve-prelude`) line, and going all the\nway down to the line preceding the next `exolve-something` section. The preamble\nmay include HTML tags. The preamble is rendered just above the grid, in the\nrendered puzzle. Example:\n```\n  exolve-preamble:\n    Words should be entered in the grid \u003ci\u003eafter\u003c/i\u003e deleting one letter. The\n    letters thus deleted, in clue order, form the name of a famous farm\n    animal.\n```\n\n## `exolve-across`, `exolve-down`, `exolve-nodir`\nThe `exolve-across` and `exolve-down` sections should be used to specify the\nacross and down clues, respectively (`exolve-nodir` is for the special/rare case\nof clues that do not have a specified direction; we will describe it at the end\nof this section). There should be one clue per line, and there should not be any\nblank lines. The clues should start with the clue number, and end with the\nenum (the enum is not strictly required). Example:\n```\n  exolve-across:\n    1 Untouchable service (3)\n    3 Listener (3)\n  exolve-down:\n    1 Happen to be (3)\n    2 Make a mistake (3)\n```\n\nIf the enum indicates multiple words (for example, *(4,3)* or *(6 7)*), or if\nthe enum indicates hyphenated words (for example, *(4-2)*), then the word\nboundary or the hyphen gets displayed in the grid, to help solvers. The\nsoftware uses the following criteria to decide what constitutes the enum part\nof a clue: a pair of opening and closing parentheses, containing only numbers,\nhyphens, commas, apostrophes, spaces, and periods, starting with a number. The\nsoftware also treats a pair of parentheses containing the text \"words\" or\n\"letters\" (or any subword beginning with \"w\" or \"l\", such as \"wrds\" or \"l\" or\n\"ltrs\") or containing \"?\" with anything before it, as an enum (to allow the\nsetter to specify the enum as \"(two words)\" or \"(?)\" or \"(7, 2w)\", for example).\nWithin these special cases, in the corner cases of \"(7, 2words)\" and\n\"(6 letters)\", the parsing interprets 7 and 6 respectively to be the length of\nthe entry, and will check it against the length of the light as with a normal\nenum.\n\nIn the rare case that there are multiple candidate enum parts in a clue, the\nlast one is used. However, this can be overridden by explicitly using \"[]\"\nto mark the end of the clue (see [`Annotations`](#annotations) below).\n\nIn a 3-D crossword, instead of `exolve-across` and `exolve-down` you should use\n`exolve-3d-across` and `exolve-3d-away` sections, respectively, with an\n`exolve-3d-down` section providing the clues for the vertical lights through\nthe layers. You can find the details in the [`exolve-3d`](#exolve-3d) section.\n\n### Suppressing enums or separators\n\nIf the enum is immediately followed by a `*`, then it is not displayed to the\nuser. Examples:\n```\n  1 Satellite (4)* MOON\n  2 Star (?)*\n```\n\nThere might be puzzles where, even though the enum indicates multiple or\nhyphenated words, you do _not_ want a word-separator bar or a hyphen to be\ndrawn in the grid. An example would be a grid where the special instructions\nask for a letter to be removed before entering a solution into the grid. You\ncan achieve this effect using the following bit of trickery:\n```\n  1 Clue with enum that implies hyphens and dashes, but they are suppressed\n    using trickery (\u003cspan\u003e3,2-2,5-3\u003c/span\u003e) (15)* Anno here...\n```\nNote that the enum numbers are wrapped in a \u0026lt;span\u0026gt; tag, which tricks\nExolve into not parsing them. The length of the entry is specified after that,\nusing the enum spec (15)\\* that does not get displayed (but serves as a way\nto let Exolve know that what follows is the anno).\n\n### Missing clues and mismatched enums\n\nIf there is a missing clue, or if the provided enum for a clue does not\nmatch the number of cells in the clue as per the grid (including any linked\nchildren clues), then a warning message gets shown. If the anomaly is\ndeliberate rather than an oversight, the warning generation can be suppressed\nusing `exolve-option: ignore-unclued` and/or\n`exolve-option: ignore-enum-mismatch`. Checking for missing clues is not\ndone if there are any nodir clues, and checking for mismatched enums is\nnot done if there are any diagramless cells.\n\n### Hints\n\nYou can include hints in clues (in some clues or in all clues). This is done\nby providing a sequence of lines immediately under the clue, each one carrying\nthe prefix, `Hint:` (case-insensitive). Each hint can include HTML formatting.\nExample:\n```\n  exolve-across:\n  1 Some clue without a hint (9)\n  5 A clue with two hints (5)\n    Hint: The \u003ci\u003efirst\u003c/i\u003e hint!\n    Hint: The second hint is noticeably longer.\n  6 A clue with one snarky hint (6)\n    Hint: Try using your brain for a change?\n```\n\nNote that these hints are completely independent of the post-reveal annotation\ndesribed below (if present). When hints are available for the current clue, and\nnot all hints have yet been shown, a lightbulb icon is shown at the end of the\nclue (above the grid only, not in the clues table). Clicking on this icon will\nreveal the next hint. Clicking on any hint will hide all the hints once again.\n\nExolve does not save state about how many hints were shown for various clues, so\nif you reload the puzzle then all hints restart in the not-shown state.\n\n### Annotations\nIn a grid with solutions provided, the setter may include annotations for\nexplaining how a clue works or for providing hints. Any text located after the\nenum in a clue is treated as annotation. The annotation is displayed when the\nsolver clicks on the \"Reveal all\" button or on the \"Reveal this\" button when\nthat clue is the current clue. Example:\n```\n  exolve-across:\n    28 Replace bottles containing questionable medicine (7) Def: questionable medicine. Hidden word: (-re)PLACE BO(-ttles).\n```\n\nIf a clue does not provide its anno, the software still creates a minimal anno\nconsisting of just the solution text (that it infers from the grid and the\nenum). Even if the anno is provided, the software prefixes it with the inferred\nsolution text. This might have meant that if in an older grid the solution\nwas explicitly included in the anno, it would have got duplicated. So, the code\ndoes check to see if the solution string (punctuation/markup notwithstanding)\nis present at the head of the anno, and avoids duplicating it if so. If the\nsetter wants to present the solution in some other way, they can suppress the\nautomatic addition of the solution to the anno by adding this line to the puzzle\nspecs:\n```\n    exolve-option: no-auto-solution-in-anno\n```\nThis option only suprresses the solution getting added to the anno appearing\nafter the clue. The solution does still get added to the [placeholder blank\nslot of an orphan clue](#jigsaw-puzzle-clues), upon \"Reveal this,\" even with\nthis option.\n\nIf the leading part of the anno needs to be something in square brackets, such\nas \"... (6) [t]WITTER ...,\" then setters should include the solution before\nthat (even if it can be inferred from the grid), to avoid misinterpreting the\nleading part as the solution, like \"... (6) [WITTER] [t]WITTER ...\" Or, they\ncan use an empty pair of square brackets to mark the end of the clue, like\n\"... (6) [] [t]WITTER ...\" The special \"[]\" clue-end marker string is also\nuseful if there is any ambiguity about where the clue ends (perhaps because of\nmultiple enum-like substrings) that cannot be resolved by providing the\nsolution in square brackets.\n\nHere are some more complex examples of enum/annotation parsing.\n```\n  1 This (13) clue ends (word) here! (4)\n  2 This (13) clue also ends (1 word) here! (4) Some annotation follows.\n  3 This (13) clue also ends (2 letters) here! (8) [SOLUTION] Some annotation follows.\n  4 This (13) clue also ends (words) here! (8) [] [t]WITTER The anno has (3) enum-like parts.\n  5 This is an enum-less and anno-less clue that ends here!\n  6 This is also an enum-less and anno-less clue that also ends here! (?)*\n  7 This is also an enum-less but with-anno clue that also ends here! (?)* [] [t]WITTER Here is the anno.\n  8 This clue, even though its anno contains an enum-like substring, ends here! (4) The (word) and (4 letters) enum-like parts here are not numeric.\n  9 This clue (13) does not end now (4) as [square brackets do not follow immediately]; it ends here! (4)\n```\n\n#### In-clue annotations\nYou can also decorate sub-phrases in the clue with underlines, different styles,\ncolours, backgrounds, etc., by enclosing specific substrings with the special\nmarkers, `~{` and `}~`, like this:\n```\n    28 Replace bottles containing ~{questionable medicine}~ (7) Hidden word: (-re)PLACE BO(-ttles).\n```\nThe default styling for such \"in-clue annotations\" is to underline the\ntext with a \"darkgreen\" underline. This styling will get revealed when the\nsolver clicks on \"Reveal this\" or \"Reveal all\" (and will get cleared with\n\"Clear this/all\").\n\nYou can apply different in-clue annotation styles (instead of underlining),\nby providing an HTML element class name, like this:\n\u003c!-- {% raw %} --\u003e\n```\n    28 ~{{xlv-blue}Replace}~ bottles ~{{my-style}containing}~ ~{questionable medicine}~ (7) Hidden word: (-re)PLACE BO(-ttles).\n```\n\u003c!-- {% endraw %} --\u003e\nHere, \"xlv-blue\" is a class name that Exolve has set up in its CSS (some others\nare \"xlv-red\", \"xlv-yellow-bg\", and \"xlv-pink-bg\"). But you can use your own\nclass names too (such as \"my-style\" above) and specify their stylings with your\nown custom CSS rules.\n\n### Linked lights and clues\nIf a linked clue includes other \"children clues,\" this can be indicated by\nappending a comma-separated (or \u0026amp;-separated) list of children clue numbers\nto the parent clue number. Example:\n```\n  exolve-across:\n    1, 5, 2d In spite of adverse circumstances (7,3,4)\n    5 See 1 Across\n    ...\n  exolve-down:\n    2 See 1 Across\n    3 \u0026 7 See neck (4,3)\n    7 See 3 Down\n```\nAs shown in the above examples, if a child clue (2d in the first example) has a\ndifferent direction from the parent, the direction can be specified with a\none-letter suffix (\"a\" or \"d\" or \"b\" or \"u\"), or, in 3-D crosswords, with\na two-letter suffix (\"ac\" or \"aw\" or \"dn\" or \"ba\" or \"to\" or \"up\").\n\nLinking lights can create two corner cases that are noteworthy. (1) When a\nlight ends on the same cell where the next linked light starts, then that\ncell is *not* counted twice. So, in a 3x3 grid with 3-letter lights 1a and 2d\nlinked, where 2d starts on the same cell as where 1a ends (cell r3c3), the total\nlength of the linked lights would be 5 not 6. (2) If you link a sequence of\nlights (including some reversed lights) such that the last cell of the linked\ngroup is exactly its starting cell, then that cell is also not counted twice.\nFurther, the interface lets you type letters in a loop along the sequence (as\nthat seems to be the fun thing to do for this corner case). For backspacing\n(when erasing) cells in such a snake-swallowing-its-own-head loopy linked\ngroup, the interface stops the backspacing at the first cell.\n\n### Filled clues\nWhile solving, when a light is fully filled in, its clue number changes\ncolour (to a light shade of blue, making the unsolved clue numbers stand out).\nThere are some minor exceptions when this does not happen (diagramless cells\nor other reasons that don't let us determine when a clue's light is fully\nfilled). For such clues, the solver can click on the clue number to set (or\nunset) its \"has-been-solved\" state manually.\n\nAs mentioned in the previous section, in a grid that has diagramless squares\nand that does not provide solutions, if the setter wants to display some clue\nnumbers in squares, they can do so by prepending the clue (in the\n`exolve-across` or exolve-down section) with \"#\u0026lt;L\u0026gt;\", where \u0026lt;L\u0026gt; is\nthe location of the square in the\n[extended chessboard notation](#extended-chessboard-notation).\nExamples:\n```\n  exolve-across:\n    #a9 15 Imprison and tie perhaps\n    #c17r42 31 Greeting\n```\nHere, the clue number 15 will get displayed in the square that is in the first\ncolumn and the 9th row from the bottom, and 31 will get displayed in the 17th\ncolumn and 31st row.\n\n### Filler lines between clues\nAny line in a clues section (i.e., in\n`exolve-across`/`exolve-down`/`exolve-nodir`) that cannot be parsed as a clue or\nhint is treated as a filler line. It is simply displayed in that position in the\nlist of clues. It is an error to place a filler line after the last clue in a\nclues section. Filler lines can be used to demarcate sections within clues, if\nneeded. Example:\n```\n  exolve-across:\n    1 Communication device (5)\n    7 Greeting (5)\n    \u003ci\u003eThe following entries all begin with B.\u003c/i\u003e\n    9 Unreachable sound in 1 (4,4)\n    15 Zaphod (10)\n```\n\n### Splitting long clue lists\nAny line in a clues section that starts with --- initiates the rendering of\na new table of clues. If any text follows --- then it gets shown as the\nheading of the new table.\n\n### Order of rendered clue lists\nThe order in which the exolve-across, exolve-down, and exolve-nodir sections\nappear in the puzzle specs is the order in which they will be displayed.\nAdditionally, direction-toggling will also follow the same sequence. Thus,\nif you list nodir clues before across and down clues, and the solver clicks\non a cell that does not have a light in the currently active direction (say\nAcross), but does have both a nodir light and an across light going through\nit, the nodir light will become active (as nodir clues are listed before across\nclues in the specs).\n\n### Non-numeric clue labels\nIf you want to use non-numeric clue labels (such as A, B, C, etc.), you can\ndo that by enclosing the non-numeric clue label in square brackets, like this:\nExample:\n```\n  exolve-across:\n    2 Imprison and tie perhaps (6)\n    [F] Enjoyable (3)\n    5 Hitchhiker's accessory (5)\n    #a12 [G], 4, [H] Fitting reply (3,3,3)\n    ...\n```\nFor non-numeric clue labels, the software does not know which cell the clue\nbegins in, unless it is specified explicitly by the setter using a \"#xN\"\nprefix as described above and shown in the fourth clue example above.\n\n### Trailing period in clue labels\nA trailing period after a clue number or label is considered to be just a\npunctuation mark and is ignored. The first five periods in the following\nexample get ignored. If you have consecutive periods, they do not get ignored\n(as you're presumably using an ellipsis).\n```\n    2. Clue (4)\n    3.Ignorance is _____ (5)\n    4 . Time for every one to end, finally (6)\n    [Q.]. Hop... (4)\n    [R] ... aboard! (6)\n```\n\n### Some details about clue numbers\nAcross and down clue numbers within the grid are automatically inferred from\nthe grid, except in two cases. The first is when there are diagramless cells\nand solutions have not been provided. The second is in jigsaw-style puzzles,\nwhere the setter opts to deliberately not provide associations between grid\nsquares and clues, by using non-numeric clue labels without providing their\ngrid locations. When the solver is entering a value in a light for which the\nclue association is not known, the highlighted \"current clue\" browsable\ninterface runs through all the clues for which all grid cells are not known.\n\nClue numbering can be affected by the following additional factors covered in\nother sections:\n- The \"skip numbering\" decorator ('~') covered above in the\n  [`exolve-grid`](#exolve-grid) section.\n- [`exolve-reversals`](#exolve-reversals)\n- [`exolve-3d`](#exolve-3d)\n\n### Clues without a specified direction\nIf you want to create a section of clues without a specified across/down\ndirection, you can use an `exolve-nodir` section, which has the same structure\nas `exolve-across` and `exolve-down`, but the direction of each clue in this\nsection is considered unspecified. Setters would probably want to use this\nsection with non-numeric clue labels. Example:\n```\n  exolve-nodir:\n    [P] Direct (5)\n    [Q] Server spilling one's drink (5)\n    ...\n```\nThe clue label in [] can be numeric too, (like [42]), and the starting cell can\nalso be specified using a \"#\u0026lt;L\u0026gt;\" prefix (with \u0026lt;L\u0026gt; being a cell\nlocation in the [extended chessboard notation](#extended-chessboard-notation))\nas described above.\n\nIf the setter is using  nun-numeric clue labels or clues without a specified\ndirection, then they should probably also use the option \"hide-inferred-numbers\"\nin an [`exolve-option`](#exolve-option) section. Alternatively, they can use\nthe \"\\~\" decorator in the grid to skip numbering the cells using normal\nnumbering.\n\nYou can provide a heading for nodir section by placing it after\n`exolve-nodir:`, like this:\n```\n  exolve-nodir: Alphabetic clues\n    [P] Direct (5)\n    [Q] Server spilling one's drink (5)\n    ...\n```\n\n### Nodir clues with cells explicitly specified\nIn a nodir clue, you can specify not just the starting cell, but _all the cells_\nusing the chessboard notation. If you do that, then clicking on a cell in that\nclue will highlight and allow entry in all the cells for that clue (cells in\na nodir clue can be scattered arbitrarily in the grid). Example:\n```\n  exolve-nodir:\n    #c3 #c5 #c8 #f6 [A] One hundred years lived in prison (4)\n```\nNote that this technique can be used to create multidimensional (like 4-D!)\npuzzles: use a nodir section for specifiying lights along all the extra\ndimensions, explicitly specifying their cells. For 3-D crosswords, Exolve\nprovides better and more complete support, including a nice 3-D appearance\n(see the [`exolve-3d`](#exolve-3d) section).\n\n### Skipped-number cells and clues with cells specified\nIf an across/down clue's start cell has the decorator \"\\~\", its normal numbering\ngets skipped. If there is another clue that is either an across/down clue\nwith a non-numeric label and with its start cell specified, or is a nodir\nclue with all its cells specified, and all the cells of the two clues are the\nsame, then the clues get merged. The label specified for the second clue\ngets shown in the skipped-number cell. For example:\n```\n  exolve-grid:\n    0~0 0\n    0 . 0\n    0~0 0\n  exolve-across:\n    #a1 [B] Bottom row (3)\n  exolve-down:\n    1 Third column (3)\n  exolve-nodir:\n    #a3 #b3 #c3 [Q] Top row [3]\n``` \nHere, the top-left and bottom-left cells are skipped-number cells. The [B]\nacross clue gets merged with the bottom row light, and the [Q] nodir clue\ngets merged with the top row light. The light in the first column is unclued.\n\n### Jigsaw puzzle clues\nIf there is any nodir clue without cells explicitly specified, or an\nacross/down clue with a non-numeric label whose start/cells are not specified,\nthen the clue is shown with a text entry area next to it. Solvers can record\ntheir solutions here, until they figure out where in the grid those letters\nshould be entered. Solvers can transfer recorded letters from these placeholder\nareas by simply clicking the \"copy-placeholder\" button (that looks like [⇲])\nnext to the placeholder area, whenever they have some squares highlighted for\nentry in the grid.\n\nYou can force a placeholder blank to appear after any clue (not just \"orphan\"\nones that qualify using the criteria listed above). See the next sub-section.\n\nThe placeholder entries do NOT get cleared with 'Clear this/all' (they can\nsimply by erased directly by clicking on them and deleting though). For clearing\nall placeholder entries forcibly, click on the 'Clear all' button when there are\nno entries in the grid (eg, by clicking on it a _second_ time). This option is\nonly there in puzzles that have such placeholder entries, and in such puzzles, a\ntooltip is shown over the 'Clear all' button to let the user know.\n\nThe same placeholder text and the copy-placeholder button ([⇲]) are also shown\nin the highlighted scrollable 'orphan' clues widget, whenever the currently\nhighlighed squares do not have a known clue association.\n\nThe copy-placeholder button feature does not get activated if there are any\ndiagramless cells (as only one diagramless cell is active at a time generally).\n\nThe copy-placeholder buttons can be disabled (i.e., not shown at all) by\nspecifying `exolve-option: hide-copy-placeholder-buttons`. This is useful if\nyou find the buttons distracting in appearance, or if copying from the\nplaceholder is not very useful for some other reason (for eg., lights are split\ninto parts).\n\nWithin such clues, in grids with solutions provided, it is possible to indicate\nwhich cells in the grid belong to the clue, for use in \"Reveal this\" and \"Check\nthis.\" This is done by listing in square brackets a space-separated sequence of\nclue indices and/or cell locations. Clue indices can be like 12a or 12A or 13d\nor 13D (must include direction, just like the way these are specified in\n`exolve-nina` and `exolve-colour`). If any clue indices are used in the\nspecified sequence, then those clues themselves must have some of their cell\nlocations known. This listing should be present right after the enum part, if at\nall.  Examples:\n```\n  exolve-nodir:\n    [A] Some clue (5) [1a]\n    [B] One hundred years lived in prison (4) [2d]\n    [C] Some other clue ... (?) [3d 4a c4 c5 r5c3] [SOLUTION HERE] Anno...\n```\nIn the last clue above, there is no enum provided. Even though the software\nknows all the cells of this clue, it does not know if there are multiple\nwords or hyphens. The solution in such cases can be provided in square brackets\nat the beginning of the anno.\n\nThe inferred or provided solution for an orphan clue gets revealed in its\nplaceholder blank upon \"Reveal this\" and \"Reveal all.\"\n\nIndividually listed cells, if highlighted just by themselves (which would be\nthe case if they are diagramless) do not let solvers reveal/check the whole\norphan clue: a single cell may be a part of multiple clues.\n\nThere are some subtle implications of providing revelations for orphan clues\nin this manner. In the above example, say a light in the grid (such as 1a) that\nbelongs to some orphan clue (A in this case) is highlighted by clicking on one\nof its cells. The current clue shown in the clues list will be last orphan clue\nthat the solver looked at, say B (different from A). If the solver clicks\n\"Reveal this\" then 1a will be revealed in the grid, and A will get highlighted\nin the clues list.\n\nIf, after clicking on 1a in the grid, say the solver clicks on clue C in the\nclues list and then clicks \"Reveal this.\" We infer the solver's intent from\ntheir last click. In this case, C in the clues list will get revealed, and\nthe highlighting in the grid will change from 1a to whatever is the correct\nlight for C.\n\nAnother subtle point is that in a puzzle with diagramless cells, it's possible\nfor a clue to have specified some of its cells (the first few), but not all.\nIts cells can be revealed by naming itself, and listing the additional cells.\nFor example:\n```\n    15 Imprison and tie perhaps (one word) [15a e9 f9] DETAIN.\n```\n\nNote also that \"Reveal all\" does not reveal orphan-clue-to-grid-light\nassociations. But, even after \"Reveal all,\" solvers may go through orphan\nclues, clicking \"Reveal this\" for each.\n\n### Adding \"extraction slots\" before clues\n\nA common ruse in cryptics is to make each clue somehow yield an extra letter \nand to make a meta out of those letters. Exolve allows you to add a column\nof \"extraction slots\" before each clue. Solvers can record letters/numbers\nin these slots (and these are saved in the state too). You can do this\nby specifying `exolve-option: add-extraction-slots`. By default, if you\nspecify this option, then a *one*-letter slot is added. But you can specify\nthe number of letters in the slot with an optional parameter (e.g.,\n`exolve-option: add-extraction-slots:3`). \n\n### Forcing the display of \"placeholder blanks\"\n\nPlaceholder blanks normally get displayed only in front of \"orphan\" clues whose\nlight locations are not provided to the solver. However, you can force a\nplaceholder blank next to any clue by following it with one or more underscores.\nIf you're providing annotations, place the undescrores before the annotations.\n\nThis can be useful to solvers when, for example, the puzzle instructions call\nfor some modification (such as letter omissions) to solutions before they can\nbe entered into the grid.\n\nExamples:\n```\n  exolve-across:\n    5 This clue will get placeholder blanks (4) _\n    6 Here we're specifying that there should be 7 blanks, regardless of enum (4) _______\n    7 The underscores can have intervening spaces and can be followed by annos (8) _ _ _ Some anno.\n```\n\nIf you place just one underscore, then the actual displayed size of the blank\nwill be determined using the enum. If you place more than one underscore, then\nthe displayed size of the blank will equal the number of underscores that you\nhave provided. You can have spaces between these underscores just to help you\ncount them more easily.\n\nThe placeholder blank, when empty, will show (as the light gray \"placeholder\"\ntext that indicates a hint for what the solver needs to enter) the text pattern\nimplied by the enum, such as \"??? ??-??\" for (3, 3-3). You can override this\nplaceholder text by specifying what should get displayed within square brackets,\nright after the last underscore. For example:\n```\n  exolve-down:\n    3 This will have 8 placeholder blanks showing \"??? ??\" instead of\n      \"????\" (4) _ _ _ _ _ _ _ _ [??? ??] Some anno.\n    3 For this piece of cake, we customize the placeholder text shown\n      in the placeholder blank to be \"EAT ME\" instead of \"??? ??\" (3,2) _[EAT ME]\n```\n\nThe length of a placeholder blank (the number of letters that it can hold) will\nbe the maximum of the number of underscores and the length of the gray placeholder\ntext (from the enum or from the overridden text).\n\nJust like the placeholder blanks that appear in orphan clues, these forced\nplaceholder blanks will also be accompanied by \"copy-placeholder buttons\"\n(that looks like [⇲]), unless disabled by specifying\n`exolve-option: hide-copy-placeholder-buttons`.\n\n### Some clue numbering nuances\nIf you have a non-numeric clue label (say, P) for an across (down) clue, and\nyou have provided the location of its first cell, _and_ that location is\nactually an across (down) light for which a clue has _not_ been provided, then\nthe software assumes that you wish to use the provided label, P, as the label\nfor that across (down) light.\n\nYou can use this feature to create a grid that has all non-numeric labels.\nExample:\n```\n  exolve-grid:\n    000\n    0.0\n    000\n  exolve-across:\n    #a3 [A] Ace (3)\n    #a1 [C] Den (3)\n  exolve-down:\n    #a3 [A] And (3)\n    #c3 [B] Ein (3)\n```\nSimilarly, if you have a non-numeric clue label (say Q) for a nodir clue, and\nyou have provided the locations of _all_ its cells (that is, you have provided\nthe locations of at least two cells), _and_ these locations belong to an unclued\nlight in the grid, then the software makes the label of that light be Q.\n\n### Deleted clues\nSometimes, when using nodir clues, you might subsume some across/down clues\nentirely within some nodir clues. In such cases, you might want to not specify\nany clue for the across/down subsumed clue, and you would not even want the\nacross/down clue to get highlighted when navigating the grid/clues. You can\nmark an across/down clue \"deleted\" by simply setting it to \\*. For example:\n```\n  exolve-grid:\n    TUB\n    A.O\n    CKY\n  exolve-across:\n    1 tub (3)\n    3 *\n  exolve-down:\n    1 *\n    2 boy (3)\n  exolve-nodir:\n    #a3 #a2 #a1 #b1 #c1 [1] tacky (5)\n  \n```\n\n## `exolve-reversals`\nThe grid implies a sequence of cells for each light (top-to-left for across\nclues and top-to-bottom for down clues). You can reverse this orientation for\nselected lights by specifying their starting and ending cells on one (or more)\n`exolve-reversals` lines. For example:\n```\n  exolve-reversals: a5-a10 r10c2-r4c2\n```\nIn this example, the across light running in the bottom row from columns\n5 to 10 will get reversed, as will the down light running in the second\ncolumn from row 10 down to row 4.\n\nNote that the starting and ending cells should be listed (separated by a\nhyphen) *in their original, unreversed order.* The reversal modifies\nclue/light-numbering, as the number is assigned at the new starting cell\n(after reversal).\n\nWhen you reverse an across clue, its distinctive letter suffix becomes \"b\"\n(for \"back\") instead of \"a\". So you can refer to \"12b\" when linking clues,\nwhen specifying lights with coloured cells, etc. Similarly, the letter\nsuffix for a reversed down clue becomes \"u\" instead of \"d\".\n\nReversals can also be done for the vertical clues in 3-D crosswords\n(see below). They should not be done for general nodir clues where you've\nspecified the cells (as you can easily just specify the cells in the desired\norder).\n\n## `exolve-3d`\nA special and popular case of n-dimensional crosswords is \"3-D\" crosswords, and\nExolve offers direct support to create such puzzles, rendering them in a nice\nstack of layers of 2-D grids.\n\nYou can specify that a crossword is a 3-D crossword by using the `exolve-3d`\nsection. The number of \"layers\" in the 3-D scheme is specified as a parameter,\nlike `exolve-3d: 3`. This number must be an integer that is bigger than 1 and\nmust be a divisor of the height of the grid. Additionally, you can control the\nappearance of the 3-D grid (which looks like stacked parallelograms, one for\neach layer) with two optional parameters that follow the number of layers:\nangle (in degrees, default is 55) and each cell parallelogram's height-to-width\nratio (default is 0.75). So, the `exolve-3d` line looks like:\n`exolve-3d: \u003cnum-layers\u003e [\u003cangle-degrees\u003e [\u003cheight-to-width-ratio\u003e]]`.\nThe following line would make the parallelograms look much more \"spaced out\":\n```\n  exolve-3d: 5 45 1.4\n```\nAnd this one uses less space vertically, rendering very \"squished\"\nparallelograms:\n```\n  exolve-3d: 5 35 0.6\n```\n\nThe grid in a 3-D crossword should be provided layer-by-layer (starting at the\ntop layer). Note that the height of the grid divided by the number of layers is\nthe depth of each layer.\n\nThe clues in a 3-D crossword should be provided using `exolve-3d-across`,\n`exolve-3d-away`, and `exolve-3d-down` clues sections (the `exolve-across`\nand `exolve-down` sections should not be used).\n\nFor example:\n```\n  exolve-width: 3\n  exolve-height: 9\n  exolve-3d: 3\n  exolve-grid:\n    0 0 0\n    0 . 0\n    0 0 0\n\n    0 . 0\n    . . .\n    0 . 0\n\n    0 0 0\n    0 . 0\n    0 0 0\n  exolve-3d-across:\n    1 Across clue for a7-c7 (3)\n    3 Across clue for a9-c9 (3)\n    5 Across clue for a1-c1 (3)\n    7 Across clue for a3-c3 (3)\n  exolve-3d-away:\n    1 Away clue for a7-a9 (3)\n    2 Away clue for c7-c9 (3)\n    5 Away clue for a1-a3 (3)\n    6 Away clue for c1-c3 (3)\n  exolve-3d-down: \n    1 Down clue for a7,a4,a1 (3)\n    2 Down clue for c7,c4,c1 (3)\n    3 Down clue for a9,a6,a3 (3)\n    4 Down clue for c9,c6,c3 (3)\n\n```\n\nWhen you need to specify a clue number + direction in a 3-D crossword (for\nexample, for linking clues, or for specifying ninas, etc.), you should use the\nfollowing 2-letter suffixes: \"ac\"/\"aw\"/\"dn\". You can reverse the orientation of\nselected lights in a 3-D crossword, including the lights running vertically\ndown through the layers. Note that the \"normal\" (unreversed) orientations are\nacross, away, and down. For reversed lights, you should use the suffixes \"ba\"\n(for \"back\"), \"to\" (for \"towards\"), and \"dn\" (for \"down\").  These suffixes only\nwork in 3-D crosswords.\n\nA few more notes on 3-D crosswords:\n\n- Clue numbering goes top layer to bottom layer, and within each layer it starts\n  at the nearest row and goes back, and within each row, it goes left to right.\n- You can use bars to additionally break across/back/away/towards lights (but\n  not down/up lights).\n- As you can probably tell, \"away\" and \"towards\" lights are internally\n  implemented as what would have been \"down\" lights in a 2-D crossword. You\n  cannot use the normal 2-D directional suffixes (\"a\", \"b\", \"d\", u\") in 3-D\n  crosswords, to avoid confusion.\n- The specified angle should be in the range [20, 90], and the specified ratio\n  must be in the range [0.4, 1.6].\n- You cannot have diagramless cells in a 3-D crossword (for now!).\n- Internally, Exolve separates the layers using horizontal bars.\n- If you specify `exolve-cell-size` then the specified width/height become the\n  width/height of the cell's parallelogram, ignoring any height-to-width ratio\n  specified on the `exolve-3d` line.\n- Hyphens and word-end separators are not displayed in 3-D down/up lights.\n\n## `exolve-explanations`\nIn a grid that includes solutions, the setter may provide additional notes,\nexplanations, commentary, etc., in an `exolve-explanations` section. Just like\nthe [`exolve-preamble`](#exolve-preamble-exolve-prelude) section, this section\nalso has multiple lines, and these lines can include HTML tags. The contents get\nrevealed when the solver clicks on \"Reveal all\".\n```\n  exolve-explanations:\n    This puzzle's hidden message was driven by occasional hiccups in\n    some \u003ci\u003enoted\u003c/i\u003e interactive solvers.\n```\n\n## `exolve-nina`\nIf a setter has included ninas in the grid, and if they are putting up a version\nthat has solutions included, they can also specify where the ninas are, and in\nthat case, a \"Show ninas\" control button will get displayed. Each nina should\nuse its own `exolve-nina` line, and the ninas will get displayed in different\ncolours upon clicking \"Show ninas\" (as well as \"Reveal all\").\n\nThe squares involved in a nina are specified in the\n[extended chessboard notation](#extended-chessboard-notation)\ndescribed above. It can also use clue indices like A12 and D33 (with uppercase\nA or D preceding the clue number) or like 12a, 12A, 33d, or 33D. Example:\n```\n  exolve-nina: j5 j7 j9 c10r11 j13\n  exolve-nina: a7 b7 c7 d7 e7 A12 16d\n```\nThis example is from a puzzle with two ninas. The first one is in the 10th\ncolumn (\"j\"), and the second one is in the seventh row from the bottom as well\nas all the cells in the A12 and D16 clues.\n\nYou can optionally pick the colour that the nina cells will have when revealed,\nby including it in the list (anywhere). You can use a valid\n[HTML colour name](https://www.w3schools.com/colors/colors_names.asp) or code\n(but without spaces). Example:\n```\n  exolve-nina: dodgerblue j5 j7 j9 c10r11 j13\n  exolve-nina: a7 b7 c7 d7 e7 A12 16d #ff00a1\n```\nNote that the colour that you specify will get shown transparently overlaid over\nthe normal cell colour (white, unless changed with `exolve-option:colour-cell`)\nas well as over the active cell colour.\n\nThe colouring can be forced to be limited to a bar at the bottom of the cell,\nusing `exolve-option: colour-only-cell-bottom`.\n\nYou can also have ninas that involve arbitrary letters/words from within the\ntext of the clues or the prelude. This involves a little bit of HTML.\nJust enclose the text that you want to highlight as a nina in a \"span\" tag,\ngiving it a unique class name, and specify that class name in the `exolve-nina`\n(the name should not be a letter followed by a number, so that it is not\nconfused with the extended chessboard notation or clue indices). For example:\n```\n  exolve-nina: acrostic-1\n  exolve-across\n    1 \u003cspan class=\"acrostic-1\"\u003eW\u003c/span\u003eherefore? (3)\n    2 \u003cspan class=\"acrostic-1\"\u003eO\u003c/span\u003epen borders working (2)\n    2 \u003cspan class=\"acrostic-1\"\u003eW\u003c/span\u003eindow (8)\n```\nSpan-class-specified and square-location-specified ninas can be intermixed too,\nsuch as:\n```\n  exolve-nina: a4 c4 clue-nina\n```\n\n## `exolve-colour`, `exolve-color`\nSpecific cells in the grid may be coloured using this feature. The squares\ninvolved are again specified in the\n[extended chessboard notation](#extended-chessboard-notation)\nor with clue\nindices like A12 and D32 (with uppercase A or D preceding the clue number) or\nlike 12a, 12A, 33d, or 33D.\n```\n  exolve-colour: palegreen j5 j7 c10r9 c10r11 j13 A12 16D\n```\nThe colour is specified anywhere in the space-separated list and\ncan be any valid\n[HTML colour name](https://www.w3schools.com/colors/colors_names.asp) or code\n(but without spaces).\n\nNote that the colour that you specify will get shown transparently overlaid over\nthe normal cell colour (white, unless changed with `exolve-option:colour-cell`)\nas well as over the active cell colour.\n\nThe colouring can be forced to be limited to a bar at the bottom of the cell,\nusing `exolve-option: colour-only-cell-bottom`.\n\n## `exolve-question`\nOften, the setter might have hidden additional information for the solver to\ndiscover (such as ninas), or may simply want to survey solvers about something\n(such as their favourite clues). The `exolve-question` section can be used to\ndo this. Example:\n```\n  exolve-question: What is the nina that begins with S?\n  exolve-question: What is the nina that requests people to find a famous TV series? (3,4) GET LOST\n  exolve-question: Your name (30)*\n```\nIn this example, there are three questions. An answer has also been provided for\nthe second question. The part following the enum (\"(3,4)\"), if there is an\nenum, is treated as the answer (see the\n[`exolve-across`/`exolve-down`](#exolve-across-exolve-down-exolve-nodir) section\nfor details on enums). The answer is not shown in the displayed question. When\nthe solver clicks \"Reveal all\", answers to all questions for which answers have\nbeen provided do get revealed.\n\nQuestions that specify an enum get displayed with placeholder question-marks\nformatted according to the enum: ??? for (3), ??? ?? for (3,2), and ??-??? for\n(2,3), when no entry has been made in the answer slot.\n\nIf an enum in an `exolve-question` is immediately followed by an asterisk (like\n\"(30)\\*\" above—note that there is no space before the asterisk), then the enum\nis not displayed to the solver; it is only used to determine the size of the\nanswer box to show. The placeholder questionmarks are also not shown.\n\nAnswers are automatically converted to uppercase. But lowercase answers can\nbe permitted by adding \"[lowercase-ok]\" immediately after the enum. For\nexample:\n```\n  exolve-question: That quirky poet? (1,1,8) [lowercase-ok] e e cummings\n  exolve-question: A long comment from you, please (300)* [lowercase-ok]\n```\n\nIf the setter has created an `exolve-submit` section, then answers to each\n`exolve-question` are also sent to the submit URL (see below for details).\n\n## `exolve-submit`\nSetters/publishers can use the exolve-submit section to receive submissions\nfrom solvers. The format is easily seen from this example:\n```\n  exolve-submit: https://something k k1 k2\n```\nThe first parameter is the URL. The second parameter k is the key for the\nletters entered in the grid. The letters are all strung together, row by row.\nDots for blocked squares are also included. In a diagramless square, if the\nsolver has proposed placing a block, then it is represented by \"1\" in the\nsolution string. Consider this grid-fill:\n```\n  ACE\n  R.R\n  EAR\n```\nWhen submitting, the solution letters will be sent as the string \"ACER.REAR\" for\nthis example.\n\nSubsqeuent parameters (k1, k2) are the keys for any questions posed using\n`exolve-question` sections. So, for this example, if the answers entered for the\n`exolve-questions` are ANSWER1, ANSWER2, respectively, then the full URL for\nsubmission will be:\n```\n  https://something\u0026k=ACER.REAR\u0026k1=ANSWER1\u0026k2=ANSWER2\n``` \n\nThe submission is made using HTTP GET.\n\nOne easy way to set up submissions is to create a Google Form with one Google\nForm question for the solution letters, and one Google Form question for each\n`exolve-question` (using \"Long answer\" or \"Short answer\" as the question type\nin each case). Then, click on the \"Get prefilled link\" menu option. Fill some\ndummy text in each of the form fields shown, and then click on \"Get Link.\" This\nwill copy a URL like this:\n```\nhttps://docs.google.com/forms/d/e/1FAIpQLSeezqRzI7N77Huk8_TYwAB40wp2E6HgQaOsNPMc1KgJp-7O8Q/viewform?usp=pp_url\u0026entry.411104056=sol\u0026entry.464339112=col\u0026entry.861079418=lif\u0026entry.1052922113=nam\n```\nDelete all the `=\u003cvalue\u003e` parts from this, and replace the `\u0026` separators with\nspaces, to get something like this:\n```\n  exolve-submit: https://docs.google.com/forms/d/e/1FAIpQLSeezqRzI7N77Huk8_TYwAB40wp2E6HgQaOsNPMc1KgJp-7O8Q/viewform?usp=pp_url entry.411104056 entry.464339112 entry.861079418 entry.1052922113\n```\nWhen solvers submit, links of this sort will take them to a Google Forms page\nwhere they have to click again on a \"Submit\" button. Instead, you can\nmodify the URL to make a direct submission link, like this:\n```\n  exolve-submit: https://docs.google.com/forms/d/e/1FAIpQLSeezqRzI7N77Huk8_TYwAB40wp2E6HgQaOsNPMc1KgJp-7O8Q/formResponse?submit=SUBMIT entry.411104056 entry.464339112 entry.861079418 entry.1052922113\n```\n\n### Automatically scoring submitted solutions in Google Forms\n\n- Link the form to a spreadsheet (there is an option under \"Responses\").\n\n- Open the spreadsheet and click on `Extensions \u003e Apps Script`.\n\n- Delete all the skeletal, pre-populated `function myFunction() ..` code lines\n  and replace them with the following lines of code:\n\n```\n  function SCORE(solution) {\n    const expected = 'REPLACE..ME';\n    var matched = 0;\n    for (var i = 0; i \u003c expected.length; i++) {\n      if (i \u003e= solution.length) {\n        break;\n      }\n      if (expected.charAt(i) == solution.charAt(i) \u0026\u0026\n          expected.charAt(i) != '.') {\n        matched++;\n      }\n    }\n    return matched;\n  }\n```\n\n- Change the `REPLACE..ME` text to be the solution string for the crossword. You\n  can submit an all-correct entry to see what this should be (essentially, all\n  the letters strung together, row-by-row, with a \".\" for every black cell. So,\n  for a 15x15 grid, there should be 225 letters + periods in this string.\n\n- Save the project and deploy it, giving it a name. [See these instructions if you\n  run into any\n  problems](https://developers.google.com/apps-script/guides/sheets/functions).\n\n- Now, add a column to the spreadsheet beyond the last column. Give it the heading\n  \"Score\". Use the formula `=SCORE(B2)` in the second row, and then extend the\n  formula to all the rows. This column will now show the number of correct letters\n  for each submission.\n\n## `exolve-option`\nIn this single-line, repeatable section, the setter can specify certain options.\nMultiple, space-separated options may be provided on each exolve-option line.\nFor options that need a value (provided after a colon), there should not be\nany leading space after the colon. Option names and values are case-sensitive.\nThe list of currently supported options is as follows:\n\n- **`add-extraction-slots[:\u003cchars\u003e]`** Use this to add \"extraction slots\"\n  prior to each clue, where solvers can record something (such as a letter\n  somehow extracted from each clue). The number of slots can be specified with\n  the optional `\u003cchars\u003e` parameter (default is 1). The recorded entries are\n  saved in the state.\n- **`allow-chars:\u003cchars\u003e`** If this option is specified, then we allow solvers\n  to enter any of the characters (which would typically be special characters\n  or digits)  listed in `\u003cchars\u003e`. For example, `allow-chars:#!7` will allow the\n  characters `#`, `!`, and `7` to be used in the grid and will allow users to\n  type them. If any of these special characters is also a decorator or is a\n  character with a special meaning in grid specifications (i.e., one of\n  `|_+@!~*.?`), then to specify it in the grid, you have to prefix it with `\u0026`.\n- **`allow-digits`** If this option is specified, then we allow solvers to enter\n  digits in cells.\n- **`clues-at-right-in-two-columns`** Deprecated option that has no effect now\n  as we always try to place he clues to the right if there is space.\n- **`clues-panel-lines:\u003cN\u003e`** Limit the across/down/nodir clues boxes to\n  a maximum of about N lines of text, adding scrollbars if needed.\n- **`colour-\u003cname\u003e:\u003cc\u003e` or `color-\u003cname\u003e:\u003cc\u003e`** Set the\n  colour of the element named \u0026lt;name\u0026gt; to \u0026lt;c\u0026gt;, which should be a\n  valid HTML colour name/code (do not include spaces within it though). See the\n  \"Colour schemes\" subsection below for details.\n- **`columnar-layout`** Deprecated. This option was used to create a\n  newspaper-like layout, but it never worked reliably across platforms.\n  You still get nice, \"flowing\" layouts when printing.\n- **`font-family:\u003cff\u003e`** Set the font-family CSS value (for clues, preamble,\n  etc.). You can set this to **inherit** to override Exolve's default of\n  **serif**.\n- **`font-size:\u003cfs\u003e`** Set the font-size CSS value (for clues, preamble,\n  etc.). Exolve's default is **16px**.\n- **`grid-background:\u003cc\u003e`** \n  This option is deprecated and ignored now. Please use color-background\n  (see above).\n- **`hide-copy-placeholder-buttons`** This is an option that is only applicable\n  when there are nodir clues without cells explicitly specified. It turns off\n  the display of buttons to copy placeholder texts in those cases (see the\n  subsection below on \"Jigsaw puzzle clues\").\n- **`hide-inferred-numbers`** If this option is specified, then the software\n  does not display any clue numbers that were automatically inferred. Setters\n  using non-numeric clue labels may want to specify this option.\n- **`highlight-overwritten-seconds:\u003cs\u003e`** Set the time for which overwritten\n  cell entries (i.e., values changed from non-blank to a different non-blank\n  letter) are highlighted. The parameter `\u003cs\u003e` should be a number \u003e= 0 (seconds).\n  If 0, this highlighting behaviour is turned off. The default is 5 seconds.\n- **`ignore-enum-mismatch`** If this option is specified, then any generated\n  warnings about enum-mismatches are suppressed.\n- **`ignore-unclued`** If this option is specified, then any generated warnings\n  about missing clues are suppressed.\n  **`no-auto-solution-in-anno`** In a grid with solutions, we automatically\n  show the solution next to the clue, when \"Reveal all!\" or \"Reveal this\" is\n  used. Set this option to disable that. Useful if you want to control\n  how the solution appears in the anno. Also see the note on \"anno\" in the\n  section on clues.\n- **`no-nina-button`** In a grid with ninas, a nina-toggling button gets\n  shown normally. You can suppress the creation of this button by using this\n  option. If you do have ninas and you've used this option, once \"Reveal all\"\n  is used, the button does get shown (in case the user wants to hide the ninas,\n  say for printing). If at that point, the user does \"Hide ninas\" or\n  \"Clear all\", then the nina button is hidden again.\n- **`no-smart-coloring`** or **`no-smart-colouring`** If this option is\n  specified, then we do not try [\"smart colouring\"](#smart-colouring).\n- **`colour-only-cell-bottom`** or **`color-only-cell-bottom`** If this option\n  is specified, then for cell colouring (for cells that have exolve-colour\n  specified or for cells that are parts of ninas), we do not colour the\n  whole cell; instead, we just colour a bar at the bottom of the cell. This\n  can be useful for printing too, as colouring the whole cell tends to blur\n  the text in it when printing). This option is ignored in 3-d (for now).\n- **`offset-left:\u003cN\u003e`** Draw the grid with this much space to the left and\n  to the right (N pixels). Useful for drawing additional art around the grid\n  using `customizeExolve()`, for example.\n- **`offset-top:\u003cN\u003e`** Draw the grid with this much space above and under\n  it (N pixels). Useful for drawing additional art around the grid using\n  `customizeExolve()`, for example.\n- **`override-number-\u003cname\u003e:\u003cN\u003e`** An advanced override function that will\n  set the property named `\u003cname\u003e` in the puzzle to the numeric value `\u003cN\u003e`.\n  This can be used to override properties for which there is no explicit\n  dedicated option, such as `GRIDLINE`.\n- **`rebus-cells`** Allow multiple letters to be entered in cells. See\n  [`Rebus cells`](#rebus-cells) for details.\n- **`print-completed-3cols` and `print-incomplete-2cols`** These option\n  override the default layout choices used for printing puzzles (and creating\n  PDFs). By default, a completed puzzle is printed in 2 columns\n  (`print-completed-3cols` makes that 3 columns) while an incomplete puzzle is\n  printed in 3 columns (`print-incomplete-2cols` makes that 2 columns). See\n  [`Printing`](#printing) for more details.\n- **`show-cell-level-buttons`** If this option is specified, then \"Check cell\"\n  and \"Reveal cell\" buttons are also shown, in an extra row of buttons, for\n  crosswords with solutions provided.\n- **`top-clue-clearance:\u003cN\u003e`** Add N pixels space between the top of the grid\n  and the bottom of the clue shown on top. Defaults to 0. You can set this\n  to something like `20`, but note that if the clue text is very long then\n  this setting will get overridden.\n- **`webifi`** Provide a \"Webifi\" link under the crossword. See the\n  [Webifi section](#webifi) for details.\n\n### Colour schemes\nUsing a bunch of `exolve-option: colour-\u003cname\u003e:\u003cc\u003e` (or, of course,\n`exolve-option: color-\u003cname\u003e:\u003cc\u003e`) options, the colour scheme of\na puzzle can be altered comprehensively. The following table lists all possible\nsupported values for `colour-\u003cname\u003e`, their default values (that you would\nbe overriding), and descriptions.\n\n| Option                     | Default value | What gets coloured                |\n|----------------------------|---------------|-----------------------------------|\n| `colour-active`            | mistyrose     | Squares for the light(s) currently active.|\n| `colour-active-clue`       | mistyrose     | The current clue(s) in the clues list get(s) this as background colour.|\n| `colour-anno`              | darkgreen     | The text of the annotations.       |\n| `colour-arrow`             | mistyrose     | The right- or down-arrow (or left-, or up-arrow in crosswords with reversals) in the square where the solver is typing.|\n| `colour-background`        | black         | The background: blocked squares and bars.|\n| `colour-button`            | #4caf50       | Buttons (Check/Reveal etc).       |\n| `colour-button-hover`      | darkgreen     | Buttons with mouseover.           |\n| `colour-button-text`       | white         | The text in buttons.              |\n| `colour-caret`             | gray          | The flashing cursor in the square where the solver is typing.|\n| `colour-cell`              | white         | Light squares.                    |\n| `colour-circle`            | gray          | Any circles drawn with the @ decorator.|\n| `colour-circle-input`      | gray          | Same as above, in the square where the solver is typing.|\n| `colour-currclue`          | white         | Background for the current clue above the grid.|\n| `colour-def-underline`     | #3eb0ff       | The underline in a revealed definition within a clue.|\n| `colour-hint`              | dodgerblue    | The text of the hints.       |\n| `colour-hint-bulb`         | dodgerblue    | The text of the hint icon (only relevant if you override the default icon, which is a lightbulb, with text). |\n| `colour-imp-text`          | darkgreen     | \"Important\" text: setter's name, answer entries, grid-filling status.|\n| `colour-input`             | #ffb6b4       | The light square where the solver is typing.|\n| `colour-light-label`       | black         | The number (or nun-numeric label) of a clue, in its first square. |\n| `colour-light-label-input` | black         | Same as above, in the square where the solver is typing.|\n| `colour-light-text`        | black         | The typed solution letters in lights.|\n| `colour-light-text-input`  | black         | Same as above, in the square where the solver is typing.|\n| `colour-orphan`            | linen         | The background colour of the current clue(s) without known location(s) in the grid.|\n| `colour-overwritten-end`   | #bb00bb       | The end-colour of the animation to highlight overwritten cells.|\n| `colour-overwritten-start` | #ff00ff       | The start-colour of the animation to highlight overwritten cells.|\n| `colour-prefill`           | blue          | Any letters pre-filled with the ! decorator.|\n| `colour-separator`         | blue          | The hyphens and dashes in multi-word lights. |\n| `colour-small-button`      | inherit       | Small buttons in the current clue(s).|\n| `colour-small-button-hover`| lightpink     | Small buttons with mouseover.     |\n| `colour-small-button-text` | darkgreen     | The text in small buttons.        |\n| `colour-solution`          | dodgerblue    | The solution part of the anno, as well as entries in placeholder blanks.|\n| `colour-solved`            | dodgerblue    | The clue number in the list of clues, once the clue has been solved.|\n\nWhen you set any of the above options, that modification applies to\nboth the \"light mode\" and the \"dark mode\" (see next section). If you want\nto only modify a color in light mode or in dark mode, then use\n`exolve-option: colour-light.\u003cname\u003e\u003cc\u003e` or\n`exolve-option: colour-dark.\u003cname\u003e\u003cc\u003e`.\n\nSetting `colour-arrow` and `colour-caret` to the same colour as `colour-input`\nwill make them invisible (if so desired).\n\nFor example, the following options will make the rendering look quite\nsimilar to the Guardian's colour scheme (as of May 2020).\n```\n  exolve-option: colour-active:lightyellow\n  exolve-option: colour-input:#bb3b80 color-arrow:lightyellow\n  exolve-option: colour-light-label-input:white\n  exolve-option: colour-light-text-input:white\n  exolve-option: colour-button:#bb3b80 color-button-hover:purple\n```\n\n### Dark and light modes\n\nIf we detect that the crossword is getting rendered in dark mode, then we make\na few tweaks to the colours. The detection is based upon whether the average\nvalue of RGB for the font colour (on the root Exolve DIV element) is \u003e= 155.\n\nThe tweaks made are to the following colours:\n\n- Colour `currclue` is set to black (but see \"Smart colouring\" below).\n- Colour `active-clue` is set to #663366.\n- Colour `orphan` is set to #663300.\n- Colour `anno` is set to lightgreen.\n- Colour `imp-text` is set to lightgreen.\n- Colour `small-button-text` is set to lightgreen.\n- Colour `small-button-hover` is set to #330066.\n\nAs mentioned in the previous section, when you override a colour with\n`exolve-option: colour-\u003cname\u003e:\u003cc\u003e`, it gets overridden for both light mode\nand dark mode. If you only want to specify an overriding colour for light\nmode (or dark mode) then use\n`exolve-option: colour-light.\u003cname\u003e\u003cc\u003e` (or\n`exolve-option: colour-dark.\u003cname\u003e\u003cc\u003e`).\n\nNote that dark mode detection and handling is done when the crossword is\nfirst rendered. If the user changes the browser theme's dark mode settings,\nthen the page would need to be reloaded for the crossword rendering to be\nupdated.\n\n### Smart colouring\n\nSmart colouring is on by default. Currently, it just affects the colour of\nthe background of the top clue, possibly overriding whatever was set in\n`colour-currclue` (the light/dark mode defaults for which are white/black\nrespectively).\n\nWe try to set the background colour of the top clue to be the same colour\nas the parent element of the root Exolve DIV element, if there is sufficient\ncontrast between that colour and the font colour. Here's the heuristic\nalgorithm used for doing this:\n```\n  bg = Colour of the background of parent of root element. This is\n       found by going up to higher level parents if the current\n       level's background is transparent. If the result is transparent,\n       then we set bg to white.\n  bgBrightness = Average of RGB values in bg.\n  fgBrightness = Average of RGB values in font colour.\n\n  if ((fgBrightness \u003c 155 \u0026\u0026 bgBrightness \u003e= 200) ||\n      (fgBrightness \u003e= 155 \u0026\u0026 bgBrightness \u003c 75)) {\n    this.colorScheme['currclue'] = bg;\n  }\n```\n\nNote that if you're using images to create backgrounds, then this heuristic\nmay not work, so, in that case, you should use\n`exolve-option: no-smart-colouring`.\n\n## `exolve-language`\n\nYou can create crosswords in pretty much any language apart from English,\nusing Exolve. You need to specify a line that looks like:\n```\n  exolve-language: \u003clang\u003e \u003cScript\u003e [\u003cmax-char-codes-per-letter\u003e]\n```\nHere, \u0026lt;lang\u0026gt; is a\n[language code](https://www.w3schools.com/tags/ref_language_codes.asp)\nsuch as \"ru\" or \"hi\" and \u0026lt;Script\u0026gt; is the name of the\n[Script](https://tc39.es/ecma262/#table-unicode-script-values)\nto use for that language, such as \"Devanagari\" or \"Cyrillic\".\nExamples:\n```\n  exolve-language: hi Devanagari\n```\n```\n  exolve-language: ru Cyrillic\n```\n\nOn an exolve-language line, you can optionally specify a third parameter,\n`\u003cmax-char-codes-per-letter\u003e`. In some languages such as those using the\nDevanagari script, multiple unicode characters are combined together to\nform a single compound letter (for example, स्सा in Devanagari is made up \nof four characters). In these situations, you can specify\n\u0026lt;max-char-codes-per-letter\u0026gt; as the limit on how many characters you want\nto allow to go into a composite letter, at most. For Devanagari, the software\nalready sets this to 5 (but you can override that if you specify a value\nhere). When \u0026lt;max-char-codes-per-letter\u0026gt; is greater than 1, you can append\nto existing characters within a cell by pressing the Shift key, or by\ndouble-clicking in the cell. If a cell already has a multi-char letter in\nit, then you can append more characters to it (or delete existing them)\nwhen you come to it by clicking on it or via auto-advancing from an\nadjacent cell (i.e., the Shift key or double-click are not needed in that\ncase).\n\nYou may also want to provide\n[placeholder blanks](#forcing-the-display-of-placeholder-blanks)\nfor languages such as Hindi that have compound letters. Exolve recognizes\nmulti-character letters separated by spaces within placeholders. So,\nif you have a 3-letter clue, and the placeholder text contains\n\"उ स्ता द\"\nthen copying this into a 3-letter entry will place \n\"उ\" in the first cell,\n\"स्ता\" in the second cell, and\n\"द\" in the third cell.\n\nWhen you use a language other than English, you may also want to change the\ntext displayed in various buttons etc. to that language. You can do that\nusing an `exolve-relabel` section (see below). Further, you may want to let\nsolvers know that they have to use a suitable input mechanism for the\nScript you have specified (Google Input Tools works well on Chrome).\n\n## `exolve-relabel`\n\nYou can change the text (and hover-text) of any button or label or any message\nin the Exolve interface. This is particularly useful if you want to set a\ncrossword in a language other than English. Every piece of text has a name,\nand you can change it using this syntax within an `exolve-relabel` section:\n```\n    \u003cname\u003e: \u003cnew label\u003e\n```\nThe section can contain multiple relabeling lines. Example:\n```\n  exolve-relabel:\n    clear: \u003cb\u003eErase\u003c/b\u003e this entry\n    clear.hover: Careful!\n    across-label: \u003ci\u003eSwimming Across!\u003c/i\u003e\n    down-label: \u003ci\u003eSinking Down (नीचे)!\u003c/i\u003e\n    submit.hover: Think twice before submitting\n```\nHere are all the names of pieces of text that you can relabel:\n| Name             | Default text                         |\n|------------------|--------------------------------------|\n| `clear`          | Clear this                           |\n| `clear.hover`    | Clear highlighted clues and squares. Clear crossers from full clues with a second click. Shortcut: Ctrl-q.|\n| `clear-all`      | Clear all!                           |\n| `clear-all.hover` | Clear everything! A second click clears any placeholder entries in clues. Shortcut: Ctrl-Q.|\n| `check`          | Check this                           |\n| `checkcell`      | Check cell                           |\n| `check.hover`    | Erase mistakes in highlighted squares. Long-click to check the just current cell.|\n| `checkcell.hover`| Erase the current cell if it's incorrect. |\n| `check-all`      | Check all!                           |\n| `check-all.hover`| Erase all mistakes. Reveal any available annos if no mistakes.|\n| `copy-notes`     | Copy notes|\n| `copy-notes.hover`| Copy these notes to the clipboard, including any formatting.|\n| `email-notes`    | Email notes|\n| `email-notes.hover`| Compose an email containing these notes as plain text. You can edit the draft before sending.|\n| `email-notes-recipients.hover`|Draft recipient(s): |\n| `reveal`         | Reveal this                          |\n| `revealcell`     | Reveal cell                          |\n| `reveal.hover`   | Reveal highlighted clue/squares. Long-click to reveal the just current cell.|\n| `revealcell.hover`| Reveal the solution letter in the current cell. |\n| `show-ninas`     | Show ninas                           |\n| `show-ninas.hover` | Show ninas hidden in the grid/clues.|\n| `hide-ninas`     | Hide ninas                           |\n| `hide-ninas.hover` | Hide ninas shown in the grid/clues. |\n| `reveal-all`     | Reveal all!                          |\n| `reveal-all.hover` | Reveal all solutions, available annos, answers, notes! |\n| `hint-bulb.hover`| Click to see a hint. |\n| `hint.hover`| Click to hide hints. |\n| `hint`           | Hint |\n| `hint-bulb`      | \u0026#128161; |\n| `submit`         | Submit                               |\n| `submit.hover`   | Submit the solution!                 |\n| `setter-by`      | By                                   |\n| `curr-clue-prev` | \u0026lsaquo;                             |\n| `curr-clue-prev.hover` | Previous clue.                 |\n| `curr-clue-next` | \u0026rsaquo;                             |\n| `curr-clue-next.hover` | Next clue.                     |\n| `squares-filled` | Squares filled                       |\n| `across-label`   | Across                               |\n| `down-label`     | Down                                 |\n| `3d-ac-label`     | Across \u0026 Back                       |\n| `3d-aw-label`     | Away \u0026 Towards                      |\n| `3d-dn-label`     | Down \u0026 Up                           |\n| `nodir-label`    | Other                                |\n| `tools-link`     | Exolve                               |\n| `tools-link.hover` | Crossword software: [VERSION]: Show/hide panel with info/help and links to report a bug, manage storage, etc.|\n| `tools-msg`      | [Longish list of all control keys, and more...]|\n| `alts.hover`     | This is an alternative solution to the clue. Clicking on it will set any currently visible letters in it to this variant. If the setter has created an alternative solution group with more than one cell (group numbers are shown in superscripts of solution variants) then clicking will set all revealed visible letters in the group to reflect this variant.|\n| `crossword-id`   | Crossword ID                         |\n| `notes`          | Notes                                |\n| `notes.hover`    | Show/hide notes panel.               |\n| `notes-help`     | Ctrl-/ takes you to the current clue's notes (or overall notes) and back (if already there). Ctrl-\\* adds a * prefix to the current clue's notes. Hovering over a clue's notes shows the clue as a tooltip.|\n| `jotter`         | Jotter                               |\n| `jotter.hover`   | Show/hide a jotting pad that also lets you try out anagrams and subtractions.|\n| `jotter-text.hover`|You can shuffle letters by clicking above. If you enter something like \"Alphabet - betas  =\" then it will be replaced by \"lpha - s\" (subtraction of common letters). |\n| `maker-info`     | Exolve-maker info                    |\n| `manage-storage` | Manage local storage                 |\n| `manage-storage.hover` | View puzzle Ids for which state has been saved. Delete old saved states to free up local storage space if needed.|\n| `manage-storage-close` | Close (manage storage)         |\n| `manage-storage-close.hover` | Close the local storage management panel.|\n| `exolve-link`    | Exolve-on-GitHub                     |\n| `exolve-link.hover`| Visit the Exolve open-source repository on GitHub, with a detailed user guide.|\n| `report-bug`     | Report-Bug                                  |\n| `report-bug.hover`| Report a bug on the GitHub page for Exolve |\n| `exolve-exet-etc`| Community |\n| `exolve-exet-etc.hover`| Exolve-Exet-Etc: a Google Group to get release updates, discuss usage and features for Exolve, Exet, etc.|\n| `webifi`         | Webifi                               |\n| `webifi.hover`   | Show/hide \"Webifi\", the interactive-fictionesque text/audio interface.|\n| `saving-msg`     | Your entries are auto-saved in the browser's local storage.|\n| `saving-bookmark`| You can share the state using this link:|\n| `saving-url`     | URL                                  |\n| `shuffle`        | Jotting pad: (click here to shuffle) |\n| `shuffle.hover`  | Shuffle selected text (or all text, if none selected).|\n| `across-letter`  | a                                    |\n| `down-letter`    | d                                    |\n| `back-letter`    | b                                    |\n| `up-letter`      | u                                    |\n| `3d-ac`          | ac                                   |\n| `3d-ba`          | ba                                   |\n| `3d-aw`          | aw                                   |\n| `3d-to`          | to                                   |\n| `3d-dn`          | dn                                   |\n| `3d-up`          | up                                   |\n| `mark-clue.hover` | Click to forcibly mark/unmark as solved. \u003csub\u003e(Only used for clue labels on clues that do not have all their cell-associations known)\u003c/sub\u003e|\n| `placeholder.hover` | You can record your solution here before copying to squares. |\n| `placeholder-copy` | \u0026#8690; |\n| `placeholder-copy.hover`| Copy into currently highlighted squares. |\n| `confirm-clear-all` | Are you sure you want to clear every entry!? |\n| `confirm-clear-all-orphans1` | Are you sure you want to clear every entry!? (Placeholder entries in clues will not be cleared. To clear the placeholders, click on clear-all again after clearing the grid.) |\n| `confirm-clear-all-orphans2` | Are you sure you want to clear every entry including all the placeholder entries in clues!? |\n| `confirm-clear-all` | Are you sure you want to clear every entry!? |\n| `confirm-clear-all-orphans1` | Are you sure you want to clear every entry!?  (The placeholder entries will not be cleared. To clear the placeholders, click on clear-all again after clearing the grid.) |\n| `confirm-clear-all-orphans2` | Are you sure you want to clear every entry including all the placeholder entries!? |\n| `confirm-check-all` | Are you sure you want to clear mistakes everywhere!? |\n| `confirm-mismatched-copy` | Are you sure you want to do this mismatched copy (#letters-from : #squares-to)? |\n| `confirm-show-ninas` | Are you sure you want to reveal the nina(s)!? |\n| `confirm-reveal-all` | Are you sure you want to reveal the whole solution!? |\n| `confirm-submit` | Are you sure you are ready to submit!? |\n| `confirm-incomplete-submit` | Are you sure you want to submit an INCOMPLETE solution!? |\n| `confirm-delete-id` | Delete puzzle state for puzzle id |\n| `confirm-delete-older` | Delete all puzzle states saved before |\n| `confirm-state-override` | Do you want to override the state saved in this device with the state found in the URL?|\n| `warnings-label` | Please fix, or use \"ignore-unclued\" / \"ignore-enum-mismatch\" [options](https://github.com/viresh-ratnakar/exolve/blob/master/README.md#exolve-option):|\n| `warnings.hover` | Issues detected: click \u0026times; to dismiss.    |\n| `print` | Print                                                  |\n| `print.hover` | Show/hide panel for printing or creating PDFs.   |\n| `print-heading` | Print or create a PDF:                         |\n| `print-size` | Page size:                                        |\n| `print-grid-scale` | Force grid scale to:                        |\n| `print-grid-scale.hover` | Instead of figuring out a good grid-scale factor (from width/height/etc.), force it to this value. |\n| `print-only-grid`| Only grid                                     |\n| `print-only-clues`| Only clues                                   |\n| `print-all`| Grid and clues                                      |\n| `print-margin`| Margin (inches, up to 4 numbers)                 |\n| `print-margin.hover`| The numbers are in inches, and are for top, right, bottom, left. Missing numbers are taken from symmetry or last available values. |\n| `print-font` | Font size:                                        |\n| `print-font-normal` | Normal                                     |\n| `print-font-large` | Large                                       |\n| `print-font-xlarge` | Extra Large                                |\n| `print-font-small` | Small                                       |\n| `print-font-other` | Other                                       |\n| `print-crossword` | Print crossword                              |\n| `print-crossword.hover` | Print just this crossword, hiding any content outside it (Ctrl-B). |\n| `print-page` | Print page                                        |\n| `print-page.hover` | Print the whole page (Ctrl-p or Cmd-P).     |\n| `print-page-wysiwyg` | Print wysiwyg                             |\n| `print-page-wysiwyg.hover` | Print the whole page without reformatting the crossword.|\n| `print-title` | Title                                            |\n| `print-setter` | Setter                                          |\n| `print-preamble` | Preamble                                      |\n| `print-explanations` | Explanations                              |\n| `print-copyright` | Copyright                                    |\n| `print-questions` | Questions                                    |\n| `print-header` | Extra header                                    |\n| `print-header.hover` | Any HTML you provide here will be inserted in the beginning of the puzzle frame before printing |\n| `print-footer` | Extra footer                                    |\n| `print-footer.hover` | Any HTML you provide here will be inserted at the end of the puzzle frame before printing |\n| `print-inksaver`| Inksaver                                       |\n| `print-qrcode`| Add QR code for this puzzle's URL            |\n| `print-qrcode-details`| The QR code (rendered to the right) will be printed to the |\n| `print-qrcode-in-botleft`| bottom-left of the puzzle |\n| `print-qrcode-in-botright`| bottom-right of the puzzle |\n| `print-qrcode-cta-label`| Call to action                         |\n| `print-qrcode-cta`| Solve online                                 |\n| `print-qrcode-size`| QR code size:                               |\n| `print-url-qrcodes`| Convert Explanations URLs to QR codes   |\n| `print-url-qrcodes-heading`| Links             |\n| `show-notes-seq`| Show clue-solving sequence: |\n| `show-notes-entries`| Show entered solutions: |\n| `show-notes-times`| Show clue-solving times:  |\n\nThe `.hover`-suffixed names are for tooltips. The relabelings for these should\nnot include any HTML markup.\n\nThe `confirm-` prefixed messages are all for dialogs seeking confirmation. They\nall have one special feature: if you set them to be emoty strings, then the\nconfirmation step is skipped and the action is directly taken. For example:\n```\n  exolve-relabel:\n    confirm-check-all:\n```\nThe above will skip the confirmation step when the solver clicks on \"Check all!\"\n\n## `exolve-maker`\n\nIn this multiline section, you can include arbitrary metadata about the\npuzzle's construction. The Exet crossword construction web app uses this section\nto record some info such as its version and the lexicon it used. The metadata\ncan be seen after clicking the Exolve button.\n\n## `exolve-force-hyphen-right`, `exolve-force-hyphen-below`, `exolve-force-bar-right`, `exolve-force-bar-below`\n\nEach of these sections is a single-line section that contains a list of cells.\nThis allows you to force the creation of separator hyphens/bars even if not\nindicated by the enums. This might be useful in diagramless puzzles (Exolve\ndoes not try to infer hyphen/bar locations from clues in diagramless puzzles),\nor if, for example, you do not want to give away the full enum for some clues,\nbut just want to provide some/all of the separators. Example:\n```\n  exolve-force-hyphen-right: a5 c4\n  exolve-force-bar-below: a5 c4 d8\n```\n\nNote that if you want to do the opposite of this—that is, if you want to\nsuppress hyphens/bars implied by an enum, then use the trick [described\nearlier](#suppressing-enums-or-separators).\n\n## `exolve-cell-size`\n\nNormally, crosswords are displayed using square cells with width and height\nequal to 31 pixels. For some large grids and/or small displays, the software\nmay use a smaller cell size.\n\nYou can override the cell size and set it to any width and height (that is, you\ncan create rectangular cells that are not squares too) using\n`exolve-cell-size`. For example:\n```\n  exolve-cell-size: 31 43\n```\nThe first parameter is the cell width and the second parameter is the cell\nheight. Both values must be at least 10.\n\n## `exolve-grid-spacing`\n\nNormally, the horizontal spacing between grid cells is `cellW + GRIDLINE`\nand he vertical spacing is `cellH + GRIDLINE`. You can override these as\nfollows:\n```\n  exolve-grid-spacing: 15.5 15.5\n```\n\nYou would typically do this only when using non-standard cell shapes with\n[`exolve-shaped-cell`](#exolve-shaped-cell).\n\n## `exolve-grid-bounds`\n\nNormally, the horizontal and vertical extents of the grid can be computed\nusing width, height, and cell dimensions/spacing. However, if you're using\n[`exolve-shaped-cell`](#exolve-shaped-cell) *and* are placing some cells\nindividually by specifying `[\u003cshape-index\u003e,x,y]` in `exolve-grid`, then\nyou need to specify the overall bounds of the grid using","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fviresh-ratnakar%2Fexolve","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fviresh-ratnakar%2Fexolve","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fviresh-ratnakar%2Fexolve/lists"}