Skip to content

Commit

Permalink
Update HTML to support more files
Browse files Browse the repository at this point in the history
  • Loading branch information
JasonGross committed Mar 1, 2025
1 parent 337a125 commit b5eb8e5
Show file tree
Hide file tree
Showing 3 changed files with 367 additions and 27 deletions.
181 changes: 166 additions & 15 deletions fiat-html/fiat-crypto.html
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
white-space: pre-wrap;
}

/*code { display: block; white-space: pre-wrap; border: 1px solid #ddd; padding: 10px; position: relative; }*/
.code-container {
position: relative;
}
Expand All @@ -21,8 +20,6 @@
border: 1px solid #ddd;
padding: 10px;
position: relative;
/*margin-bottom: 20px;*/
/* Space for the button, adjust as needed */
}

.copy-button {
Expand All @@ -49,6 +46,7 @@
display: flex;
flex-wrap: wrap;
align-items: center;
/* margin-bottom: 10px; */
}

.form-row label,
Expand All @@ -67,12 +65,122 @@
.version {
color: #333;
}

/*#io-container {
display: flex;
flex-wrap: wrap;
gap: 10px;
margin-top: 10px;
}
#io-container>div {
flex: 1 1 50%;
min-width: 300px;
border: 1px solid #ddd;
padding: 10px;
box-sizing: border-box;
}
#io-container h3 {
margin-top: 0;
}
.stdin-line,
.file-entry {
display: flex;
align-items: center;
margin-bottom: 5px;
}
.stdin-line textarea,
.file-entry textarea {
flex: 1;
margin-left: 5px;
}
.file-entry input {
margin-right: 5px;
}*/
.input-columns {
display: flex;
flex-direction: row;
gap: 20px;
width: 100%;
}

.stdin-column,
.files-column {
flex: 1;
min-width: 0;
}

.stdin-entry,
.file-entry {
display: flex;
margin-bottom: 10px;
position: relative;
}

.stdin-textarea,
.file-content {
flex-grow: 1;
min-height: 60px;
resize: vertical;
padding: 8px;
margin-right: 5px;
}

.file-name {
margin-bottom: 5px;
width: 100%;
padding: 5px;
}

.file-entry {
flex-direction: column;
}

.file-entry .remove-btn {
position: absolute;
right: 0;
top: 0;
}

.remove-btn,
.add-btn {
background: #f0f0f0;
border: 1px solid #ccc;
border-radius: 3px;
cursor: pointer;
padding: 2px 8px;
font-weight: bold;
}

.add-btn {
margin-top: 5px;
}

@media (max-width: 768px) {
.input-columns {
flex-direction: column;
}

.stdin-column,
.files-column {
width: 100%;
margin-bottom: 20px;
}
}
</style>
</head>

<body>
<div id="versionContainer"><span class="version">Fiat Cryptography <span id="version"></span> (<a
href="https://github.com/mit-plv/fiat-crypto">GitHub Source</a>)</span></div>
<div id="versionContainer">
<span class="version">
Fiat Cryptography <span id="version"></span> (<a href="https://github.com/mit-plv/fiat-crypto">GitHub
Source</a>)
</span>
</div>
<form id="inputForm" class="hidden">
<div class="form-row">
<input type="text" id="inputArgs" placeholder="Enter arguments">
Expand All @@ -89,16 +197,27 @@
id="extraWasmLabel"></span>
</label>
</div>
<div class="form-row" class="hidden">
<label class="hidden">Stdin
<textarea id="stdin" class="hidden" placeholder="Enter stdin"></textarea>
</label>
<label class="hidden">Files
<textarea id="files" class="hidden" placeholder="Enter files"></textarea>
</label>
<label class="hidden">Output Files
<textarea id="outputFiles" class="hidden" placeholder="Output files"></textarea>
</label>
<div class="form-row">
<div class="input-columns">
<div class="stdin-column hidden">
<h3>Standard Input</h3>
<div class="stdin-entries" id="stdinEntries"></div>
<button type="button" id="addStdinButton" class="add-btn">+</button>
<textarea id="stdin" class="hidden" placeholder="Enter stdin" readonly></textarea>
</div>
<div class="files-column">
<h3>Input Files</h3>
<div class="file-entries" id="fileEntries">
<div class="file-entry">
<input type="text" class="file-name" placeholder="Filename">
<textarea class="file-content" placeholder="File content"></textarea>
<button type="button" class="remove-btn">-</button>
</div>
</div>
<button type="button" id="addFileButton" class="add-btn">+</button>
<textarea id="files" class="hidden" placeholder="Enter files" readonly></textarea>
</div>
</div>
</div>
<div class="form-row">
<button type="button" id="synthesizeButton">Synthesize</button>
Expand All @@ -118,13 +237,45 @@
<code id="stderr" class="code"></code>
<button class="copy-button" data-target="stderr">Copy</button>
</div>
<div id="outputFilesContainer" class="code-container-container hidden"></div>
</div>
<script src="version.js"></script>
<script src="https://unpkg.com/wasm-feature-detect/dist/umd/index.js"></script>
<script src="file-input.js"></script>
<script src="main.js"></script>
<!-- N.B. disable-wasm-option.js must come after main.js so that the wasm box is unchecked correctly after parsing argv -->
<script src="disable-wasm-option.js"></script>
<script src="copy-button.js"></script>
<!-- Optional: Add script to handle dynamic addition/removal of stdin and file entries -->
<!-- <script>
// Example dynamic behavior for stdin entries
const stdinLines = document.getElementById('stdin-lines');
document.getElementById('add-stdin-line').addEventListener('click', () => {
const div = document.createElement('div');
div.className = 'stdin-line';
div.innerHTML = '<button type="button" class="remove-stdin-line">-</button><textarea placeholder="Enter a stdin line"></textarea>';
stdinLines.appendChild(div);
});
stdinLines.addEventListener('click', (e) => {
if (e.target.classList.contains('remove-stdin-line')) {
e.target.parentElement.remove();
}
});
// Example dynamic behavior for file entries
const filesEntries = document.getElementById('files-entries');
document.getElementById('add-file-entry').addEventListener('click', () => {
const div = document.createElement('div');
div.className = 'file-entry';
div.innerHTML = '<button type="button" class="remove-file-entry">-</button><input type="text" placeholder="File Name"><textarea placeholder="File Contents"></textarea>';
filesEntries.appendChild(div);
});
filesEntries.addEventListener('click', (e) => {
if (e.target.classList.contains('remove-file-entry')) {
e.target.parentElement.remove();
}
});
</script> -->
</body>

