]> E/V Lambda - evlambda.git/commitdiff
make contents browsable main
authorRaphaël Van Dyck <raphael.vandyck@evlambda.org>
Mon, 3 Aug 2026 12:58:38 +0000 (14:58 +0200)
committerRaphaël Van Dyck <raphael.vandyck@evlambda.org>
Mon, 3 Aug 2026 12:58:38 +0000 (14:58 +0200)
system-files/BIBLIOGRAPHY
system-files/IMPLEMENTATION-NOTES
system-files/LICENSE
system-files/REFERENCE-MANUAL
system-files/TUTORIAL
system-files/USER-MANUAL
system-files/common.js
system-files/evl2html.xslt
webpack.config.js

index 66f1f374fafab4d24400db954a0d446663b521d3..5938c6061a71d6e41465b3bedcf16fa2f6eb725f 100644 (file)
@@ -6,8 +6,8 @@
     <meta charset="utf-8">
     <title>Bibliography</title>
     <link rel="stylesheet" href="___cssURL___"/>
     <meta charset="utf-8">
     <title>Bibliography</title>
     <link rel="stylesheet" href="___cssURL___"/>
-    <script src="___jsURL___"></script>
     <script>const windowId = ___windowId___;</script>
     <script>const windowId = ___windowId___;</script>
+    <script src="___jsURL___"></script>
   </head>
   <body>
     <h1>Bibliography</h1>
   </head>
   <body>
     <h1>Bibliography</h1>
index 8e18b05af63a12bfefbd7f52938c677fa256aff0..71dec285e92cdfa11a9a3da8927c2b4ed8ff252c 100644 (file)
@@ -6,8 +6,8 @@
     <meta charset="utf-8">
     <title>Implementation Notes</title>
     <link rel="stylesheet" href="___cssURL___"/>
     <meta charset="utf-8">
     <title>Implementation Notes</title>
     <link rel="stylesheet" href="___cssURL___"/>
-    <script src="___jsURL___"></script>
     <script>const windowId = ___windowId___;</script>
     <script>const windowId = ___windowId___;</script>
+    <script src="___jsURL___"></script>
   </head>
   <body>
     <div class="preamble">
   </head>
   <body>
     <div class="preamble">
index c9f4f338ae84a4e28d3734e7c90d76859f156f44..ee80fe9d85c1b6afce4dd8311b5f65ac7b4665af 100644 (file)
@@ -6,8 +6,8 @@
     <meta charset="utf-8">
     <title>License</title>
     <link rel="stylesheet" href="___cssURL___"/>
     <meta charset="utf-8">
     <title>License</title>
     <link rel="stylesheet" href="___cssURL___"/>
-    <script src="___jsURL___"></script>
     <script>const windowId = ___windowId___;</script>
     <script>const windowId = ___windowId___;</script>
+    <script src="___jsURL___"></script>
   </head>
   <body>
     <h1>License</h1>
   </head>
   <body>
     <h1>License</h1>
index 1330ec3fb7fb4cf04d4b3f2eb1bdc979ecc9877d..aa84dd506e165852446acefea34eec28db76b9e8 100644 (file)
@@ -6,8 +6,8 @@
     <meta charset="utf-8">
     <title>Reference Manual</title>
     <link rel="stylesheet" href="___cssURL___"/>
     <meta charset="utf-8">
     <title>Reference Manual</title>
     <link rel="stylesheet" href="___cssURL___"/>
-    <script src="___jsURL___"></script>
     <script>const windowId = ___windowId___;</script>
     <script>const windowId = ___windowId___;</script>
+    <script src="___jsURL___"></script>
   </head>
   <body>
     <div class="preamble">
   </head>
   <body>
     <div class="preamble">
index 671efa694941578b184cef1428e06c2825e05650..84e4608cc4098fb8402a7eb0ec7044161051e558 100644 (file)
@@ -6,8 +6,8 @@
     <meta charset="utf-8">
     <title>Tutorial</title>
     <link rel="stylesheet" href="___cssURL___"/>
     <meta charset="utf-8">
     <title>Tutorial</title>
     <link rel="stylesheet" href="___cssURL___"/>
