By the way, this bug is reported as issue #319 : http://code.google.com/p/google-wave-resources/issues/detail?id=319 . You can vote for it :-)
2009/11/18 Raphaël Pinson <[email protected]>: > On Wed, Nov 18, 2009 at 12:41 AM, Blixt <[email protected]> wrote: >> I experienced the same problem as you (I think). My solution was to >> simply put all replacements I wanted to do in a list (every item >> containing the range and text for the replacement), and then doing the >> replacements closest to the end of the blip first, then continuing >> towards the start. Here's some sample code: >> >> items = [] >> # Normally you would add to "items" dynamically, the below is just an >> example. >> # I put it in two steps so you don't miss that one item is actually a >> tuple of two values. >> item = (waveapi.document.Range(10, 20), 'Hello World!') >> items.append(item) >> >> # Sort the "items" list so that the ranges closest to the end of the >> document come first. >> items.sort(lambda a, b: cmp(b[0].start, a[0].start)) >> >> # Loop through each item and perform the replacement. >> for rng, text in items: >> document.SetTextInRange(rng, text) >> # Here you can also set annotations etc... >> >> > > That would have worked for me some time ago, but now it gets much more > complicated since I have annotations as well. Thanks for the idea :-) > > > >> >> On Nov 17, 1:08 am, Raphaël Pinson <[email protected]> wrote: >>> Hi guys, >>> >>> It's my first post to this list, so I'm sorry I'm going to complain, >>> but before I do that I want to thank the Wave team for this great >>> product. It's a lot of fun using, very useful and fun to program bots. >>> >>> Now, I've been working on a bot for a few days. This is a Bible bot, >>> found >>> onhttps://launchpad.net/wavebiblebotandhttp://wave-samples-gallery.appspot.com/about_app?app_id=70035. >>> >>> This bot is written in python. It is inspired by the Wikifier bot >>> quite a bit. Its function is to detect and replace tags with verses or >>> verse links. Now, to the point. >>> >>> Bear with me, this is long, and I really hope the Wave API developers >>> are around reading this. >>> >>> === Issues with SetTextInRange === >>> >>> When I began writing the bot, I used SetText like the Wikifier python >>> robot does. I soon realized it was ruining all the existing >>> annotations of the blip, so I stopped using it and began playing with >>> ranges and SetTextInRange, which is what I use now. >>> >>> Then I found something weird, that I haven't understood yet: when I >>> make several replacements in a blip, positions are somehow slided by 1 >>> character after each replacement. Let me take an example. Let's say I >>> want to replace 3 tags that I have identified. >>> >>> For each tag, I make sure to get the position from >>> blip.GetDocument().GetText() each time, in order to not use an >>> obsolete text. The position returned for the first tag is correct, and >>> I replace it. Then I switch to the second tag, and once I replace it, >>> it gets one character to the left of the returned position, and I >>> replace it (and it gets ugly). Then I switch to the third tag, and it >>> gets slided two characters to the left, and so on. >>> >>> I've scratched my head on this and I don't get it. As a patch in my >>> code, I have a "replaced" variable which I indent everytime I call >>> SetTextInRange, and I add its value to the calculated position for >>> every tag. This is the first issue I've found. >>> >>> === Stretching it further, the "replaced" counter mess === >>> >>> Now the problem is that I had two functions, placeVerses(blip, >>> replaced) and placeVerseLinks(blip, replaced), called one after the >>> other. The first one would replace all verse quotes, while the second >>> one would replace all verse links. Easy! Well, no! The "replaced" >>> counter got in the way when I began to mix "verse" and "verselink" >>> tags in one blip, as SetTextInRange would get called to replace a tag >>> that was previous to a tag already replaced, hence messing up with the >>> "replaced" counter again... >>> >>> As a result, I fixed this by merging my two functions into one, with >>> the "replaced" counter inside it only, to ensure that all tags would >>> be replaced in order. This new function is called placeTags(blip) and >>> is getting quite big now ;-) >>> >>> === Annotations, langs... === >>> >>> Once this was fixed^Wpatched, I began to work on a fun thing again : >>> detecting the blip's language using annotations in order to adjust the >>> default Bible version automatically. It's kind of easy, since while >>> you edit your blip, Wave places "lang" annotations with the value of >>> the detected language. Well, it turned out to work great with blips >>> that use only one language. But then I tried mixing languages inside a >>> blip, to see what would happen... and I lost my mind trying to >>> understand how ranges evolve when you use SetTextInRange. >>> >>> After fighting with it quite a bit, it seems to me that when you call >>> SetTextInRange, lang annotations' ranges are not modified, which makes >>> it quite hard to find the language applied to one of my tags once I >>> have replaced some other tags before. I came up with two options : >>> * try to calculate all the languages for my tags before replacing them >>> and use this list later on. This is nice and clean, except I might >>> have several tags that are identical but are in different language >>> paragraphs, which ruins this method. >>> * keep a counter (again) called blipDelta that I fill with the delta >>> generated by each replacement using SetTextInRange. Then I remove this >>> delta every time I need to get the language of a tag, thus referring >>> to the initial ranges of the blip, since they seem to not be modified >>> when using SetTextInRange. >>> >>> This second solution works... not always! and I really can't figure >>> out how the ranges I see in my logs relate to the ranges I see in the >>> debug editor in the sandbox. I ended up adding some ugly conditions to >>> make it work most of the time in these (far stretched, granted) >>> situations. >>> >>> Seehttp://www.youtube.com/watch?v=ZG9ZOSWjnMYfor an example of case >>> I fought with and fixed in an ugly way. >>> >>> Now if you're not afraid to scare yourself, my code is available >>> onhttp://bazaar.launchpad.net/~raphink/wavebiblebot/trunk/files. All of >>> the issues I listed here are found in biblebot.py. >>> >>> I'd be more than happy to have answers about these issues I've faced. >>> >>> Regards, >>> >>> Raphaël Pinson >> >> -- >> >> You received this message because you are subscribed to the Google Groups >> "Google Wave API" group. >> To post to this group, send email to [email protected]. >> To unsubscribe from this group, send email to >> [email protected]. >> For more options, visit this group at >> http://groups.google.com/group/google-wave-api?hl=. >> >> >> > -- You received this message because you are subscribed to the Google Groups "Google Wave API" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/google-wave-api?hl=.
