create index.html for all games

This commit is contained in:
Alexander Wunschik
2022-03-12 23:14:59 +01:00
committed by Alexander Wunschik
parent f7deaba4a1
commit fe07ab2589
2 changed files with 214 additions and 0 deletions

103
00_Utilities/build-index.js Normal file
View File

@@ -0,0 +1,103 @@
#!/usr/bin/env node
/**
* This script creates an "index.html" file in the root of the directory.
*
* Call this from the root of the project with
* `node ./00_Utilities/build-index.js`
*/
const fs = require('fs');
const path = require('path');
const TITLE = 'BASIC Computer Games';
const JAVASCRIPT_FOLDER = 'javascript';
const IGNORE_FOLDERS_START_WITH = ['.', '00_', 'buildJvm', 'Sudoku'];
function createIndexHtml(title, games) {
const listEntries = games.map(game =>
`<li><a href="${game.htmlFile}">${game.name}</a></li>`
).map(entry => `\t\t\t${entry}`).join('\n');
return `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>${title}</title>
</head>
<body>
<header>
<h1>${title}</h1>
</header>
<main>
<ul>
${listEntries}
</ul>
</main>
</body>
</html>
`.replace(/\t/g, ' ').trim();
}
function findHtmlFileInFolder(folder) {
// filter folders that do not include a subfolder called "javascript"
const hasJavascript = fs.existsSync(`${folder}/${JAVASCRIPT_FOLDER}`);
if (!hasJavascript) {
throw new Error(`Game "${folder}" is missing a javascript implementation`);
}
// get all files in the javascript folder
const files = fs.readdirSync(`${folder}/${JAVASCRIPT_FOLDER}`);
// filter files only allow .html files
const htmlFiles = files.filter(file => file.endsWith('.html'));
if (htmlFiles.length == 0) {
throw new Error(`Game "${folder}" is missing a html file in the "${folder}/${JAVASCRIPT_FOLDER}" folder`);
} else if (htmlFiles.length > 1) {
console.warn(`Game "${folder}" has multible html files. I'm just taking the first one "${htmlFiles[0]}"`);
}
return path.join(folder, JAVASCRIPT_FOLDER, htmlFiles[0]);
}
function main() {
// Get the list of all folders in the current director
let folders = fs.readdirSync(process.cwd());
// filter files only allow folders
folders = folders.filter(folder => fs.statSync(folder).isDirectory());
// filter out the folders that start with a dot or 00_
folders = folders.filter(folder => {
return !IGNORE_FOLDERS_START_WITH.some(ignore => folder.startsWith(ignore));
});
// sort the folders alphabetically (by number)
folders = folders.sort();
// get name and javascript file from folder
const games = folders.map(folder => {
const name = folder.replace('_', ' ');
let htmlFile;
try {
htmlFile = findHtmlFileInFolder(folder);
} catch (error) {
console.warn(`Game "${name}" is missing a javascript implementation: ${error.message}`);
return null;
}
return {
name,
htmlFile
}
}).filter(game => game !== null);
// create a index.html file with a list of all games
const htmlContent = createIndexHtml(TITLE, games);
fs.writeFileSync('index.html', htmlContent);
console.log(`index.html successfully created!`);
}
main();

111
index.html Normal file
View File

