- Scintilla basics in WxRuby
- More Scintilla in WxRuby
- Autocomplete in WxRuby’s Scintilla
- AUI in WxRuby
- Project browser in WxRuby
- Styling in WxRuby’s Scintilla
- Custom folding in wxRuby’s Scintilla
- WxRuby Editor Source
- wxRuby Editor – Bug fixes and new features
- wxRuby Editor – More bug fixes and Scintilla text slinging
- A Note on Regular Expressions
- Automatic multiple line comments
- Managing escaping when indenting
- Scintilla event problem in new wxRuby – kinda solved
Another bug fix, phew, they do stack up when you really start using an application for real.
We’ve already managed double quotes when styling the code, this time we needed to handle them when indenting.
Up until now we’ve only checked one backslash, i.e. if a double quote has a backslash before it we disregard it, but what if that backslash has yet another backslash in front of it? Oops, didn’t think about that, or maybe I did but couldn’t be bothered at the time, well now I’ve found myself with “\\” strings and the indenting bugs out, so I suppose I can be bothered now.
def findParPos(sci, pos, direction, offset = 0) lvl = 1 dq = 0 inc = direction == "right" ? 1 : -1 while(lvl != 0 && pos != sci.get_text_length) case sci.get_char_at(pos) when 34 # " dq += 1 unless self.escaped?(sci, pos) # \ when 41 lvl -= inc if dq % 2 == 0 when 40 lvl += inc if dq % 2 == 0 end break if pos == 0 pos = eval("sci." + self.getPosFunc(direction) + " " + pos.to_s) end pos + offset end
So instead of simply checking for a single backslash we now use the method escaped? in lexer.rb:
def countSubsChrs(sci, start_chr, pos, dir) cur_chr = start_chr count = 0 while(pos > 0 || pos < sci.get_text_length) pos += dir break if cur_chr != (cur_chr = sci.get_char_at(pos)) count += 1 end return count end def escaped?(sci, pos, dir = -1) result = self.countSubsChrs(sci, 92, pos, dir) % 2 result == 0 ? false : true end
92 is the ascii number for the backslash, hopefully this should work since we check for 0 or an even amount of backslashes. If we have an odd amount this should mean that the double quote in question is not escaped. It seems to be working, hopefully I won’t have to revisit this again 🙂