From 7e74184d37d33d3559fc06fdb3b5b8179d8f11aa Mon Sep 17 00:00:00 2001 From: Derek Cooper Date: Tue, 24 Feb 2026 10:40:25 -0800 Subject: [PATCH] Fixed some of the restaurants that had broken information due to special characters, like GF. Updated the ReadMe file with the fix for future pulls. --- README.md | 108 ++++++++++++++++++++++++++++++++++++++++- restaurant-picker.html | 2 +- 2 files changed, 108 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bf4d8da..2f6d5bb 100644 --- a/README.md +++ b/README.md @@ -47,4 +47,110 @@ Each couple gets their own set of interest checkboxes ("His Picks" / "Her Picks" restaurant-picker.html # The entire app — HTML, CSS, and JS in one file LICENSE README.md -``` \ No newline at end of file +``` + +--- + +## Data Entry Guide + +Each year's restaurant data is stored as a JavaScript array (`const RESTAURANTS = [...]`) inline in `restaurant-picker.html`. The source data comes from the [IRW restaurant listing pages](https://inlanderrestaurantweek.com/restaurants/). This section covers the data schema and common pitfalls to avoid when entering or updating restaurant records. + +### Restaurant Object Schema + +```json +{ + "name": "Restaurant Name", + "slug": "restaurantname", + "price": 35, + "areas": ["Downtown"], + "cuisine": "Italian", + "url": "https://inlanderrestaurantweek.com/project/restaurantname/", + "menu": { + "hours": "Menu served Tue-Sat, 5 pm-close", + "phone": "(509) 555-1234", + "courses": { + "First Course": [ + { "name": "Dish Name", "desc": "Ingredients and description GF" } + ], + "Second Course": [ + { "name": "Dish Name", "desc": "Ingredients and description" } + ], + "Third Course": [ + { "name": "Dish Name", "desc": "Ingredients and description V+" } + ] + } + } +} +``` + +**Field notes:** +- `slug` — lowercase, no spaces or special characters; used as an internal identifier +- `price` — must be `25`, `35`, or `45` (the three IRW price tiers) +- `areas` — array; a restaurant can belong to more than one area (e.g. `["Downtown", "Coeur d'Alene"]`) +- `phone` — use empty string `""` if not listed +- Each course is an **array** — restaurants sometimes offer a choice of two or more dishes per course; add one object per option + +### Valid Area Values + +``` +Airway Heights Athol Coeur d'Alene Downtown +Hayden Liberty Lake North Spokane Post Falls +South Spokane Spokane Valley West Spokane Worley +ID (Coeur d'Alene-area catch-all) +``` + +### Valid Cuisine Values + +``` +American Asian Barbecue Bistro Eclectic European French +Fusion Gastropub German Indian Irish Italian Latin +Mediterranean Mexican Middle Eastern Northwest Pizza +Seafood Southern Steakhouse Thai +``` + +New cuisine types can be added, but check existing values first to keep filters consistent. + +### Dietary Tags + +Dietary tags go at the **end of the `desc` field**, separated by a space. Multiple tags are space-separated. + +| Tag | Meaning | +|-----|---------| +| `GF` | Gluten Free | +| `GFA` | Gluten Free Available (on request or with substitution) | +| `V` | Vegetarian | +| `V+` | Vegan | +| `DF` | Dairy Free | + +**Examples:** +``` +"desc": "Mixed greens, candied walnuts, goat cheese, balsamic vinaigrette GF V" +"desc": "House pasta with roasted vegetables – sub GF pasta available GFA V" +"desc": "Coconut curry with tofu and seasonal vegetables V+ GF DF" +``` + +Tags that are inline notes within a description (e.g. `– sub GF crust for additional charge`) are fine to leave mid-sentence; only the primary applicable tags belong at the end. + +### Common Data Entry Pitfall: Dietary Tag as Dish Name + +The IRW website displays a dietary icon **before** the dish name. When copying menu data, it is easy to accidentally paste the dietary tag as the `name` field and run the dish name directly into the start of `desc` with no separator. + +**Wrong (broken):** +```json +{ "name": "GFA", "desc": "Margherita PizzaSan Marzano Tomato Sauce. Fresh Mozzarella." } +``` + +**Correct:** +```json +{ "name": "Margherita Pizza", "desc": "San Marzano Tomato Sauce. Fresh Mozzarella. GFA" } +``` + +Signs that an entry has this problem: +- The `name` field is just a dietary tag (`"GF"`, `"GFA"`, `"V+"`, etc.) +- The `desc` field starts with what looks like a dish name run together with the description (no space or punctuation between them, e.g. `"Chocolate TorteA rich slice of flourless paradise"`) + +### Special Characters + +The data lives inside a JavaScript string, so be careful with quotation marks inside descriptions. Use a **curly/smart right double-quote** (`"`, U+201D) for inch marks (e.g. `7" pizza`) rather than a straight ASCII `"`, which would break the JS string delimiters. Em dashes (`–`) and curly apostrophes (`'`) from the source website copy fine as-is. + +**Critical: field delimiters must be straight ASCII double quotes.** Some editors and AI tools auto-correct straight `"` to curly `"` / `"` (U+201C / U+201D). If curly quotes end up wrapping property names or values (e.g. `"name"` instead of `"name"`), JavaScript will fail to parse the entire `RESTAURANTS` array and no restaurants will appear in the app. Always verify that the structural quotes in the data use the straight ASCII `"` character (U+0022). \ No newline at end of file diff --git a/restaurant-picker.html b/restaurant-picker.html index b8a344a..8efae49 100644 --- a/restaurant-picker.html +++ b/restaurant-picker.html @@ -171,7 +171,7 @@ header p{font-size:0.85rem;color:#f0cca0;margin-top:3px}