# Feature ideas for GNOME Crosswords
## Ideas for GSoC project
### Notes
#### Aid settings
* Give default settings for each aid, for each puzzle type. For example, unches are expected in cryptics, so the unch detector should be disabled for cryptics.
* Does this mean that the user can also change the aid settings for each puzzle type?
#### Highlights
* I think it's good to use two different types of highlights, depending on the warning:
* Slot highlights, for problems with the slot (like unches and unfillable slots).
* Word highlights, for problems with the word (like non-word-list words and duplicate substrings).
* Word highlight means changing the color of the word.
* Need to consider overlapping highlights.
* Does each aid have its own color?
* Visibility issues?
* What if two highlights of the same type overlap?
* Priority list?
* Split the letter/cell in half and use different colors?
* Alternating colors striped pattern?
* Unique color that means "multiple warnings"?
* What about cell styling colors?
* Mouse hover tooltip that shows the warnings?
### Ideas
1. Detect unches and two-cell-long slots.
* Highlight the slot to warn the user.
* Settings:
* Enable/disable.
* Set minimum slot length.
1. Detect words that are not in the word list.
* Highlight the letters to warn the user.
* Fade away the highlight after a while. By then, it's clear that the user is okay with the word. It's too distracting otherwise.
* Maybe a right click "add to word list" option.
* Settings:
* Enable/disable.
1. Heat map.
* Highlight slot/cell based on how constrained it is.
* Show ghost letters when there is only one choice.
* Show multiple ghost letters when there are 2-9 possible letters for a cell.
* Toggle on/off easily with keyboard hotkey.
* Hold down hotkey to enable temporarily.
* Heat map.
1. Jump to the most constrained slot.
1. Detect duplicate substrings.
* Highlight the letters to warn the user.
* Settings:
* Enable/disable.
* Set maximum duplicate substring length.
1. Detect solution words in clues.
* Highlight the words in the clues, to warn the user.
* Root word?
* What about solution words that are impossible to avoid in clues (Like *perhaps*, *not*, *its*.)?
* It shouldn't be too distracting in the first place.
* We can manually add a blacklist for words that are common in crossword clues.
* Just because a word is common in clues doesn't necessarily mean it's okay to be in the puzzle. Maybe the fact that a word is common in clues is itself a good reason not to use that word on the grid? So maybe the warning is actually fine.
* Settings:
* Enable/disable.
1. Detect if the grid is fillable or not.
1. Detect root word duplicates.
1. Detect reversals.
1. Detect anagrams.
## Non-GSoC ideas
### Notes
* I've ==highlighted== the ideas that I think are better.
* Despite writing a lengthy prior art doc, I know there are still some features that I missed and did not document.
* The higher quality editors have a lot of features. Some features are a bit cryptic and complicated, and I did not have the time to investigate them as much as I would have liked.
* I think it could be a seperate issue to investigate the high quality editors further, expand the prior art doc, and generate new feature ideas.
* In particular, I think it is worth exploring how different editors handle their word suggestion list and autofill features.
* For the open source ones, there may also be value in digging through their source code.
* High quality editors worth further investigation:
* Qxw (open source).
* Exet (open source).
* Crossfire.
* Crossword Compiler.
* Crosserville.
* Ingrid (open source core).
* I only included features that I think are useful. It's possible that some of the features I omitted are also good, but I misjudged them or didn't have enough time to test them properly.
* I tried to use the same key words as I used in the prior art doc. So you can Ctrl+F a feature name in the prior art doc, to see which editor it came from.
* Sometimes, I explicitly name the editor that a feature came from.
* I didn't add any any ideas that require the Outreachy project (i.e. ideas that use word metrics).
### Puzzle info and stats
* ==Change wording:==
```
"Clue size" -> "(Word | Slot) size"
```
* ==Missing letters.==
* Which letters are needed to make the puzzle a pangram?
* If there's room, we could list out all letters, even ones not on the board. And maybe highlight the missing letters.
* ==Percent of grid that is a black cell.==
* ==Is the grid symmetrical?==
* Choose the slots that I want to see stats for:
* All slots.
* Across slots only.
* Down slots only.
* Average word score.
* ==Average scrabble score. (Unsure if this is actually useful.)==
* [Grid flow](https://www.crosserville.com/FAQ#:~:text=are%20grid%20scores%3F-,What%20is%20Grid%20Flow%3F,-What%20are%20stale) (how connected are the slots).
* Smallest horizontal and vertical [through cuts](https://github.com/viresh-ratnakar/exet#:~:text=The%20Analysis%20tab,the%20Analysis%20panel.). (Still don't understand what this is or if it's useful.)
### Word list
* ==Modify word list from within the editor.==
* Change the score of a word.
* Add or delete a word.
* Change the spelling of a word.
### Grid
* ==Grid pattern generator with parameters.==
* A possible simplified version of this feature is a random pattern generator, no parameters.
Supposedly, Phil (open source) does this. But I think they may just be cycling through a few preset grid patterns.
* ==Transform grid (rotate, flip, etc.).==
### Fill algorithm
* ==Filter lists:==
* Whitelist (only use these words).
* Blacklist (never use these words).
* Prefered list (use these words if possible).
* ==Calculate and consider grid score.==
* Crossfire and Crosserville both have this, but I think they calculate it differently. But the meaning of the score is basically, "how well does *X* word fit into *Y* slot."
So the score is dynamic, based on the grid state, and the specific slot on the grid.
* ==Constraints:==
* Minimum word score.
* Maximum size shared substring.
* Duplicate root word.
* Target certain metrics?
* ==Word suggestions:==
* Fuzzy search or regex search suggested words list.
* Autofill:
* Target certain metrics?
* Try to get a pangram.
* Subgrid autofill.
* For the editors that I tried, they do not fill any letters beyond the subgrid, even if it means half-filling a slot. This differs from our implementation.
==I do think that their behaviour looks cleaner and is preferable, but this is more of a stylistic thing.==
### Related words (mainly for cryptics)
These are all from Exet, which provides a good reference implementation.
* ==Anagrams.==
== * Including reversals.==
* ==Containments.==
== * Including anagrams of contianments.==
* ==Charades.==
* ==Anagrammed deletions.==
* ==Hiddens and reverse hiddens (words that contain the \[reversed\] target word).==
* Exet uses [Nutrimatic](https://nutrimatic.org/), but it doesn't seem very reliable. It almost always runs into a computation limit. ([More info](https://nutrimatic.org/2024/usage.html).)
* ==Alterations.==
* \[Same note about Nutrimatic.\]
* ==Edits (deletions, insertions, and substitutions).==
* ==Homophones and spoonerisms.==
* Exet uses the [Carnegie Mellon Pronouncing Dictionary](https://github.com/cmusphinx/cmudict).
### Clues
* ==Text formatting (italics, bold).==
* Markdown? [HTML](https://raw.githubusercontent.com/viresh-ratnakar/exet/master/exet-format.png)? Keyboard shortcuts? GUI buttons?
* ==Cross-reference clues (e.g. "See 1-Down").==
* These clues should highlight the relevant slots and clues.
* [Ipuz reference](https://libipuz.org/ipuz-spec.html#:~:text=%22continued%22%3A%20%5B%20CrossReference%2C%20...%20%5D,by%20this%20clue).
* Third-party [clue database](https://tiwwdty.com/clue/)?
### Miscellaneous
* ==Link to various crossword resources.==
* Exet has a "Resources" tab, for example. They open the webpage in-app, which I don't think makes sense. But I do think having a list of resources would be a good idea. Or it could just be a GitLab link to a markdown file in the repo that contains all the resources
* Break it down into categories (dictionaries, data from past crosswords, cryptics, etc.).
* ==Create school-style crossword from list of words.==