~bkidwell/zim/fix-html-backlinks

« back to all changes in this revision

Viewing changes to zim/gui/pageview.py

  • Committer: Jaap Karssenberg
  • Date: 2013-08-18 08:48:11 UTC
  • Revision ID: pardus@cpan.org-20130818084811-s0mj8p2uzhub4fb0
Detect unicode CamelCase words

Show diffs side-by-side

added added

removed removed

Lines of Context:
275
275
# These sets adjust to the current locale - so not same as "[a-z]" ..
276
276
# Must be kidding - no classes for this in the regex engine !?
277
277
_classes = {
278
 
        'upper': string.uppercase,
279
 
        'lower': string.lowercase,
280
278
        'letters': string.letters
281
279
}
282
 
camelcase_re = Re(r'[%(upper)s]+[%(lower)s]+[%(upper)s]+\w*$' % _classes)
283
280
twoletter_re = re.compile(r'[%(letters)s]{2}' % _classes)
284
281
del _classes
285
282
 
 
283
def camelcase(word):
 
284
        # To be CamelCase, a word needs to start uppercase, followed
 
285
        # by at least one lower case, followed by at least one uppercase.
 
286
        # As a result:
 
287
        # - CamelCase needs at least 3 characters
 
288
        # - first char needs to be upper case
 
289
        # - remainder of the text needs to be mixed case
 
290
        if len(word) < 3 \
 
291
        or not unicode.isalpha(word) \
 
292
        or unicode.islower(word[1:]) \
 
293
        or unicode.islower(word[0]) \
 
294
        or unicode.isupper(word[1:]):
 
295
                return False
 
296
 
 
297
        # Now do detailed check to exclude e.g. "AAbb"
 
298
        # Remainder needs to split in at least two mixed case parts
 
299
        i = 2
 
300
        while unicode.isupper(word[:i]):
 
301
                i += 1
 
302
 
 
303
        return not unicode.islower(word[i:])
 
304
 
286
305
 
287
306
def increase_list_bullet(bullet):
288
307
        '''Like L{increase_list_iter()}, but handles bullet string directly
3869
3888
                        apply_link(interwiki_re[0])
3870
3889
                elif self.preferences['autolink_files'] and file_re.match(word):
3871
3890
                        apply_link(file_re[0])
3872
 
                elif self.preferences['autolink_camelcase'] and camelcase_re.match(word):
3873
 
                        apply_link(camelcase_re[0])
 
3891
                elif self.preferences['autolink_camelcase'] and camelcase(word):
 
3892
                        apply_link(word)
3874
3893
                elif self.preferences['auto_reformat']:
3875
3894
                        handled = False
3876
3895
                        linestart = buffer.get_iter_at_line(end.get_line())