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.

This commit is contained in:
derekc committed 2026-02-24 10:40:25 -08:00
1 parent eaa0d89f05
commit 7e74184d37
2 files changed
+108 -2

No files matched your search

+107 -1
View File
@@ -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 restaurant-picker.html # The entire app — HTML, CSS, and JS in one file
LICENSE LICENSE
README.md README.md
``` ```
---
## 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).
+1 -1
View File
@@ -171,7 +171,7 @@ header p{font-size:0.85rem;color:#f0cca0;margin-top:3px}
</div> </div>
</div> </div>
<script> <script>
const RESTAURANTS = [{"name":"315","slug":"315cuisine","price":45,"areas":["Coeur d'Alene"],"cuisine":"Eclectic","url":"https://inlanderrestaurantweek.com/project/315cuisine/","menu":{"hours":"Menu served Sun-Thu, 4-9 pm; Fri-Sat, 4-10 pm","phone":"(208) 667-9660","courses":{"First Course":[{"name":"Korean Meatballs","desc":"Tender savory meatballs glazed with lime hoisin and served with taekyung aioli and japchae noodles"},{"name":"Bang Bang Cauliflower","desc":"Buttermilk battered fried cauliflower tossed in sweet chili sauce, Asian slaw, pickled daikon, green onion GF V – Add prawn skewer $16"},{"name":"Crab Cakes","desc":"Golden seared snow crab meat, garlic lemon aioli, Creole remoulade, lemon supremes, orange fruit caviar – Add another crab cake $8"}],"Second Course":[{"name":"Grilled Pork Chop","desc":"Grilled bone-in pork chop, braised apples, garlic feta fingerlings, curtido slaw, pickled mustard seeds"},{"name":"Argentine Flank","desc":"Marinated steak, traditional chopped chimichurri, roasted fingerling corn hash, curtido slaw, serrano aioli – Add prawn skewer $16"},{"name":"Sicilian Black Cod","desc":"Wild-caught black cod, pan seared and served over orzo and a rustic Mediterranean sauce of tomatoes, kalamata olives and capers"}],"Third Course":[{"name":"Strawberry Shortcake Delight","desc":"Vanilla semifreddo swirled with strawberry coulis and shortcake bites"},{"name":"Brownie Pavé","desc":"Fudgy chocolate brownie stacked with toasted meringue, served with vanilla fleck semifreddo"},{"name":"Apple Crescendo","desc":"Handmade crescent roll layers filled with slow-cooked apples and velvety custard, baked to a golden finish and served with a silken apple brandy sauce"}]}}},{"name":"1898 Public House","slug":"1898","price":45,"areas":["North Spokane"],"cuisine":"American","url":"https://inlanderrestaurantweek.com/project/1898/","menu":{"hours":"Menu served daily, 4 pm-close","phone":"(509) 466-2121","courses":{"First Course":[{"name":"Ahi-Poke Tart","desc":"Marinated ahi poke, pickled cucumbers, avocado, mango, kewpie sriracha aioli, unagi sauce, seaweed flakes, savory tart shell"},{"name":"Antipasto Salad","desc":"Mixed greens, grilled artichokes, fresh mozzarella, basil, cherry tomatoes, Castelvetrano olives, pepperoncini, salami, golden Italian dressing"},{"name":"Steak Canapes","desc":"Fried polenta bites, sirloin bites, cremini mushrooms, gorgonzola cream sauce, balsamic drizzle"}],"Second Course":[{"name":"Top Sirloin","desc":"Char-broiled sirloin, pomme puree, roasted carrots, cabernet demi-glace, fried potato strings"},{"name":"Huli Huli Chicken","desc":"Marinated chicken thighs, jasmine rice, grilled pineapple, red peppers, green onion"},{"name":"Yaki Udon","desc":"Udon noodles, prawns, oyster sauce, broccoli, bok choy, red peppers, green onions, seaweed flakes"}],"Third Course":[{"name":"Tiramisu Chocolate Sphere","desc":"Espresso dipped lady fingers, sweet mascarpone cream, cocoa powder, chocolate sphere"},{"name":"Tres Leches","desc":"Sponge cake soaked in evaporated milk, condensed milk, and whole milk, topped with homemade whipped cream, toasted coconut flakes, strawberries"},{"name":"Crème Brulée","desc":"Classic French crème brulée, fresh mixed berries, whipped cream"}]}}},{"name":"1910 Restaurant & Lounge at Spokane Club","slug":"1910","price":35,"areas":["Downtown"],"cuisine":"Northwest","url":"https://inlanderrestaurantweek.com/project/1910/","menu":{"hours":"Menu served Mon-Sat, 4:30-9 pm; Closed Sun","phone":"(509) 459-4577","courses":{"First Course":[{"name":"Wild Mushroom Bisque","desc":"Classic wild mushroom bisque with brown butter roux with roasted garlic, finished with cream and sea salt – Add Salmon $8, Shrimp $10, Grilled Chicken $6"},{"name":"Garden Green Salad","desc":"Local Arcadian mixed greens with radish, alfalfa sprouts, English cucumber, and tomato with your choice of dressing GF V – Add Salmon $8, Shrimp $10, Grilled Chicken $6"},{"name":"Classic Caesar Salad","desc":"Classic Caesar salad with romaine hearts, fresh lemon, house-made garlic herb croutons, and Parmesan – Add Salmon $8, Shrimp $10, Grilled Chicken $6"}],"Second Course":[{"name":"1910 Braised Short Rib","desc":"12-hour red wine braised short rib with potato puree and roasted garlic green beans, finished with demi-glace. Pairs well with Townshend T3 Red – Bourbon Mushrooms $5, Shrimp Scampi $10, Crab Oscar $15"},{"name":"Columbia River Blackened Steelhead","desc":"Blackened steelhead served with Boursin risotto, braised carrots, and finished with lobster Nantua sauce. Pairs well with Airfield Sauvignon Blanc – Bourbon Mushrooms $5, Shrimp Scampi $10, Crab Oscar $15"},{"name":"Cast Iron Chicken","desc":"Chicken breast seared in a cast iron skillet with lemon thyme orzo, paired with butternut squash, and topped with pancetta hollandaise. Pairs well with Barnard Griffin Rosé of Sangiovese – Bourbon Mushrooms $5, Shrimp Scampi $10, Crab Oscar $15"}],"Third Course":[{"name":"HouLine truncated const RESTAURANTS = [{"name":"315","slug":"315cuisine","price":45,"areas":["Coeur d'Alene"],"cuisine":"Eclectic","url":"https://inlanderrestaurantweek.com/project/315cuisine/","menu":{"hours":"Menu served Sun-Thu, 4-9 pm; Fri-Sat, 4-10 pm","phone":"(208) 667-9660","courses":{"First Course":[{"name":"Korean Meatballs","desc":"Tender savory meatballs glazed with lime hoisin and served with taekyung aioli and japchae noodles"},{"name":"Bang Bang Cauliflower","desc":"Buttermilk battered fried cauliflower tossed in sweet chili sauce, Asian slaw, pickled daikon, green onion GF V – Add prawn skewer $16"},{"name":"Crab Cakes","desc":"Golden seared snow crab meat, garlic lemon aioli, Creole remoulade, lemon supremes, orange fruit caviar – Add another crab cake $8"}],"Second Course":[{"name":"Grilled Pork Chop","desc":"Grilled bone-in pork chop, braised apples, garlic feta fingerlings, curtido slaw, pickled mustard seeds"},{"name":"Argentine Flank","desc":"Marinated steak, traditional chopped chimichurri, roasted fingerling corn hash, curtido slaw, serrano aioli – Add prawn skewer $16"},{"name":"Sicilian Black Cod","desc":"Wild-caught black cod, pan seared and served over orzo and a rustic Mediterranean sauce of tomatoes, kalamata olives and capers"}],"Third Course":[{"name":"Strawberry Shortcake Delight","desc":"Vanilla semifreddo swirled with strawberry coulis and shortcake bites"},{"name":"Brownie Pavé","desc":"Fudgy chocolate brownie stacked with toasted meringue, served with vanilla fleck semifreddo"},{"name":"Apple Crescendo","desc":"Handmade crescent roll layers filled with slow-cooked apples and velvety custard, baked to a golden finish and served with a silken apple brandy sauce"}]}}},{"name":"1898 Public House","slug":"1898","price":45,"areas":["North Spokane"],"cuisine":"American","url":"https://inlanderrestaurantweek.com/project/1898/","menu":{"hours":"Menu served daily, 4 pm-close","phone":"(509) 466-2121","courses":{"First Course":[{"name":"Ahi-Poke Tart","desc":"Marinated ahi poke, pickled cucumbers, avocado, mango, kewpie sriracha aioli, unagi sauce, seaweed flakes, savory tart shell"},{"name":"Antipasto Salad","desc":"Mixed greens, grilled artichokes, fresh mozzarella, basil, cherry tomatoes, Castelvetrano olives, pepperoncini, salami, golden Italian dressing"},{"name":"Steak Canapes","desc":"Fried polenta bites, sirloin bites, cremini mushrooms, gorgonzola cream sauce, balsamic drizzle"}],"Second Course":[{"name":"Top Sirloin","desc":"Char-broiled sirloin, pomme puree, roasted carrots, cabernet demi-glace, fried potato strings"},{"name":"Huli Huli Chicken","desc":"Marinated chicken thighs, jasmine rice, grilled pineapple, red peppers, green onion"},{"name":"Yaki Udon","desc":"Udon noodles, prawns, oyster sauce, broccoli, bok choy, red peppers, green onions, seaweed flakes"}],"Third Course":[{"name":"Tiramisu Chocolate Sphere","desc":"Espresso dipped lady fingers, sweet mascarpone cream, cocoa powder, chocolate sphere"},{"name":"Tres Leches","desc":"Sponge cake soaked in evaporated milk, condensed milk, and whole milk, topped with homemade whipped cream, toasted coconut flakes, strawberries"},{"name":"Crème Brulée","desc":"Classic French crème brulée, fresh mixed berries, whipped cream"}]}}},{"name":"1910 Restaurant & Lounge at Spokane Club","slug":"1910","price":35,"areas":["Downtown"],"cuisine":"Northwest","url":"https://inlanderrestaurantweek.com/project/1910/","menu":{"hours":"Menu served Mon-Sat, 4:30-9 pm; Closed Sun","phone":"(509) 459-4577","courses":{"First Course":[{"name":"Wild Mushroom Bisque","desc":"Classic wild mushroom bisque with brown butter roux with roasted garlic, finished with cream and sea salt – Add Salmon $8, Shrimp $10, Grilled Chicken $6"},{"name":"Garden Green Salad","desc":"Local Arcadian mixed greens with radish, alfalfa sprouts, English cucumber, and tomato with your choice of dressing GF V – Add Salmon $8, Shrimp $10, Grilled Chicken $6"},{"name":"Classic Caesar Salad","desc":"Classic Caesar salad with romaine hearts, fresh lemon, house-made garlic herb croutons, and Parmesan – Add Salmon $8, Shrimp $10, Grilled Chicken $6"}],"Second Course":[{"name":"1910 Braised Short Rib","desc":"12-hour red wine braised short rib with potato puree and roasted garlic green beans, finished with demi-glace. Pairs well with Townshend T3 Red – Bourbon Mushrooms $5, Shrimp Scampi $10, Crab Oscar $15"},{"name":"Columbia River Blackened Steelhead","desc":"Blackened steelhead served with Boursin risotto, braised carrots, and finished with lobster Nantua sauce. Pairs well with Airfield Sauvignon Blanc – Bourbon Mushrooms $5, Shrimp Scampi $10, Crab Oscar $15"},{"name":"Cast Iron Chicken","desc":"Chicken breast seared in a cast iron skillet with lemon thyme orzo, paired with butternut squash, and topped with pancetta hollandaise. Pairs well with Barnard Griffin Rosé of Sangiovese – Bourbon Mushrooms $5, Shrimp Scampi $10, Crab Oscar $15"}],"Third Course":[{"name":"HouLine truncated
let interests = JSON.parse(localStorage.getItem('irw_interests')||'{}'); let interests = JSON.parse(localStorage.getItem('irw_interests')||'{}');
let filteredList = []; let filteredList = [];