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();