tools/caseconversions.py

Wed, 25 May 2022 20:36:34 +0300

author
Teemu Piippo <teemu@hecknology.net>
date
Wed, 25 May 2022 20:36:34 +0300
changeset 199
6988973515d2
parent 41
0abada2a9802
permissions
-rw-r--r--

Fix pick() picking from weird places on the screen with high DPI scaling

glReadPixels reads data from the frame buffer, which contains data after
high DPI scaling, so any reads to that need to take this scaling into account

41
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
1 #!/usr/bin/env python
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
2 # coding: utf-8
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
3
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
4 '''
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
5 Provides facilities to converting identifier cases.
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
6 '''
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
7
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
8 #
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
9 # Copyright 2015 Teemu Piippo
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
10 # All rights reserved.
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
11 #
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
12 # Redistribution and use in source and binary forms, with or without
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
13 # modification, are permitted provided that the following conditions
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
14 # are met:
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
15 #
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
16 # 1. Redistributions of source code must retain the above copyright
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
17 # notice, this list of conditions and the following disclaimer.
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
18 # 2. Redistributions in binary form must reproduce the above copyright
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
19 # notice, this list of conditions and the following disclaimer in the
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
20 # documentation and/or other materials provided with the distribution.
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
21 # 3. Neither the name of the copyright holder nor the names of its
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
22 # contributors may be used to endorse or promote products derived from
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
23 # this software without specific prior written permission.
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
24 #
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
25 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
26 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
27 # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
28 # PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
29 # OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
30 # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
31 # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
32 # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
33 # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
34 # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
35 # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
36 #
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
37
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
38 import string
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
39 import re
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
40
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
41 def to_one_case (name, tolower):
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
42 '''
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
43 Convers name to either all uppercase or all lowercase (depending on the truth value of tolower), using underscores
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
44 as delimiters.
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
45 '''
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
46 result = ""
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
47 targetSet = (string.ascii_lowercase if tolower else string.ascii_uppercase) + string.digits
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
48 inverseSet = (string.ascii_uppercase if tolower else string.ascii_lowercase)
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
49 isUnderscorable = lambda ch: ch in string.ascii_uppercase \
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
50 or ch in string.whitespace or ch in string.punctuation
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
51 previousWasUnderscorable = isUnderscorable (name[0])
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
52
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
53 for ch in name:
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
54 if isUnderscorable (ch) and result != "" and not previousWasUnderscorable:
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
55 result += "_"
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
56
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
57 if ch in inverseSet:
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
58 result += (ch.lower() if tolower else ch.upper())
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
59 elif ch in targetSet:
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
60 result += ch
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
61 previousWasUnderscorable = isUnderscorable (ch)
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
62
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
63 return result
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
64
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
65 def to_camel_case (name, java = False):
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
66 '''
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
67 Converts name to camelcase. If java is False, the first letter will be lowercase, otherwise it will be uppercase.
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
68 '''
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
69 result = ""
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
70 wantUpperCase = False
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
71
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
72 # If it's all uppercase, make it all lowercase so that this algorithm can digest it
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
73 if name == name.upper():
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
74 name = name.lower()
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
75
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
76 for ch in name:
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
77 if ch == '_':
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
78 wantUpperCase = True
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
79 continue
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
80
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
81 if wantUpperCase:
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
82 if ch in string.ascii_lowercase:
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
83 ch = ch.upper()
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
84 wantUpperCase = False
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
85
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
86 result += ch
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
87
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
88 if java:
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
89 match = re.match (r'^([A-Z]+)([A-Z].+)$', result)
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
90 if match:
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
91 result = match.group (1).lower() + match.group (2)
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
92 else:
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
93 result = result[0].lower() + result[1:]
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
94 else:
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
95 result = result[0].upper() + result[1:]
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
96 return result
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
97
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
98 case_styles = {
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
99 'lower': lambda name: to_one_case (name, tolower=True),
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
100 'upper': lambda name: to_one_case (name, tolower=False),
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
101 'camel': lambda name: to_camel_case (name, java=False),
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
102 'java': lambda name: to_camel_case (name, java=True),
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
103 }
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
104
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
105 def convert_case (name, style):
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
106 '''
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
107 Converts name to the given style. Style may be one of:
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
108 - 'lower': 'foo_barBaz' -> 'foo_bar_baz'
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
109 - 'upper': 'foo_barBaz' -> 'FOO_BAR_BAZ'
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
110 - 'camel': 'foo_barBaz' -> 'FooBarBaz'
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
111 - 'java': 'foo_barBaz' -> 'fooBarBaz'
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
112 '''
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
113 try:
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
114 stylefunc = case_styles[style]
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
115 except KeyError:
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
116 validstyles = ', '.join (sorted (case_styles.keys()))
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
117 raise ValueError ('Unknown style "%s", should be one of: %s' % (style, validstyles))
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
118 else:
0abada2a9802 added automated configuration collection
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
119 return stylefunc (name)

mercurial