Hey ElixirForum… working with HTML + regex right now, ran into some trouble that I’d appreciate some outside eyes on.
Here’s the code as it stands:
def code do
html = ~S"""
<span class="token keyword">import</span> React<span class="token punctuation">,</span> <span class="token punctuation">{</span> useState <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'react'</span><span class="token punctuation">;</span>
<span class="token keyword">function</span> <span class="token function">Example</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// Declare a new state variable, which we'll call "count"</span>
<span class="token keyword">const</span> <span class="token punctuation">[</span>count<span class="token punctuation">,</span> setCount<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">useState</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token punctuation">(</span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span><span class="token plain-text">
</span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span><span class="token plain-text">You clicked </span><span class="token punctuation">{</span>count<span class="token punctuation">}</span><span class="token plain-text"> times</span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span><span class="token plain-text">
</span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>button</span> <span class="token attr-name">onClick</span><span class="token script language-javascript"><span class="token script-punctuation punctuation">=</span><span class="token punctuation">{</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token function">setCount</span><span class="token punctuation">(</span>count <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">}</span></span><span class="token punctuation">></span></span><span class="token plain-text">
Click me
</span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>button</span><span class="token punctuation">></span></span><span class="token plain-text">
</span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span>
<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
"""
Regex.replace(~r/>([^&<]+)<\/span>/, html, fn _, y -> ">#{wrap(y)}" end)
end
def wrap(x) do
x |> String.split("") |> Enum.with_index |> Enum.map( fn({char,index}) -> "<span id='CHAR-#{index}'>#{char}</span>" end) |> Enum.join("")
end
The goal is to wrap every character inside HTML tags so it looks like this: <span id='char-#{CHAR_INDEX}'>CHAR_HERE</span>
. The end result should hopefully look something like this: <span class="token keyword"><span id="char-0"></span><span id="char-1">i</span><span id="char-2">m</span><span id="char-3">p</span><span id="char-4">o</span><span id="char-5">r</span><span id="char-6">t</span><span id="char-7"></span>...
Right now, my wrap function gets called many times for this HTML, so my CHAR-#{index} id repeats itself quite often. What’s the recommended pattern here to combine an accumulator with a Regex replace operation?