@@ -0,0 +1,111 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>BASIC Computer Games</title>
</head>
<body>
<header>
<h1>BASIC Computer Games</h1>
</header>
<main>
<ul>
<li><a href="01_Acey_Ducey/javascript/aceyducey.html">01 Acey_Ducey</a></li>
<li><a href="02_Amazing/javascript/amazing.html">02 Amazing</a></li>
<li><a href="03_Animal/javascript/animal.html">03 Animal</a></li>
<li><a href="04_Awari/javascript/awari.html">04 Awari</a></li>
<li><a href="05_Bagels/javascript/bagels.html">05 Bagels</a></li>
<li><a href="06_Banner/javascript/banner.html">06 Banner</a></li>
<li><a href="07_Basketball/javascript/basketball.html">07 Basketball</a></li>
<li><a href="08_Batnum/javascript/batnum.html">08 Batnum</a></li>
<li><a href="09_Battle/javascript/battle.html">09 Battle</a></li>
<li><a href="10_Blackjack/javascript/blackjack.html">10 Blackjack</a></li>
<li><a href="11_Bombardment/javascript/bombardment.html">11 Bombardment</a></li>
<li><a href="12_Bombs_Away/javascript/bombsaway.html">12 Bombs_Away</a></li>
<li><a href="13_Bounce/javascript/bounce.html">13 Bounce</a></li>
<li><a href="14_Bowling/javascript/bowling.html">14 Bowling</a></li>
<li><a href="15_Boxing/javascript/boxing.html">15 Boxing</a></li>
<li><a href="16_Bug/javascript/bug.html">16 Bug</a></li>
<li><a href="17_Bullfight/javascript/bullfight.html">17 Bullfight</a></li>
<li><a href="18_Bullseye/javascript/bullseye.html">18 Bullseye</a></li>
<li><a href="19_Bunny/javascript/bunny.html">19 Bunny</a></li>
<li><a href="20_Buzzword/javascript/buzzword.html">20 Buzzword</a></li>
<li><a href="21_Calendar/javascript/calendar.html">21 Calendar</a></li>
<li><a href="22_Change/javascript/change.html">22 Change</a></li>
<li><a href="23_Checkers/javascript/checkers.html">23 Checkers</a></li>
<li><a href="24_Chemist/javascript/chemist.html">24 Chemist</a></li>
<li><a href="25_Chief/javascript/chief.html">25 Chief</a></li>
<li><a href="26_Chomp/javascript/chomp.html">26 Chomp</a></li>
<li><a href="27_Civil_War/javascript/civilwar.html">27 Civil_War</a></li>
<li><a href="28_Combat/javascript/combat.html">28 Combat</a></li>
<li><a href="29_Craps/javascript/craps.html">29 Craps</a></li>
<li><a href="30_Cube/javascript/cube.html">30 Cube</a></li>
<li><a href="31_Depth_Charge/javascript/depthcharge.html">31 Depth_Charge</a></li>
<li><a href="32_Diamond/javascript/diamond.html">32 Diamond</a></li>
<li><a href="33_Dice/javascript/dice.html">33 Dice</a></li>
<li><a href="34_Digits/javascript/digits.html">34 Digits</a></li>
<li><a href="35_Even_Wins/javascript/evenwins.html">35 Even_Wins</a></li>
<li><a href="36_Flip_Flop/javascript/flipflop.html">36 Flip_Flop</a></li>
<li><a href="37_Football/javascript/football.html">37 Football</a></li>
<li><a href="38_Fur_Trader/javascript/furtrader.html">38 Fur_Trader</a></li>
<li><a href="39_Golf/javascript/golf.html">39 Golf</a></li>
<li><a href="40_Gomoko/javascript/gomoko.html">40 Gomoko</a></li>
<li><a href="41_Guess/javascript/guess.html">41 Guess</a></li>
<li><a href="42_Gunner/javascript/gunner.html">42 Gunner</a></li>
<li><a href="43_Hammurabi/javascript/hammurabi.html">43 Hammurabi</a></li>
<li><a href="44_Hangman/javascript/hangman.html">44 Hangman</a></li>
<li><a href="45_Hello/javascript/hello.html">45 Hello</a></li>
<li><a href="46_Hexapawn/javascript/hexapawn.html">46 Hexapawn</a></li>
<li><a href="47_Hi-Lo/javascript/hi-lo.html">47 Hi-Lo</a></li>
<li><a href="48_High_IQ/javascript/highiq.html">48 High_IQ</a></li>
<li><a href="49_Hockey/javascript/hockey.html">49 Hockey</a></li>
<li><a href="50_Horserace/javascript/horserace.html">50 Horserace</a></li>
<li><a href="51_Hurkle/javascript/hurkle.html">51 Hurkle</a></li>
<li><a href="52_Kinema/javascript/kinema.html">52 Kinema</a></li>
<li><a href="53_King/javascript/king.html">53 King</a></li>
<li><a href="54_Letter/javascript/letter.html">54 Letter</a></li>
<li><a href="55_Life/javascript/life.html">55 Life</a></li>
<li><a href="56_Life_for_Two/javascript/lifefortwo.html">56 Life_for_Two</a></li>
<li><a href="57_Literature_Quiz/javascript/litquiz.html">57 Literature_Quiz</a></li>
<li><a href="58_Love/javascript/love.html">58 Love</a></li>
<li><a href="59_Lunar_LEM_Rocket/javascript/lem.html">59 Lunar_LEM_Rocket</a></li>
<li><a href="60_Mastermind/javascript/mastermind.html">60 Mastermind</a></li>
<li><a href="61_Math_Dice/javascript/mathdice.html">61 Math_Dice</a></li>
<li><a href="62_Mugwump/javascript/mugwump.html">62 Mugwump</a></li>
<li><a href="63_Name/javascript/name.html">63 Name</a></li>
<li><a href="64_Nicomachus/javascript/nicomachus.html">64 Nicomachus</a></li>
<li><a href="65_Nim/javascript/nim.html">65 Nim</a></li>
<li><a href="66_Number/javascript/number.html">66 Number</a></li>
<li><a href="67_One_Check/javascript/onecheck.html">67 One_Check</a></li>
<li><a href="68_Orbit/javascript/orbit.html">68 Orbit</a></li>
<li><a href="69_Pizza/javascript/pizza.html">69 Pizza</a></li>
<li><a href="70_Poetry/javascript/poetry.html">70 Poetry</a></li>
<li><a href="71_Poker/javascript/poker.html">71 Poker</a></li>
<li><a href="72_Queen/javascript/queen.html">72 Queen</a></li>
<li><a href="73_Reverse/javascript/reverse.html">73 Reverse</a></li>
<li><a href="74_Rock_Scissors_Paper/javascript/rockscissors.html">74 Rock_Scissors_Paper</a></li>
<li><a href="75_Roulette/javascript/roulette.html">75 Roulette</a></li>
<li><a href="76_Russian_Roulette/javascript/russianroulette.html">76 Russian_Roulette</a></li>
<li><a href="77_Salvo/javascript/salvo.html">77 Salvo</a></li>
<li><a href="79_Slalom/javascript/slalom.html">79 Slalom</a></li>
<li><a href="80_Slots/javascript/slots.html">80 Slots</a></li>
<li><a href="81_Splat/javascript/splat.html">81 Splat</a></li>
<li><a href="82_Stars/javascript/stars.html">82 Stars</a></li>
<li><a href="83_Stock_Market/javascript/stockmarket.html">83 Stock_Market</a></li>
<li><a href="84_Super_Star_Trek/javascript/index.html">84 Super_Star_Trek</a></li>
<li><a href="85_Synonym/javascript/synonym.html">85 Synonym</a></li>
<li><a href="86_Target/javascript/target.html">86 Target</a></li>
<li><a href="87_3-D_Plot/javascript/3dplot.html">87 3-D_Plot</a></li>
<li><a href="88_3-D_Tic-Tac-Toe/javascript/qubit.html">88 3-D_Tic-Tac-Toe</a></li>
<li><a href="89_Tic-Tac-Toe/javascript/tictactoe1.html">89 Tic-Tac-Toe</a></li>
<li><a href="90_Tower/javascript/tower.html">90 Tower</a></li>
<li><a href="91_Train/javascript/train.html">91 Train</a></li>
<li><a href="92_Trap/javascript/trap.html">92 Trap</a></li>
<li><a href="93_23_Matches/javascript/23matches.html">93 23_Matches</a></li>
<li><a href="94_War/javascript/war.html">94 War</a></li>
<li><a href="95_Weekday/javascript/weekday.html">95 Weekday</a></li>
<li><a href="96_Word/javascript/word.html">96 Word</a></li>
</ul>
</main>
</body>
</html>