JSFiddle - React, Tailwind, and code Playground

CSS

body {
    padding: 2em;
    font-family: Courier, monospace;
    font-size: 12px;
    white-space: pre;
}

JavaScript

var input = "Nicaragua [[NOTE|s|note|Congo was a member of ICCROM from 1999 and Nicaragua from 1971. Both were suspended by the ICCROM General Assembly in November 2013 having omitted to pay contributions for six consecutive calendar years (ICCROM [[Statutes|s|url|www.iccrom.org/about/statutes/]], article 9).]]. Another [[link|s|url|google.com]] that might appear.";

function toPoorMansAST(s) {
    // escape double-quotes, as they'll cause problems otherwise. This converts them
    // to unicode, which is safe for JSON parsing.
    s = s.replace(/"/g, "\u0022");
    // Transform to a JSON string!
    s =
        // Wrap in array delimiters
        ('["' + s + '"]')
        // replace token starts
        .replace(/\[\[([^\|]+)\|([^\|]+)\|([^\|]+)\|/g,
             '",{"display_text":"$1","code":"$2","type":"$3","content":["')
        // replace token ends
        .replace(/\]\]/g, '"]},"');
    
    return JSON.parse(s);
}


document.body.innerHTML = JSON.stringify(toPoorMansAST(input), null, "  ");