{ lines[NR] = $0 total = NR if (/^\[[^\]]+\]: */) { line = $0 sub(/^\[/, "", line) ref_id = line sub(/\].*/, "", ref_id) line = $0 sub(/^\[[^\]]+\]: */, "", line) ref_url = line sub(/[ \t].*/, "", ref_url) ref_title = $0 sub(/^\[[^\]]+\]: *[^\t ]*[ \t]*/, "", ref_title) sub(/^"/, "", ref_title) sub(/"$/, "", ref_title) gsub(/\|/, "!", ref_title) refs[ref_id] = ref_url if (ref_title != "") titles[ref_id] = ref_title is_ref[NR] = 1 } } function resolve_image_ref(alt, id, url, title) { url = refs[id] title = (id in titles) ? titles[id] : "" if (url == "") return "![" alt "][" id "]" return "\""" } function resolve_link_ref(text, id, url, title) { url = refs[id] title = (id in titles) ? titles[id] : "" if (url == "") return "[" text "][" id "]" return "" text "" } function process_refs(line, result, i, len, ch, j, k, depth, bracket_content, ref_id) { result = "" len = length(line) i = 1 while (i <= len) { ch = substr(line, i, 1) if (ch == "!" && i < len && substr(line, i + 1, 1) == "[") { bracket_content = "" j = i + 2 while (j <= len && substr(line, j, 1) != "]") { bracket_content = bracket_content substr(line, j, 1) j++ } if (j <= len && j < len && substr(line, j + 1, 1) == "[") { k = j + 2 ref_id = "" while (k <= len && substr(line, k, 1) != "]") { ref_id = ref_id substr(line, k, 1) k++ } if (k <= len) { if (ref_id == "") ref_id = bracket_content if (ref_id in refs) { result = result resolve_image_ref(bracket_content, ref_id) i = k + 1 continue } } } result = result substr(line, i, 1) i++ } else if (ch == "[") { bracket_content = "" j = i + 1 depth = 1 while (j <= len && depth > 0) { if (substr(line, j, 1) == "[") depth++ if (substr(line, j, 1) == "]") { depth-- if (depth == 0) break } if (depth > 0) bracket_content = bracket_content substr(line, j, 1) j++ } if (j <= len && j < len && substr(line, j + 1, 1) == "[") { k = j + 2 ref_id = "" while (k <= len && substr(line, k, 1) != "]") { ref_id = ref_id substr(line, k, 1) k++ } if (k <= len) { if (ref_id == "") ref_id = bracket_content if (ref_id in refs) { result = result resolve_link_ref(bracket_content, ref_id) i = k + 1 continue } } } result = result substr(line, i, 1) i++ } else { result = result ch i++ } } return result } END { for (n = 1; n <= total; n++) { if (is_ref[n]) continue print process_refs(lines[n]) } }