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

Reply via email to