Semicolon insertion
Semicolon insertion strategy that allows
by ahnfelt
HTML
<div>
<textarea id="input" style="width: 500px; height: 200px">
let list2 = list1
|> myListFunction
|> myOtherListFunction
balance
- rent
- purchases
greens + reds
(-blues)
f() g()
if(x > y) {
x
} else {
y
}
</textarea>
<div><button type="button" onclick="update()">Update</button></div>
<pre><code id="output"></code></pre>
</div>
JavaScript
function update() {
let input = document.querySelector("#input").textContent;
let result = tokenize(input);
console.dir(result);
document.querySelector("#output").textContent = result.join('');
}
let beforeSemicolon = /[a-zA-Z0-9_\)\]\}]+/;
let afterSemicolon = /[a-zA-Z0-9_\(\[\{]+/;
function tokenize(input) {
let pattern = /([a-zA-Z0-9_]+)|([!@#$%&/=+?^~*.:,;<>|-]+)|([(){}\[\]])|([^]+?)/g;
let result = [];
let newline = false;
let lastToken = '';
let whitespace = '';
while(true) {
let match = pattern.exec(input);
if(!match) {
result.push(whitespace);
return result;
}
if(match[4]) {
newline = newline || match[4].includes('\n');
whitespace += match[4];
continue;
}
let token = match[0];
if(newline && beforeSemicolon.test(lastToken) && afterSemicolon.test(token)) result.push(';');
result.push(whitespace);
result.push(token);
newline = false;
lastToken = token;
whitespace = '';
}
}
update();