Hi Mariano, On Thu, May 12, 2016 at 04:50:29PM -0300, Mariano Martinez Peck wrote:
Hi guys,
I wonder which is the easier way to do the following. I have a string which inside could have something like  'this is a string with <code>some funny lines </code> and here is another <code>haha</code>'. I need to parse that string, get all places where I have things surrounded with <code>SOMETHING</code>, get the "SOMETHING" (in previous example, that would be 'some funny lines'), execute that (this is something internal) , and from that I get the real string (imagine in this case the answer is 'SOME FUNNY LINES'). Finally, I need to replace the orignal string... So ... given the input:
'this is a string with <code>some funny lines</code> and here is another <code> haha</code>'
And given my specific domain logic transformation (in this example I assume a simple #asUppercase), I would like to get:
 'this is a string with SOME FUNNY LINES and here is another HAHA'
I got it working with below lines. But it is a hack and terrible slow (I imagine). So...anyone has an idea how can I do this simpler/faster? Maybe some RB re-write rule?
Thanks in advance
| dom string originalString stringToBeAbleToParse xmlDocument replacements finalString | replacements := Dictionary new. originalString := 'this is a string with <code>some funny lines</code> and here is another <code>haha</code>'. stringToBeAbleToParse := '<hack>', originalString, '</hack>'. dom := XMLDOMParser on: stringToBeAbleToParse. dom configuration isValidating: false. xmlDocument := dom parseDocument. (xmlDocument allElementsNamed: 'code') do: [ :aXMLElement |
    "Let's simulate my domain transformation logic as a simple # asUppercase" replacements at: aXMLElement asString put: (([:code | code asUppercase ]) value: aXMLElement nodes first asString). ]. finalString := originalString. replacements keysAndValuesDo: [ :originalText :new | finalString := finalString copyReplaceAll: originalText with: new. ]. finalString
I don't think this is quite what you want, but it should be close enough to get you started: | str re oc | str := 'this is a string with <code>some funny lines</code> and here is another <code>haha</code>'. re := '<code>([^<]*)</code>' asRegex. re copy: str translatingMatchesUsing: [ :each | each asUppercase]. HTH, Alistair