-    <script src="___jsURL___"></script>
     <script>const windowId = ___windowId___;</script>
     <script>const windowId = ___windowId___;</script>
+    <script src="___jsURL___"></script>
   </head>
   <body>
     <h1>Tutorial</h1>
   </head>
   <body>
     <h1>Tutorial</h1>
index 7064526f3e391324d5193fdba029f7e106a8bd21..40456fc3327bdb2caf89a16586ce0a48a17ad67a 100644 (file)
@@ -6,8 +6,8 @@
     <meta charset="utf-8">
     <title>User Manual</title>
     <link rel="stylesheet" href="___cssURL___"/>
     <meta charset="utf-8">
     <title>User Manual</title>
     <link rel="stylesheet" href="___cssURL___"/>
-    <script src="___jsURL___"></script>
     <script>const windowId = ___windowId___;</script>
     <script>const windowId = ___windowId___;</script>
+    <script src="___jsURL___"></script>
   </head>
   <body>
     <h1>User Manual</h1>
   </head>
   <body>
     <h1>User Manual</h1>
index 08c3efc9b625a9c8b1ff61d8070a3b28d22d9c5b..804de9c01ae88d03e2ca4fbc1f39f49bfe9373bf 100644 (file)
@@ -5,16 +5,17 @@
 /* Event Handlers */
 /******************/
 
 /* Event Handlers */
 /******************/
 
-window.addEventListener('focus', event => {
-  window.parent.dispatchEvent(new CustomEvent('iframeFocus', {detail: windowId}));
-});
-
-window.addEventListener('keydown', event => {
-  if (event.ctrlKey && (event.altKey || event.metaKey)) {
-    window.parent.dispatchEvent(new CustomEvent('iframeKeyDown', {detail: event}));
-    event.preventDefault();
-  }
-});
+if (windowId !== -1) {
+  window.addEventListener('focus', event => {
+    window.parent.dispatchEvent(new CustomEvent('iframeFocus', {detail: windowId}));
+  });
+  window.addEventListener('keydown', event => {
+    if (event.ctrlKey && (event.altKey || event.metaKey)) {
+      window.parent.dispatchEvent(new CustomEvent('iframeKeyDown', {detail: event}));
+      event.preventDefault();
+    }
+  });
+}
 
 /***********/
 /* MathJax */
 
 /***********/
 /* MathJax */
index 9e47cdf62fd15f4bea16a464977f2df52a768399..5e9f216b4ccaa6fb04c6507d0cc52218cd575466 100644 (file)
@@ -16,8 +16,8 @@
       <head>
         <meta charset="utf-8"/>
         <link rel="stylesheet" href="{$cssURL}"/>
       <head>
         <meta charset="utf-8"/>
         <link rel="stylesheet" href="{$cssURL}"/>
-        <script src="{$jsURL}"></script>
         <script>const windowId = <xsl:value-of select="$windowId"/>;</script>
         <script>const windowId = <xsl:value-of select="$windowId"/>;</script>
+        <script src="{$jsURL}"></script>
       </head>
       <body>
         <h1><xsl:apply-templates select="title"/></h1>
       </head>
       <body>
         <h1><xsl:apply-templates select="title"/></h1>
index 0d7b6c36ab8ff16b6b04e6e10f95ab95a1873099..dd459a3a67114f7e3e94c3721b7fd75c89923507 100644 (file)
@@ -30,6 +30,83 @@ class ArchiveSystemFilesWebpackPlugin {
   }
 }
 
   }
 }
 
