diff --git a/EssentialCSharp.Web/wwwroot/js/chapter-listings.json b/EssentialCSharp.Web/wwwroot/js/chapter-listings.json new file mode 100644 index 00000000..fcc93526 --- /dev/null +++ b/EssentialCSharp.Web/wwwroot/js/chapter-listings.json @@ -0,0 +1,2524 @@ +{ + "description": "Essential C# Listing Source Code Files", + "generated_by": "generate_listings_json.py", + "chapters": { + "Chapter01": [ + { + "filename": "01.01.cs", + "can_run": true + }, + { + "filename": "01.03.cs", + "can_run": true + }, + { + "filename": "01.04.cs", + "can_run": true + }, + { + "filename": "01.05.cs", + "can_run": true + }, + { + "filename": "01.06.cs", + "can_run": true + }, + { + "filename": "01.07.cs", + "can_run": true + }, + { + "filename": "01.08.cs", + "can_run": true + }, + { + "filename": "01.09.cs", + "can_run": true + }, + { + "filename": "01.10.cs", + "can_run": true + }, + { + "filename": "01.11.cs", + "can_run": true + }, + { + "filename": "01.12.cs", + "can_run": true + }, + { + "filename": "01.13.cs", + "can_run": true + }, + { + "filename": "01.14.cs", + "can_run": true + }, + { + "filename": "01.15.cs", + "can_run": true + }, + { + "filename": "01.16.cs", + "can_run": true + }, + { + "filename": "01.17.cs", + "can_run": true + }, + { + "filename": "01.18.cs", + "can_run": true + }, + { + "filename": "01.19.cs", + "can_run": true + }, + { + "filename": "01.20.cs", + "can_run": true + }, + { + "filename": "01.21.cs", + "can_run": true + }, + { + "filename": "01.22.cs", + "can_run": true + } + ], + "Chapter02": [ + { + "filename": "02.01.cs", + "can_run": true + }, + { + "filename": "02.02.cs", + "can_run": true + }, + { + "filename": "02.03.cs", + "can_run": true + }, + { + "filename": "02.04.cs", + "can_run": true + }, + { + "filename": "02.05.cs", + "can_run": true + }, + { + "filename": "02.06.cs", + "can_run": true + }, + { + "filename": "02.07.cs", + "can_run": true + }, + { + "filename": "02.08.cs", + "can_run": true + }, + { + "filename": "02.09.cs", + "can_run": true + }, + { + "filename": "02.10.cs", + "can_run": true + }, + { + "filename": "02.11.cs", + "can_run": true + }, + { + "filename": "02.12.cs", + "can_run": true + }, + { + "filename": "02.13.cs", + "can_run": true + }, + { + "filename": "02.14.cs", + "can_run": true + }, + { + "filename": "02.15.cs", + "can_run": true + }, + { + "filename": "02.16.cs", + "can_run": true + }, + { + "filename": "02.17.cs", + "can_run": true + }, + { + "filename": "02.18.cs", + "can_run": true + }, + { + "filename": "02.19.cs", + "can_run": true + }, + { + "filename": "02.20.cs", + "can_run": true + }, + { + "filename": "02.21.cs", + "can_run": true + }, + { + "filename": "02.22.cs", + "can_run": true + }, + { + "filename": "02.23.cs", + "can_run": true + }, + { + "filename": "02.24.cs", + "can_run": true + }, + { + "filename": "02.25.cs", + "can_run": true + }, + { + "filename": "02.26.cs", + "can_run": true + }, + { + "filename": "02.27.cs", + "can_run": true + }, + { + "filename": "02.28.cs", + "can_run": true + }, + { + "filename": "02.29.cs", + "can_run": true + }, + { + "filename": "02.30.cs", + "can_run": true + }, + { + "filename": "02.31.cs", + "can_run": true + }, + { + "filename": "02.32.cs", + "can_run": true + }, + { + "filename": "02.33.cs", + "can_run": true + }, + { + "filename": "02.34.cs", + "can_run": true + }, + { + "filename": "02.35.cs", + "can_run": true + }, + { + "filename": "02.36.cs", + "can_run": true + } + ], + "Chapter03": [ + { + "filename": "03.01.cs", + "can_run": true + }, + { + "filename": "03.02.cs", + "can_run": true + }, + { + "filename": "03.03.cs", + "can_run": true + }, + { + "filename": "03.04.cs", + "can_run": true + }, + { + "filename": "03.05.cs", + "can_run": true + }, + { + "filename": "03.06.cs", + "can_run": true + }, + { + "filename": "03.07.cs", + "can_run": true + }, + { + "filename": "03.08.cs", + "can_run": true + }, + { + "filename": "03.09.cs", + "can_run": true + }, + { + "filename": "03.10.cs", + "can_run": true + }, + { + "filename": "03.11.cs", + "can_run": true + }, + { + "filename": "03.12.cs", + "can_run": true + }, + { + "filename": "03.13.cs", + "can_run": true + }, + { + "filename": "03.14.cs", + "can_run": true + }, + { + "filename": "03.15.cs", + "can_run": true + }, + { + "filename": "03.16.cs", + "can_run": true + }, + { + "filename": "03.17.cs", + "can_run": true + }, + { + "filename": "03.18.cs", + "can_run": true + }, + { + "filename": "03.19.cs", + "can_run": true + }, + { + "filename": "03.20.cs", + "can_run": true + }, + { + "filename": "03.21.cs", + "can_run": true + }, + { + "filename": "03.22.cs", + "can_run": true + }, + { + "filename": "03.23.cs", + "can_run": true + }, + { + "filename": "03.24.cs", + "can_run": true + }, + { + "filename": "03.25.cs", + "can_run": true + }, + { + "filename": "03.26.cs", + "can_run": true + }, + { + "filename": "03.27.cs", + "can_run": true + }, + { + "filename": "03.28.cs", + "can_run": true + }, + { + "filename": "03.29.cs", + "can_run": true + }, + { + "filename": "03.30.cs", + "can_run": true + }, + { + "filename": "03.31.cs", + "can_run": true + } + ], + "Chapter04": [ + { + "filename": "04.01.cs", + "can_run": true + }, + { + "filename": "04.02.cs", + "can_run": true + }, + { + "filename": "04.03.cs", + "can_run": true + }, + { + "filename": "04.04.cs", + "can_run": true + }, + { + "filename": "04.05.cs", + "can_run": true + }, + { + "filename": "04.06.cs", + "can_run": true + }, + { + "filename": "04.07.cs", + "can_run": true + }, + { + "filename": "04.08.cs", + "can_run": true + }, + { + "filename": "04.09.cs", + "can_run": true + }, + { + "filename": "04.10.cs", + "can_run": true + }, + { + "filename": "04.11.cs", + "can_run": true + }, + { + "filename": "04.12.cs", + "can_run": true + }, + { + "filename": "04.13.cs", + "can_run": true + }, + { + "filename": "04.14.cs", + "can_run": true + }, + { + "filename": "04.15.cs", + "can_run": true + }, + { + "filename": "04.16.cs", + "can_run": true + }, + { + "filename": "04.17.cs", + "can_run": true + }, + { + "filename": "04.18.cs", + "can_run": true + }, + { + "filename": "04.19.cs", + "can_run": true + }, + { + "filename": "04.20.cs", + "can_run": true + }, + { + "filename": "04.21.cs", + "can_run": true + }, + { + "filename": "04.22.cs", + "can_run": true + }, + { + "filename": "04.23.cs", + "can_run": true + }, + { + "filename": "04.24.cs", + "can_run": true + }, + { + "filename": "04.25.cs", + "can_run": true + }, + { + "filename": "04.26.cs", + "can_run": true + }, + { + "filename": "04.27.cs", + "can_run": true + }, + { + "filename": "04.28.cs", + "can_run": true + }, + { + "filename": "04.29.cs", + "can_run": true + }, + { + "filename": "04.30.cs", + "can_run": true + }, + { + "filename": "04.31.cs", + "can_run": true + }, + { + "filename": "04.32.cs", + "can_run": true + }, + { + "filename": "04.33.cs", + "can_run": true + }, + { + "filename": "04.34.cs", + "can_run": true + }, + { + "filename": "04.35.cs", + "can_run": true + }, + { + "filename": "04.36.cs", + "can_run": true + }, + { + "filename": "04.37.cs", + "can_run": true + }, + { + "filename": "04.38.cs", + "can_run": true + }, + { + "filename": "04.39.cs", + "can_run": true + }, + { + "filename": "04.40.cs", + "can_run": true + }, + { + "filename": "04.41.cs", + "can_run": true + }, + { + "filename": "04.42.cs", + "can_run": true + }, + { + "filename": "04.43.cs", + "can_run": true + }, + { + "filename": "04.44.cs", + "can_run": true + }, + { + "filename": "04.45.cs", + "can_run": true + }, + { + "filename": "04.46.cs", + "can_run": true + }, + { + "filename": "04.47.cs", + "can_run": true + }, + { + "filename": "04.48.cs", + "can_run": true + }, + { + "filename": "04.49.cs", + "can_run": true + }, + { + "filename": "04.50.cs", + "can_run": true + }, + { + "filename": "04.51.cs", + "can_run": true + }, + { + "filename": "04.52.cs", + "can_run": true + }, + { + "filename": "04.53.cs", + "can_run": true + }, + { + "filename": "04.54.cs", + "can_run": true + }, + { + "filename": "04.55.cs", + "can_run": true + }, + { + "filename": "04.56.cs", + "can_run": true + }, + { + "filename": "04.57.cs", + "can_run": true + }, + { + "filename": "04.58.cs", + "can_run": true + }, + { + "filename": "04.59.cs", + "can_run": true + }, + { + "filename": "04.60.cs", + "can_run": true + }, + { + "filename": "04.61.cs", + "can_run": true + }, + { + "filename": "04.62.cs", + "can_run": true + }, + { + "filename": "04.63.cs", + "can_run": true + } + ], + "Chapter05": [ + { + "filename": "05.01.cs", + "can_run": true + }, + { + "filename": "05.02.cs", + "can_run": true + }, + { + "filename": "05.03.cs", + "can_run": true + }, + { + "filename": "05.04.cs", + "can_run": true + }, + { + "filename": "05.05.cs", + "can_run": true + }, + { + "filename": "05.06.cs", + "can_run": true + }, + { + "filename": "05.07.cs", + "can_run": true + }, + { + "filename": "05.08.cs", + "can_run": true + }, + { + "filename": "05.09.cs", + "can_run": true + }, + { + "filename": "05.10.cs", + "can_run": true + }, + { + "filename": "05.12.cs", + "can_run": true + }, + { + "filename": "05.13.cs", + "can_run": true + }, + { + "filename": "05.14.cs", + "can_run": true + }, + { + "filename": "05.15.cs", + "can_run": true + }, + { + "filename": "05.16.cs", + "can_run": true + }, + { + "filename": "05.17.cs", + "can_run": true + }, + { + "filename": "05.18.cs", + "can_run": true + }, + { + "filename": "05.19.cs", + "can_run": true + }, + { + "filename": "05.20.cs", + "can_run": true + }, + { + "filename": "05.21.cs", + "can_run": true + }, + { + "filename": "05.22.cs", + "can_run": true + }, + { + "filename": "05.23.cs", + "can_run": true + }, + { + "filename": "05.24.cs", + "can_run": true + }, + { + "filename": "05.25.cs", + "can_run": true + }, + { + "filename": "05.26.cs", + "can_run": true + }, + { + "filename": "05.27.cs", + "can_run": true + }, + { + "filename": "05.28.cs", + "can_run": true + }, + { + "filename": "05.29.cs", + "can_run": true + }, + { + "filename": "05.30.cs", + "can_run": true + }, + { + "filename": "05.31.cs", + "can_run": true + }, + { + "filename": "05.32.cs", + "can_run": true + }, + { + "filename": "05.33.cs", + "can_run": true + }, + { + "filename": "05.34.cs", + "can_run": true + } + ], + "Chapter06": [ + { + "filename": "06.01.cs", + "can_run": true + }, + { + "filename": "06.02.cs", + "can_run": true + }, + { + "filename": "06.03.cs", + "can_run": true + }, + { + "filename": "06.04.cs", + "can_run": true + }, + { + "filename": "06.05.cs", + "can_run": true + }, + { + "filename": "06.06.cs", + "can_run": true + }, + { + "filename": "06.07.cs", + "can_run": true + }, + { + "filename": "06.08.cs", + "can_run": true + }, + { + "filename": "06.09.cs", + "can_run": true + }, + { + "filename": "06.10.cs", + "can_run": true + }, + { + "filename": "06.11.cs", + "can_run": true + }, + { + "filename": "06.12.cs", + "can_run": true + }, + { + "filename": "06.13.cs", + "can_run": true + }, + { + "filename": "06.14.cs", + "can_run": true + }, + { + "filename": "06.15.cs", + "can_run": true + }, + { + "filename": "06.16.cs", + "can_run": true + }, + { + "filename": "06.17.cs", + "can_run": true + }, + { + "filename": "06.18.cs", + "can_run": true + }, + { + "filename": "06.19.cs", + "can_run": true + }, + { + "filename": "06.20.cs", + "can_run": true + }, + { + "filename": "06.21.cs", + "can_run": true + }, + { + "filename": "06.22.cs", + "can_run": true + }, + { + "filename": "06.23.cs", + "can_run": true + }, + { + "filename": "06.24.cs", + "can_run": true + }, + { + "filename": "06.25.cs", + "can_run": true + }, + { + "filename": "06.26.cs", + "can_run": true + }, + { + "filename": "06.27.cs", + "can_run": true + }, + { + "filename": "06.28.cs", + "can_run": true + }, + { + "filename": "06.29.cs", + "can_run": true + }, + { + "filename": "06.30.cs", + "can_run": true + }, + { + "filename": "06.31.cs", + "can_run": true + }, + { + "filename": "06.32.cs", + "can_run": true + }, + { + "filename": "06.33.cs", + "can_run": true + }, + { + "filename": "06.34.cs", + "can_run": true + }, + { + "filename": "06.35.cs", + "can_run": true + }, + { + "filename": "06.36.cs", + "can_run": true + }, + { + "filename": "06.37.cs", + "can_run": true + }, + { + "filename": "06.38.cs", + "can_run": true + }, + { + "filename": "06.39.cs", + "can_run": true + }, + { + "filename": "06.40.cs", + "can_run": true + }, + { + "filename": "06.41.cs", + "can_run": true + }, + { + "filename": "06.42.cs", + "can_run": true + }, + { + "filename": "06.43.cs", + "can_run": true + }, + { + "filename": "06.44.cs", + "can_run": true + }, + { + "filename": "06.45.cs", + "can_run": true + }, + { + "filename": "06.46.cs", + "can_run": true + }, + { + "filename": "06.47.cs", + "can_run": true + }, + { + "filename": "06.48.cs", + "can_run": true + }, + { + "filename": "06.49.cs", + "can_run": true + }, + { + "filename": "06.50.cs", + "can_run": true + }, + { + "filename": "06.51.cs", + "can_run": true + }, + { + "filename": "06.52.cs", + "can_run": true + }, + { + "filename": "06.53.cs", + "can_run": true + }, + { + "filename": "06.54.cs", + "can_run": true + }, + { + "filename": "06.55.cs", + "can_run": true + }, + { + "filename": "06.56.cs", + "can_run": true + }, + { + "filename": "06.57.cs", + "can_run": true + }, + { + "filename": "06.58.cs", + "can_run": true + }, + { + "filename": "06.59.cs", + "can_run": true + } + ], + "Chapter07": [ + { + "filename": "07.01.cs", + "can_run": true + }, + { + "filename": "07.02.cs", + "can_run": true + }, + { + "filename": "07.03.cs", + "can_run": true + }, + { + "filename": "07.04.cs", + "can_run": true + }, + { + "filename": "07.05.cs", + "can_run": true + }, + { + "filename": "07.06.cs", + "can_run": true + }, + { + "filename": "07.07.cs", + "can_run": true + }, + { + "filename": "07.08.cs", + "can_run": true + }, + { + "filename": "07.09.cs", + "can_run": true + }, + { + "filename": "07.10.cs", + "can_run": true + }, + { + "filename": "07.11.cs", + "can_run": true + }, + { + "filename": "07.12.cs", + "can_run": true + }, + { + "filename": "07.13.cs", + "can_run": true + }, + { + "filename": "07.14.cs", + "can_run": true + }, + { + "filename": "07.15.cs", + "can_run": true + }, + { + "filename": "07.16.cs", + "can_run": true + }, + { + "filename": "07.17.cs", + "can_run": true + }, + { + "filename": "07.18.cs", + "can_run": true + }, + { + "filename": "07.19.cs", + "can_run": true + }, + { + "filename": "07.20.cs", + "can_run": true + }, + { + "filename": "07.21.cs", + "can_run": true + }, + { + "filename": "07.22.cs", + "can_run": true + }, + { + "filename": "07.23.cs", + "can_run": true + }, + { + "filename": "07.24.cs", + "can_run": true + }, + { + "filename": "07.25.cs", + "can_run": true + }, + { + "filename": "07.26.cs", + "can_run": true + }, + { + "filename": "07.27.cs", + "can_run": true + }, + { + "filename": "07.28.cs", + "can_run": true + }, + { + "filename": "07.29.cs", + "can_run": true + }, + { + "filename": "07.30.cs", + "can_run": true + }, + { + "filename": "07.31.cs", + "can_run": true + }, + { + "filename": "07.32.cs", + "can_run": true + }, + { + "filename": "07.33.cs", + "can_run": true + }, + { + "filename": "07.34.cs", + "can_run": true + } + ], + "Chapter08": [ + { + "filename": "08.01.cs", + "can_run": true + }, + { + "filename": "08.02.cs", + "can_run": true + }, + { + "filename": "08.03.cs", + "can_run": true + }, + { + "filename": "08.04.cs", + "can_run": true + }, + { + "filename": "08.05.cs", + "can_run": true + }, + { + "filename": "08.06.cs", + "can_run": true + }, + { + "filename": "08.07.cs", + "can_run": true + }, + { + "filename": "08.08.cs", + "can_run": true + }, + { + "filename": "08.09.cs", + "can_run": true + }, + { + "filename": "08.10.cs", + "can_run": true + }, + { + "filename": "08.11.cs", + "can_run": true + }, + { + "filename": "08.12.cs", + "can_run": true + }, + { + "filename": "08.13.cs", + "can_run": true + }, + { + "filename": "08.14.cs", + "can_run": true + } + ], + "Chapter09": [ + { + "filename": "09.01.cs", + "can_run": true + }, + { + "filename": "09.02.cs", + "can_run": true + }, + { + "filename": "09.03.cs", + "can_run": true + }, + { + "filename": "09.04.cs", + "can_run": true + }, + { + "filename": "09.05.cs", + "can_run": true + }, + { + "filename": "09.06.cs", + "can_run": true + }, + { + "filename": "09.07.cs", + "can_run": true + }, + { + "filename": "09.08.cs", + "can_run": true + }, + { + "filename": "09.09.cs", + "can_run": true + }, + { + "filename": "09.10.cs", + "can_run": true + }, + { + "filename": "09.11.cs", + "can_run": true + }, + { + "filename": "09.12.cs", + "can_run": true + }, + { + "filename": "09.13.cs", + "can_run": true + }, + { + "filename": "09.14.cs", + "can_run": true + }, + { + "filename": "09.15.cs", + "can_run": true + }, + { + "filename": "09.16.cs", + "can_run": true + }, + { + "filename": "09.17.cs", + "can_run": true + }, + { + "filename": "09.18.cs", + "can_run": true + }, + { + "filename": "09.19.cs", + "can_run": true + }, + { + "filename": "09.20.cs", + "can_run": true + }, + { + "filename": "09.21.cs", + "can_run": true + }, + { + "filename": "09.22.cs", + "can_run": true + }, + { + "filename": "09.23.cs", + "can_run": true + }, + { + "filename": "09.24.cs", + "can_run": true + }, + { + "filename": "09.25.cs", + "can_run": true + }, + { + "filename": "09.26.cs", + "can_run": true + }, + { + "filename": "09.27.cs", + "can_run": true + }, + { + "filename": "09.28.cs", + "can_run": true + }, + { + "filename": "09.29.cs", + "can_run": true + }, + { + "filename": "09.30.cs", + "can_run": true + }, + { + "filename": "09.31.cs", + "can_run": true + }, + { + "filename": "09.32.cs", + "can_run": true + }, + { + "filename": "09.33.cs", + "can_run": true + }, + { + "filename": "09.34.cs", + "can_run": true + }, + { + "filename": "09.35.cs", + "can_run": true + }, + { + "filename": "09.36.cs", + "can_run": true + }, + { + "filename": "09.37.cs", + "can_run": true + }, + { + "filename": "09.38.cs", + "can_run": true + } + ], + "Chapter10": [ + { + "filename": "10.01.cs", + "can_run": true + }, + { + "filename": "10.02.cs", + "can_run": true + }, + { + "filename": "10.03.cs", + "can_run": true + }, + { + "filename": "10.04.cs", + "can_run": true + }, + { + "filename": "10.05.cs", + "can_run": true + }, + { + "filename": "10.06.cs", + "can_run": true + }, + { + "filename": "10.07.cs", + "can_run": true + }, + { + "filename": "10.08.cs", + "can_run": true + }, + { + "filename": "10.09.cs", + "can_run": true + }, + { + "filename": "10.10.cs", + "can_run": true + }, + { + "filename": "10.11.cs", + "can_run": true + }, + { + "filename": "10.12.cs", + "can_run": true + }, + { + "filename": "10.14.cs", + "can_run": true + }, + { + "filename": "10.15.cs", + "can_run": true + }, + { + "filename": "10.16.cs", + "can_run": true + }, + { + "filename": "10.17.cs", + "can_run": true + }, + { + "filename": "10.18.cs", + "can_run": true + }, + { + "filename": "10.19.cs", + "can_run": true + }, + { + "filename": "10.20.cs", + "can_run": true + } + ], + "Chapter11": [ + { + "filename": "11.01.cs", + "can_run": true + }, + { + "filename": "11.02.cs", + "can_run": true + }, + { + "filename": "11.03.cs", + "can_run": true + }, + { + "filename": "11.04.cs", + "can_run": true + }, + { + "filename": "11.05.cs", + "can_run": true + }, + { + "filename": "11.06.cs", + "can_run": true + }, + { + "filename": "11.07.cs", + "can_run": true + }, + { + "filename": "11.08.cs", + "can_run": true + } + ], + "Chapter12": [ + { + "filename": "12.01.cs", + "can_run": true + }, + { + "filename": "12.02.cs", + "can_run": true + }, + { + "filename": "12.03.cs", + "can_run": true + }, + { + "filename": "12.04.cs", + "can_run": true + }, + { + "filename": "12.05.cs", + "can_run": true + }, + { + "filename": "12.06.cs", + "can_run": true + }, + { + "filename": "12.07.cs", + "can_run": true + }, + { + "filename": "12.08.cs", + "can_run": true + }, + { + "filename": "12.09.cs", + "can_run": true + }, + { + "filename": "12.10.cs", + "can_run": true + }, + { + "filename": "12.11.cs", + "can_run": true + }, + { + "filename": "12.12.cs", + "can_run": true + }, + { + "filename": "12.13.cs", + "can_run": true + }, + { + "filename": "12.14.cs", + "can_run": true + }, + { + "filename": "12.15.cs", + "can_run": true + }, + { + "filename": "12.16.cs", + "can_run": true + }, + { + "filename": "12.17.cs", + "can_run": true + }, + { + "filename": "12.18.cs", + "can_run": true + }, + { + "filename": "12.19.cs", + "can_run": true + }, + { + "filename": "12.20.cs", + "can_run": true + }, + { + "filename": "12.21.cs", + "can_run": true + }, + { + "filename": "12.22.cs", + "can_run": true + }, + { + "filename": "12.23.cs", + "can_run": true + }, + { + "filename": "12.24.cs", + "can_run": true + }, + { + "filename": "12.25.cs", + "can_run": true + }, + { + "filename": "12.26.cs", + "can_run": true + }, + { + "filename": "12.27.cs", + "can_run": true + }, + { + "filename": "12.28.cs", + "can_run": true + }, + { + "filename": "12.29.cs", + "can_run": true + }, + { + "filename": "12.30.cs", + "can_run": true + }, + { + "filename": "12.31.cs", + "can_run": true + }, + { + "filename": "12.32.cs", + "can_run": true + }, + { + "filename": "12.33.cs", + "can_run": true + }, + { + "filename": "12.34.cs", + "can_run": true + }, + { + "filename": "12.35.cs", + "can_run": true + }, + { + "filename": "12.36.cs", + "can_run": true + }, + { + "filename": "12.37.cs", + "can_run": true + }, + { + "filename": "12.38.cs", + "can_run": true + }, + { + "filename": "12.39.cs", + "can_run": true + }, + { + "filename": "12.40.cs", + "can_run": true + }, + { + "filename": "12.41.cs", + "can_run": true + }, + { + "filename": "12.42.cs", + "can_run": true + }, + { + "filename": "12.43.cs", + "can_run": true + }, + { + "filename": "12.44.cs", + "can_run": true + }, + { + "filename": "12.45.cs", + "can_run": true + }, + { + "filename": "12.46.cs", + "can_run": true + }, + { + "filename": "12.47.cs", + "can_run": true + }, + { + "filename": "12.48.cs", + "can_run": true + }, + { + "filename": "12.49.cs", + "can_run": true + }, + { + "filename": "12.50.cs", + "can_run": true + } + ], + "Chapter13": [ + { + "filename": "13.01.cs", + "can_run": true + }, + { + "filename": "13.02.cs", + "can_run": true + }, + { + "filename": "13.03.cs", + "can_run": true + }, + { + "filename": "13.04.cs", + "can_run": true + }, + { + "filename": "13.05.cs", + "can_run": true + }, + { + "filename": "13.06.cs", + "can_run": true + }, + { + "filename": "13.07.cs", + "can_run": true + }, + { + "filename": "13.08.cs", + "can_run": true + }, + { + "filename": "13.09.cs", + "can_run": true + }, + { + "filename": "13.10.cs", + "can_run": true + }, + { + "filename": "13.11.cs", + "can_run": true + }, + { + "filename": "13.12.cs", + "can_run": true + }, + { + "filename": "13.13.cs", + "can_run": true + }, + { + "filename": "13.14.cs", + "can_run": true + }, + { + "filename": "13.15.cs", + "can_run": true + }, + { + "filename": "13.16.cs", + "can_run": true + }, + { + "filename": "13.17.cs", + "can_run": true + }, + { + "filename": "13.18.cs", + "can_run": true + }, + { + "filename": "13.19.cs", + "can_run": true + }, + { + "filename": "13.20.cs", + "can_run": true + }, + { + "filename": "13.21.cs", + "can_run": true + }, + { + "filename": "13.22.cs", + "can_run": true + }, + { + "filename": "13.23.cs", + "can_run": true + }, + { + "filename": "13.24.cs", + "can_run": true + }, + { + "filename": "13.25.cs", + "can_run": true + }, + { + "filename": "13.26.cs", + "can_run": true + } + ], + "Chapter14": [ + { + "filename": "14.01.cs", + "can_run": true + }, + { + "filename": "14.02.cs", + "can_run": true + }, + { + "filename": "14.03.cs", + "can_run": true + }, + { + "filename": "14.04.cs", + "can_run": true + }, + { + "filename": "14.05.cs", + "can_run": true + }, + { + "filename": "14.06.cs", + "can_run": true + }, + { + "filename": "14.07.cs", + "can_run": true + }, + { + "filename": "14.08.cs", + "can_run": true + }, + { + "filename": "14.09.cs", + "can_run": true + }, + { + "filename": "14.10.cs", + "can_run": true + }, + { + "filename": "14.11.cs", + "can_run": true + }, + { + "filename": "14.12.cs", + "can_run": true + }, + { + "filename": "14.13.cs", + "can_run": true + }, + { + "filename": "14.14.cs", + "can_run": true + }, + { + "filename": "14.15.cs", + "can_run": true + }, + { + "filename": "14.16.cs", + "can_run": true + }, + { + "filename": "14.17.cs", + "can_run": true + } + ], + "Chapter15": [ + { + "filename": "15.01.cs", + "can_run": true + }, + { + "filename": "15.02.cs", + "can_run": true + }, + { + "filename": "15.03.cs", + "can_run": true + }, + { + "filename": "15.04.cs", + "can_run": true + }, + { + "filename": "15.05.cs", + "can_run": true + }, + { + "filename": "15.06.cs", + "can_run": true + }, + { + "filename": "15.07.cs", + "can_run": true + }, + { + "filename": "15.08.cs", + "can_run": true + }, + { + "filename": "15.09.cs", + "can_run": true + }, + { + "filename": "15.10.cs", + "can_run": true + }, + { + "filename": "15.11.cs", + "can_run": true + }, + { + "filename": "15.12.cs", + "can_run": true + }, + { + "filename": "15.13.cs", + "can_run": true + }, + { + "filename": "15.14.cs", + "can_run": true + }, + { + "filename": "15.15.cs", + "can_run": true + }, + { + "filename": "15.16.cs", + "can_run": true + }, + { + "filename": "15.17.cs", + "can_run": true + }, + { + "filename": "15.18.cs", + "can_run": true + }, + { + "filename": "15.19.cs", + "can_run": true + }, + { + "filename": "15.20.cs", + "can_run": true + }, + { + "filename": "15.21.cs", + "can_run": true + }, + { + "filename": "15.22.cs", + "can_run": true + }, + { + "filename": "15.23.cs", + "can_run": true + }, + { + "filename": "15.24.cs", + "can_run": true + }, + { + "filename": "15.25.cs", + "can_run": true + }, + { + "filename": "15.26.cs", + "can_run": true + }, + { + "filename": "15.27.cs", + "can_run": true + }, + { + "filename": "15.28.cs", + "can_run": true + }, + { + "filename": "15.29.cs", + "can_run": true + } + ], + "Chapter16": [ + { + "filename": "16.01.cs", + "can_run": true + }, + { + "filename": "16.02.cs", + "can_run": true + }, + { + "filename": "16.03.cs", + "can_run": true + }, + { + "filename": "16.04.cs", + "can_run": true + }, + { + "filename": "16.05.cs", + "can_run": true + }, + { + "filename": "16.06.cs", + "can_run": true + }, + { + "filename": "16.07.cs", + "can_run": true + }, + { + "filename": "16.08.cs", + "can_run": true + }, + { + "filename": "16.09.cs", + "can_run": true + }, + { + "filename": "16.10.cs", + "can_run": true + }, + { + "filename": "16.11.cs", + "can_run": true + }, + { + "filename": "16.12.cs", + "can_run": true + }, + { + "filename": "16.13.cs", + "can_run": true + }, + { + "filename": "16.14.cs", + "can_run": true + }, + { + "filename": "16.15.cs", + "can_run": true + }, + { + "filename": "16.16.cs", + "can_run": true + }, + { + "filename": "16.17.cs", + "can_run": true + } + ], + "Chapter17": [ + { + "filename": "17.01.cs", + "can_run": true + }, + { + "filename": "17.02.cs", + "can_run": true + }, + { + "filename": "17.03.cs", + "can_run": true + }, + { + "filename": "17.04.cs", + "can_run": true + }, + { + "filename": "17.05.cs", + "can_run": true + }, + { + "filename": "17.06.cs", + "can_run": true + }, + { + "filename": "17.07.cs", + "can_run": true + }, + { + "filename": "17.08.cs", + "can_run": true + }, + { + "filename": "17.09.cs", + "can_run": true + }, + { + "filename": "17.10.cs", + "can_run": true + }, + { + "filename": "17.11.cs", + "can_run": true + }, + { + "filename": "17.12.cs", + "can_run": true + }, + { + "filename": "17.13.cs", + "can_run": true + }, + { + "filename": "17.14.cs", + "can_run": true + }, + { + "filename": "17.15.cs", + "can_run": true + }, + { + "filename": "17.16.cs", + "can_run": true + }, + { + "filename": "17.17.cs", + "can_run": true + }, + { + "filename": "17.18.cs", + "can_run": true + }, + { + "filename": "17.19.cs", + "can_run": true + }, + { + "filename": "17.20.cs", + "can_run": true + }, + { + "filename": "17.21.cs", + "can_run": true + } + ], + "Chapter18": [ + { + "filename": "18.01.cs", + "can_run": true + }, + { + "filename": "18.02.cs", + "can_run": true + }, + { + "filename": "18.03.cs", + "can_run": true + }, + { + "filename": "18.04.cs", + "can_run": true + }, + { + "filename": "18.05.cs", + "can_run": true + }, + { + "filename": "18.06.cs", + "can_run": true + }, + { + "filename": "18.07.cs", + "can_run": true + }, + { + "filename": "18.08.cs", + "can_run": true + }, + { + "filename": "18.09.cs", + "can_run": true + }, + { + "filename": "18.10.cs", + "can_run": true + }, + { + "filename": "18.11.cs", + "can_run": true + }, + { + "filename": "18.12.cs", + "can_run": true + }, + { + "filename": "18.13.cs", + "can_run": true + }, + { + "filename": "18.14.cs", + "can_run": true + }, + { + "filename": "18.15.cs", + "can_run": true + }, + { + "filename": "18.16.cs", + "can_run": true + }, + { + "filename": "18.17.cs", + "can_run": true + }, + { + "filename": "18.18.cs", + "can_run": true + }, + { + "filename": "18.19.cs", + "can_run": true + }, + { + "filename": "18.20.cs", + "can_run": true + }, + { + "filename": "18.21.cs", + "can_run": true + }, + { + "filename": "18.22.cs", + "can_run": true + }, + { + "filename": "18.23.cs", + "can_run": true + }, + { + "filename": "18.24.cs", + "can_run": true + }, + { + "filename": "18.25.cs", + "can_run": true + }, + { + "filename": "18.26.cs", + "can_run": true + }, + { + "filename": "18.27.cs", + "can_run": true + }, + { + "filename": "18.28.cs", + "can_run": true + }, + { + "filename": "18.29.cs", + "can_run": true + }, + { + "filename": "18.30.cs", + "can_run": true + }, + { + "filename": "18.31.cs", + "can_run": true + }, + { + "filename": "18.32.cs", + "can_run": true + }, + { + "filename": "18.33.cs", + "can_run": true + } + ], + "Chapter19": [ + { + "filename": "19.01.cs", + "can_run": true + }, + { + "filename": "19.02.cs", + "can_run": true + }, + { + "filename": "19.03.cs", + "can_run": true + }, + { + "filename": "19.04.cs", + "can_run": true + }, + { + "filename": "19.05.cs", + "can_run": true + }, + { + "filename": "19.06.cs", + "can_run": true + }, + { + "filename": "19.07.cs", + "can_run": true + }, + { + "filename": "19.08.cs", + "can_run": true + }, + { + "filename": "19.09.cs", + "can_run": true + }, + { + "filename": "19.10.cs", + "can_run": true + } + ], + "Chapter20": [ + { + "filename": "20.01.cs", + "can_run": true + }, + { + "filename": "20.02.cs", + "can_run": true + }, + { + "filename": "20.03.cs", + "can_run": true + }, + { + "filename": "20.04.cs", + "can_run": true + }, + { + "filename": "20.05.cs", + "can_run": true + }, + { + "filename": "20.06.cs", + "can_run": true + }, + { + "filename": "20.07.cs", + "can_run": true + }, + { + "filename": "20.08.cs", + "can_run": true + }, + { + "filename": "20.09.cs", + "can_run": true + }, + { + "filename": "20.10.cs", + "can_run": true + }, + { + "filename": "20.11.cs", + "can_run": true + }, + { + "filename": "20.12.cs", + "can_run": true + }, + { + "filename": "20.13.cs", + "can_run": true + }, + { + "filename": "20.14.cs", + "can_run": true + }, + { + "filename": "20.15.cs", + "can_run": true + }, + { + "filename": "20.16.cs", + "can_run": true + } + ], + "Chapter21": [ + { + "filename": "21.01.cs", + "can_run": true + }, + { + "filename": "21.02.cs", + "can_run": true + }, + { + "filename": "21.03.cs", + "can_run": true + }, + { + "filename": "21.04.cs", + "can_run": true + }, + { + "filename": "21.05.cs", + "can_run": true + }, + { + "filename": "21.06.cs", + "can_run": true + }, + { + "filename": "21.07.cs", + "can_run": true + }, + { + "filename": "21.08.cs", + "can_run": true + }, + { + "filename": "21.09.cs", + "can_run": true + }, + { + "filename": "21.10.cs", + "can_run": true + } + ], + "Chapter22": [ + { + "filename": "22.01.cs", + "can_run": true + }, + { + "filename": "22.02.cs", + "can_run": true + }, + { + "filename": "22.03.cs", + "can_run": true + }, + { + "filename": "22.04.cs", + "can_run": true + }, + { + "filename": "22.05.cs", + "can_run": true + }, + { + "filename": "22.06.cs", + "can_run": true + }, + { + "filename": "22.07.cs", + "can_run": true + }, + { + "filename": "22.08.cs", + "can_run": true + }, + { + "filename": "22.09.cs", + "can_run": true + }, + { + "filename": "22.10.cs", + "can_run": true + }, + { + "filename": "22.11.cs", + "can_run": true + }, + { + "filename": "22.12.cs", + "can_run": true + }, + { + "filename": "22.13.cs", + "can_run": true + } + ], + "Chapter23": [ + { + "filename": "23.01.cs", + "can_run": true + }, + { + "filename": "23.02.cs", + "can_run": true + }, + { + "filename": "23.03.cs", + "can_run": true + }, + { + "filename": "23.04.cs", + "can_run": true + }, + { + "filename": "23.05.cs", + "can_run": true + }, + { + "filename": "23.06.cs", + "can_run": true + }, + { + "filename": "23.07.cs", + "can_run": true + }, + { + "filename": "23.08.cs", + "can_run": true + }, + { + "filename": "23.09.cs", + "can_run": true + }, + { + "filename": "23.10.cs", + "can_run": true + }, + { + "filename": "23.11.cs", + "can_run": true + }, + { + "filename": "23.13.cs", + "can_run": true + }, + { + "filename": "23.14.cs", + "can_run": true + }, + { + "filename": "23.15.cs", + "can_run": true + }, + { + "filename": "23.16.cs", + "can_run": true + }, + { + "filename": "23.17.cs", + "can_run": true + }, + { + "filename": "23.18.cs", + "can_run": true + }, + { + "filename": "23.19.cs", + "can_run": true + }, + { + "filename": "23.20.cs", + "can_run": true + } + ] + }, + "statistics": { + "total_chapters": 23, + "total_listings": 617 + } +} \ No newline at end of file diff --git a/EssentialCSharp.Web/wwwroot/js/trydotnet-module.js b/EssentialCSharp.Web/wwwroot/js/trydotnet-module.js index f7cd3689..0c51c77a 100644 --- a/EssentialCSharp.Web/wwwroot/js/trydotnet-module.js +++ b/EssentialCSharp.Web/wwwroot/js/trydotnet-module.js @@ -42,19 +42,98 @@ function isTryDotNetConfigured() { return typeof origin === 'string' && origin.trim().length > 0; } +// ── Runnable-listings data (loaded once from chapter-listings.json) ────────── + +/** @type {Promise>|null} */ +let _runnableListingsPromise = null; + /** - * Creates scaffolding for user code to run in the TryDotNet environment. - * @param {string} userCode - The user's C# code to wrap - * @returns {string} Scaffolded code with proper using statements and Main method + * Loads chapter-listings.json (once) and builds a Set of normalised + * "chapter.listing" keys, e.g. "1.3", "12.50". + * Only includes listings where can_run is true. + * @returns {Promise>} */ -function createScaffolding(userCode) { - return `using System; +function loadRunnableListings() { + if (_runnableListingsPromise) return _runnableListingsPromise; + + _runnableListingsPromise = fetch('/js/chapter-listings.json') + .then(res => { + if (!res.ok) throw new Error(`Failed to load chapter-listings.json: ${res.status}`); + return res.json(); + }) + .then(data => { + const set = new Set(); + const chapters = data.chapters || {}; + for (const [, files] of Object.entries(chapters)) { + for (const fileObj of files) { + // fileObj is now { filename: "01.03.cs", can_run: true } + if (!fileObj.can_run) continue; // Skip listings that can't be run + + const filename = fileObj.filename; + // filename looks like "01.03.cs" → chapter 1, listing 3 + const m = filename.match(/^(\d+)\.(\d+)\./); + if (m) { + set.add(`${parseInt(m[1], 10)}.${parseInt(m[2], 10)}`); + } + } + } + return set; + }) + .catch(err => { + console.warn('Could not load runnable listings:', err); + return new Set(); // graceful degradation — no Run buttons + }); + + return _runnableListingsPromise; +} + +/** + * Checks whether a listing is present in the curated runnable set. + * @param {string|number} chapter + * @param {string|number} listing + * @returns {Promise} + */ +async function isRunnableListing(chapter, listing) { + const set = await loadRunnableListings(); + return set.has(`${parseInt(chapter, 10)}.${parseInt(listing, 10)}`); +} + +/** + * Strips #region / #endregion directive lines (INCLUDE, EXCLUDE, etc.) + * from source code while keeping the code between them intact. + * @param {string} code - Raw source code + * @returns {string} Code with region directive lines removed + */ +function stripRegionDirectives(code) { + return code.replace(/^\s*#(?:region|endregion)\s+(?:INCLUDE|EXCLUDE).*$/gm, '').trim(); +} + +// Common using directives that mirror the SDK's implicit global usings. +// These are needed because TryDotNet's 'console' package does not inject them. +const COMMON_USINGS = `using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Globalization; -using System.Text.RegularExpressions; +using System.Text.RegularExpressions;`; + +/** + * Prepends COMMON_USINGS to code that has no using directives of its own. + * @param {string} code - Source code + * @returns {string} + */ +function prependUsings(code) { + if (/^\s*using\s+/m.test(code)) return code; // already has usings + return `${COMMON_USINGS}\n\n${code}`; +} +/** + * Creates scaffolding for user code to run in the TryDotNet environment. + * @param {string} userCode - The user's C# code to wrap + * @returns {string} Scaffolded code with proper using statements and Main method + */ +function createScaffolding(userCode) { + return ` namespace Program { class Program @@ -222,7 +301,7 @@ export function useTryDotNet() { const files = [{ name: fileName, content: fileContent }]; const project = { package: 'console', files: files }; const document = isComplete - ? { fileName: fileName } + ? fileName : { fileName: fileName, region: 'controller' }; const configuration = { @@ -357,8 +436,10 @@ export function useTryDotNet() { /** * Checks if code is a complete C# program that doesn't need scaffolding. - * Complete programs must have a namespace declaration with class and Main, - * or be a class named Program with Main. + * A program is "complete" when it contains a namespace declaration, OR + * when it defines any class with a static Main method. + * Top-level statement files (no class, no namespace) return false and + * will be wrapped by createScaffolding(). * @param {string} code - Source code to check * @returns {boolean} True if code is complete, false if it needs scaffolding */ @@ -366,28 +447,11 @@ export function useTryDotNet() { // Check for explicit namespace declaration (most reliable indicator) const hasNamespace = /namespace\s+\w+/i.test(code); - // Check if it's a class specifically named "Program" with Main method - const isProgramClass = /class\s+Program\s*[\r\n{]/.test(code) && + // Check if any class has a static Main method + const hasClassWithMain = /class\s+\w+/.test(code) && /static\s+(void|async\s+Task)\s+Main\s*\(/.test(code); - // Only consider it complete if it has namespace or is the Program class - return hasNamespace || isProgramClass; - } - - /** - * Extracts executable code snippet from source code. - * If code contains #region INCLUDE, extracts only that portion. - * Otherwise returns the full code. - * @param {string} code - Source code to process - * @returns {string} Extracted code snippet - */ - function extractCodeSnippet(code) { - // Extract code from #region INCLUDE if present - const regionMatch = code.match(/#region\s+INCLUDE\s*\n([\s\S]*?)\n\s*#endregion\s+INCLUDE/); - if (regionMatch) { - return regionMatch[1].trim(); - } - return code; + return hasNamespace || hasClassWithMain; } /** @@ -403,8 +467,17 @@ export function useTryDotNet() { } const data = await response.json(); const code = data.content || ''; - // Extract the snippet portion if it has INCLUDE regions - return extractCodeSnippet(code); + + // Complete programs (namespace or class+Main) are sent as-is, but + // with common usings prepended when the file has none — TryDotNet's + // 'console' package does not provide SDK implicit global usings. + // Top-level statement files get region directives stripped so the + // scaffolding wrapper doesn't contain raw #region lines. + if (isCompleteProgram(code)) { + // return prependUsings(code); + return code; + } + return stripRegionDirectives(code); } /** @@ -502,12 +575,19 @@ export function useTryDotNet() { /** * Injects Run buttons into code block sections. * Skipped entirely when TryDotNet origin is not configured. + * Only adds buttons for listings present in chapter-listings.json. */ - function injectRunButtons() { + async function injectRunButtons() { if (!isTryDotNetConfigured()) { return; // Don't show Run buttons when the service is not configured } + // Pre-load the runnable listings set so we can check membership below + const runnableSet = await loadRunnableListings(); + if (runnableSet.size === 0) { + return; // JSON failed to load or is empty — no buttons + } + const codeBlocks = document.querySelectorAll('.code-block-section'); codeBlocks.forEach((block) => { @@ -553,8 +633,8 @@ export function useTryDotNet() { }); } - // Only add button for listing 1.1 - if (chapter === '1' && listing === '1') { + // Only add button for listings present in the curated JSON + if (chapter && listing && runnableSet.has(`${parseInt(chapter, 10)}.${parseInt(listing, 10)}`)) { // Wrap existing content in a span to keep it together const contentWrapper = document.createElement('span'); while (heading.firstChild) {