</html>
156 changes: 156 additions & 0 deletions fiat-html/file-input.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
function getStdinFromFormBoxRaw() {
const stdinBox = document.getElementById('stdin');
return stdinBox.value;
}

function getFilesFromFormBoxRaw() {
const filesBox = document.getElementById('files');
return filesBox.value;
}


function getStdinFromFormBox() {
return JSON.parse(getStdinFromFormBoxRaw() || '[]');
}

function getFilesFromFormBox() {
return JSON.parse(getFilesFromFormBoxRaw() || '{}');
}

function populateStdinEntries(stdin) {
const stdinEntries = document.getElementById('stdinEntries');

if (stdin === undefined) {
stdin = getStdinFromFormBox();
}
const entries = stdinEntries.querySelectorAll('.stdin-entry');
entries.forEach(entry => {
entry.remove();
});
stdin.forEach(line => {
const entry = createStdinEntry(line);
stdinEntries.appendChild(entry);
});
}

function populateFileEntries(files) {
const fileEntries = document.getElementById('fileEntries');

if (files === undefined) {
files = getFilesFromFormBox();
}
const entries = fileEntries.querySelectorAll('.file-entry');
entries.forEach(entry => {
entry.remove();
});
Object.entries(files).forEach(([filename, content]) => {
const entry = createFileEntry(filename, content);
fileEntries.appendChild(entry);
});
}

document.addEventListener('DOMContentLoaded', function () {
const stdinEntries = document.getElementById('stdinEntries');
const fileEntries = document.getElementById('fileEntries');
const addStdinButton = document.getElementById('addStdinButton');
const addFileButton = document.getElementById('addFileButton');
const stdinBox = document.getElementById('stdin');
const filesBox = document.getElementById('files');

// Function to create a new file entry
function createFileEntry(filename, content) {
filename = filename || '';
content = content || '';
const fileEntryHTML = `
<div class="file-entry">
<input type="text" class="file-name" placeholder="Filename">
<textarea class="file-content" placeholder="File content"></textarea>
<button type="button" class="remove-btn">-</button>
</div>
`;

const template = document.createElement('template');
template.innerHTML = fileEntryHTML.trim();
const entry = template.content.firstElementChild.cloneNode(true);

entry.querySelector('.file-name').value = filename;
entry.querySelector('.file-content').value = content;

const removeButton = entry.querySelector('.remove-btn');
removeButton.addEventListener('click', function () {
entry.remove();
updateFilesValue();
});

const nameInput = entry.querySelector('.file-name');
const contentTextarea = entry.querySelector('.file-content');

nameInput.addEventListener('input', updateFilesValue);
contentTextarea.addEventListener('input', updateFilesValue);

return entry;
}

function createStdinEntry(line) {
line = line || '';
const stdinEntryHTML = `
<div class="stdin-entry">
<textarea class="stdin-textarea" placeholder="Enter stdin"></textarea>
<button type="button" class="remove-btn">-</button>
</div>
`;

const template = document.createElement('template');
template.innerHTML = stdinEntryHTML.trim();
const entry = template.content.firstElementChild.cloneNode(true);

entry.querySelector('.stdin-textarea').value = line;

const removeButton = entry.querySelector('.remove-btn');
removeButton.addEventListener('click', function () {
entry.remove();
updateStdinValue();
});

return entry;
}

// Function to update the hidden stdin input value
function updateStdinValue() {
const entries = stdinEntries.querySelectorAll('.stdin-entry');
const stdinArray = Array.from(entries).map(entry => {
const textarea = entry.querySelector('.stdin-textarea');
return textarea.value.split('\n').map(line => line + '\n');
});
stdinBox.value = JSON.stringify(stdinArray);
}

// Function to update the hidden files input value
function updateFilesValue() {
const entries = fileEntries.querySelectorAll('.file-entry');
const filesObj = {};

Array.from(entries).forEach(entry => {
const nameInput = entry.querySelector('.file-name');
const contentTextarea = entry.querySelector('.file-content');

if (nameInput.value.trim()) {
filesObj[nameInput.value] = contentTextarea.value.split('\n').map(line => line + '\n');
}
});

filesBox.value = JSON.stringify(filesObj);
}

// Add event listeners for adding new entries
addStdinButton.addEventListener('click', function () {
stdinEntries.appendChild(createStdinEntry());
});

addFileButton.addEventListener('click', function () {
fileEntries.appendChild(createFileEntry());
});

populateStdinEntries();
populateFileEntries();
});
Loading

0 comments on commit b5eb8e5

Please sign in to comment.