+class PublishSystemFilesWebpackPlugin {
+  apply(compiler) {
+    compiler.hooks.done.tap(
+      'Publish System Files Webpack Plugin',
+      (stats) => {
+        if (['production'].includes(stats.compilation.options.mode)) {
+          writeTOC();
+        }
+      }
+    );
+  }
+}
+
+function copySystemFile(filename) {
+  fs.copyFileSync(
+    path.join(__dirname, 'system-files', filename),
+    path.join(__dirname, 'ide', 'contents', filename)
+  );
+}
+
+function writePreamble(stream, iframe) {
+  stream.write('<?php require $_SERVER[\'DOCUMENT_ROOT\'] . \'/common/common.php\'; start_session(); ?>');
+  stream.write('<!doctype html>');
+  stream.write('<html>');
+  stream.write('<?php include $_SERVER[\'DOCUMENT_ROOT\'] . \'/common/head.php\'; ?>');
+  stream.write('<body>');
+  stream.write('<?php include $_SERVER[\'DOCUMENT_ROOT\'] . \'/common/limbo.php\'; ?>');
+  stream.write('<div id="wrapper">');
+  stream.write('<?php include $_SERVER[\'DOCUMENT_ROOT\'] . \'/common/header.php\'; ?>');
+  stream.write('<?php include $_SERVER[\'DOCUMENT_ROOT\'] . \'/common/navigation-bar.php\'; ?>');
+  if (iframe) {
+    stream.write('<section id="main_content" class="iframe">');
+  } else {
+    stream.write('<section id="main_content">');
+  }
+}
+
+function writePostamble(stream) {
+  stream.write('</section>');
+  stream.write('<?php include $_SERVER[\'DOCUMENT_ROOT\'] . \'/common/footer.php\'; ?>');
+  stream.write('</div>');
+  stream.write('</body>');
+  stream.write('</html>');
+}
+
+function writeTOC() {
+  fs.mkdirSync(path.join(__dirname, 'ide', 'contents'));
+  copySystemFile('common.css');
+  copySystemFile('common.js');
+  const stream = fs.createWriteStream(path.join(__dirname, 'ide', 'contents', 'toc.php'));
+  writePreamble(stream);
+  stream.write('<ul>');
+  addTOCEntry(stream, 'USER-MANUAL');
+  addTOCEntry(stream, 'TUTORIAL');
+  addTOCEntry(stream, 'REFERENCE-MANUAL');
+  addTOCEntry(stream, 'IMPLEMENTATION-NOTES');
+  addTOCEntry(stream, 'BIBLIOGRAPHY');
+  addTOCEntry(stream, 'LICENSE');
+  stream.write('</ul>');
+  writePostamble(stream);
+  stream.end();
+}
+
+function addTOCEntry(tocStream, filename) {
+  let contents = fs.readFileSync(path.join(__dirname, 'system-files', filename), {encoding: 'utf8'});
+  contents = contents.replaceAll('___cssURL___', 'common.css');
+  contents = contents.replaceAll('___jsURL___', 'common.js');
+  contents = contents.replaceAll('___windowId___', -1);
+  fs.writeFileSync(path.join(__dirname, 'ide', 'contents', filename + '.html'), contents);
+  const stream = fs.createWriteStream(path.join(__dirname, 'ide', 'contents', filename + '.php'));
+  writePreamble(stream, true);
+  stream.write(`<iframe src="${filename + '.html'}"></iframe>`);
+  writePostamble(stream);
+  stream.end();
+  tocStream.write(`<li><a href="${filename + '.php'}">${filename}</a></li>`);
+}
+
 class GenerateBOMWebpackPlugin {
   apply(compiler) {
     compiler.hooks.done.tap(
 class GenerateBOMWebpackPlugin {
   apply(compiler) {
     compiler.hooks.done.tap(
@@ -189,6 +266,7 @@ export default {
       ]
     }),
     new ArchiveSystemFilesWebpackPlugin(),
       ]
     }),
     new ArchiveSystemFilesWebpackPlugin(),
+    new PublishSystemFilesWebpackPlugin(),
     new GenerateBOMWebpackPlugin()
   ],
   mode: 'development'
     new GenerateBOMWebpackPlugin()
   ],
   mode: 'development'