# Method and limitations 1. Read UTF-8 input (an optional UTF-8 BOM is accepted). 2. Apply Unicode case folding and normalize curly apostrophes. 3. Extract letter sequences, including internal apostrophes. 4. Count all words with `collections.Counter`. 5. Sort by descending frequency, then alphabetically for ties. 6. Save a JSON record; combine records into an HTML report. ## What is a word? `Git git` produces two occurrences of `git`. `Код код` produces two occurrences of `код`. Numbers and underscores separate words. The tokenizer is educational: it does not perform linguistic lemmatization. ## Raw Markdown, not rendered prose URLs, code snippets, image descriptions and Markdown metadata are included. Common words such as `the` are not filtered. Do not interpret this analysis as a reading-quality score or a semantic comparison between frameworks. ## Repeatability The source snapshots are committed with SHA-256 checksums and upstream commit references. The analyzer performs no downloads. Identical input bytes and parameters under the same Python environment produce identical JSON. The report includes every `*.json` in its input folder. Use a dedicated result folder for each dataset; old results remain until deliberately removed. The report's total counts word occurrences across files, not unique vocabulary across the whole collection. Each bar chart has its own scale. ## Errors Missing files, invalid UTF-8 and non-positive `--top` values produce a nonzero exit code. A report with no input JSON files is an error. An empty document is valid and has zero words.