This runs into the problem I'd been having for 3 years. How do you get it to work when you have a tag nested inside the same kind of tag? Keeping it from matching the first close tag it finds, or the very last one.
<div> <div> <div> TEXT </div> </div> </div>
I've tried some rather complex Regex, but it just turns out that oniguruma isn't capable of doing if tests in regex. That might be a solution to the problem, but I forget the specifics of how that might work now.
This is one of the paths I'd tried a while ago:
(?xm) <(?<tag>\w+) # match the initial opening parenthesis
# Now make a named group 'balanced' which matches # a balanced substring. (?<balanced>
# Look for a single character that isn't the start of an html tag [^<]*(?=<) | # Then look for everything until something that could be and ending tag or nested tag .*?(?=</?\k<tag>) | # or is a full this tag with opening and end: <\k<tag> # A parenthesised string begins with an opening this tag \g<balanced>* # followed by a sequence of balanced substrings </\k<tag>> # and ends with a closing this tag
)* # Look for a sequence of balanced substrings
</\k<tag>> # Finally, the outer closing parenthesis
I think the problem with this was that it was crashing TextMate. I don't remember now.
—Thomas Aylott – subtleGradient—
On Nov 16, 2007, at 6:38 AM, Hans-Jörg Bibiko wrote:
On 16.11.2007, at 12:23, Thomas Aylott - subtleGradient wrote:
Thanks!
Yeah, I've already come across most of this stuff too. I just finally found something that half-worked and wanted to get it out in the world before I got bored or too busy to finish it.
Some sort of native functionality is what I would prefer. It's almost shameful that TextMate doesn't offer this natively.
For the updated version, I'll probly have it escape all brackets in the doc first, and then do another pass to put back only those brackets that are most likely to give the best balancing results. And then do all the business with selections and whatever. That should make it much more robust and capable of handling rhtml and embedded source and stuff.
The current version is only really useful on REALLY clean pages, and then only sometimes ;)
I'd also like to build up some nice testcases to check against anytime I make any changes. I bet I could use TMTOOLS to automate testing since it can move the caret around and run macros.
I attached a very FIRST approach using TMTOOLS for that.
Mainly I took the ruby script 'Insert close Tag' := $TAG [It has some tiny hooks but at the first glance it works quite well]
Then I created a SIMPLE regexp: REGEXP="(?m)<$TAG\b.*?>\/$TAG>" [One has to enhance it later!!]
Then I took that regexp for two macro: -findNext regexp -findPrevious regexp
Maybe you find some hints in it ;)
Of course, that command has no 'go backwards' function.
Cheers,
--Hans
<Select Balanced XHTML Tag FIRST APPROACH.tmCommand> ______________________________________________________________________ For new threads USE THIS: textmate@lists.macromates.com (threading gets destroyed and the universe will collapse if you don't) http://lists.macromates.com/mailman/listinfo/textmate