interactive-shader-format-for-modv
Version:
Rendering engine for Interactive Shader Format effects and generators
39 lines (35 loc) • 1.2 kB
JavaScript
export default function MetadataExtractor(rawFragmentShader) {
// First pull out the comment JSON to get the metadata.
// This regex (should) match quotes in the form /* */.
const regex = /\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/;
const results = regex.exec(rawFragmentShader);
if (!results) {
throw new Error('There is no metadata here.');
}
let metadataString = results[0];
metadataString = metadataString.substring(1, metadataString.length - 1);
let metadata;
try {
metadata = JSON.parse(metadataString);
} catch (e) {
const tokens = e.message.split(' ');
const position = parseInt(tokens[tokens.length - 1], 10);
let lineNumber = 1;
for (let i = 0; i < position; i++) {
if (metadataString[i] === '\n') {
lineNumber++;
}
}
const lineError = new Error(`Something is wrong with your metadata at position ${position} and line ${lineNumber}`);
lineError.lineNumber = lineNumber;
throw lineError;
}
const startIndex = rawFragmentShader.indexOf('/*');
const endIndex = rawFragmentShader.indexOf('*/');
return {
objectValue: metadata,
stringValue: metadataString,
startIndex,
endIndex,
};
}