|
1 | 1 | namespace Pebbles { |
2 | 2 | public class EntryFormatter { |
| 3 | + // Modular replacement rules for scientific mode |
| 4 | + private const string replacement_rules_scientific = """ |
| 5 | + { |
| 6 | + "x": {"radial": "θ", "default": "x", "len_gain": 0}, |
| 7 | + "+": {"default": " + ", "len_gain": 2}, |
| 8 | + "−": {"default": " − ", "len_gain": 2}, |
| 9 | + "-": {"default": " − ", "len_gain": 2}, |
| 10 | + "÷": {"default": " ÷ ", "len_gain": 2}, |
| 11 | + "/": {"default": " ÷ ", "len_gain": 2}, |
| 12 | + "×": {"default": " × ", "len_gain": 2, "double": " ^ "}, |
| 13 | + "*": {"default": " × ", "len_gain": 2, "double": " ^ "}, |
| 14 | + "s": {"default": "sin ", "len_gain": 3}, |
| 15 | + "S": {"default": "isin ", "len_gain": 4}, |
| 16 | + "h": {"default": "sinh ", "len_gain": 4}, |
| 17 | + "H": {"default": "isinh ", "len_gain": 5}, |
| 18 | + "c": {"default": "cos ", "len_gain": 3}, |
| 19 | + "C": {"default": "icos ", "len_gain": 4}, |
| 20 | + "o": {"default": "cosh ", "len_gain": 4}, |
| 21 | + "O": {"default": "icosh ", "len_gain": 5}, |
| 22 | + "t": {"default": "tan ", "len_gain": 3}, |
| 23 | + "T": {"default": "itan ", "len_gain": 4}, |
| 24 | + "a": {"default": "tanh ", "len_gain": 4}, |
| 25 | + "A": {"default": "itanh ", "len_gain": 5}, |
| 26 | + "q": {"default": " ^ ", "len_gain": 2}, |
| 27 | + "Q": {"default": "√", "len_gain": 0}, |
| 28 | + "z": {"default": "10 ^ ", "len_gain": 5}, |
| 29 | + "Z": {"default": "e ^ ", "len_gain": 3}, |
| 30 | + "F": {"default": "!", "len_gain": 0}, |
| 31 | + "f": {"default": "!", "len_gain": 0}, |
| 32 | + "m": {"default": " mod ", "len_gain": 4}, |
| 33 | + "M": {"default": " log ", "len_gain": 4}, |
| 34 | + "l": {"default": "10 log ", "len_gain": 5}, |
| 35 | + "L": {"default": "ln ", "len_gain": 5}, |
| 36 | + "p": {"default": "P", "len_gain": 0}, |
| 37 | + "P": {"default": "C", "len_gain": 0} |
| 38 | + } |
| 39 | + """; |
3 | 40 | public unowned Gtk.Entry main_entry; |
4 | 41 | public bool polar_mode; |
5 | 42 | private bool auto_entry; |
@@ -128,107 +165,33 @@ namespace Pebbles { |
128 | 165 | out int len_gain |
129 | 166 | ) { |
130 | 167 | double_replaced = false; |
131 | | - switch (current_symbol) { |
132 | | - case "x": |
133 | | - len_gain = 0; |
134 | | - if (radial_mode) { |
135 | | - return "θ"; |
136 | | - } else { |
137 | | - return "x"; |
138 | | - } |
139 | | - case "+": |
140 | | - len_gain = 2; |
141 | | - return " + "; |
142 | | - case "−": |
143 | | - case "-": |
144 | | - len_gain = 2; |
145 | | - return " − "; |
146 | | - case "÷": |
147 | | - case "/": |
148 | | - len_gain = 2; |
149 | | - return " ÷ "; |
150 | | - case "×": |
151 | | - case "*": |
152 | | - len_gain = 2; |
153 | | - if (previous_symbol == "×") { |
154 | | - double_replaced = true; |
155 | | - return " ^ "; |
156 | | - } |
157 | | - |
158 | | - return " × "; |
159 | | - case "s": |
160 | | - len_gain = 3; |
161 | | - return "sin "; |
162 | | - case "S": |
163 | | - len_gain = 4; |
164 | | - return "isin "; |
165 | | - case "h": |
166 | | - len_gain = 4; |
167 | | - return "sinh "; |
168 | | - case "H": |
169 | | - len_gain = 5; |
170 | | - return "isinh "; |
171 | | - case "c": |
172 | | - len_gain = 3; |
173 | | - return "cos "; |
174 | | - case "C": |
175 | | - len_gain = 4; |
176 | | - return "icos "; |
177 | | - case "o": |
178 | | - len_gain = 4; |
179 | | - return "cosh "; |
180 | | - case "O": |
181 | | - len_gain = 5; |
182 | | - return "icosh "; |
183 | | - case "t": |
184 | | - len_gain = 3; |
185 | | - return "tan "; |
186 | | - case "T": |
187 | | - len_gain = 4; |
188 | | - return "itan "; |
189 | | - case "a": |
190 | | - len_gain = 4; |
191 | | - return "tanh "; |
192 | | - case "A": |
193 | | - len_gain = 5; |
194 | | - return "itanh "; |
195 | | - case "q": |
196 | | - len_gain = 2; |
197 | | - return " ^ "; |
198 | | - case "Q": |
199 | | - len_gain = 0; |
200 | | - return "√"; |
201 | | - case "z": |
202 | | - len_gain = 5; |
203 | | - return "10 ^ "; |
204 | | - case "Z": |
205 | | - len_gain = 3; |
206 | | - return "e ^ "; |
207 | | - case "F": |
208 | | - case "f": |
209 | | - len_gain = 0; |
210 | | - return "!"; |
211 | | - case "m": |
212 | | - len_gain = 4; |
213 | | - return " mod "; |
214 | | - case "M": |
215 | | - len_gain = 4; |
216 | | - return " log "; |
217 | | - case "l": |
218 | | - len_gain = 5; |
219 | | - return "10 log "; |
220 | | - case "L": |
221 | | - len_gain = 5; |
222 | | - return "ln "; |
223 | | - case "p": |
224 | | - len_gain = 0; |
225 | | - return "P"; |
226 | | - case "P": |
227 | | - len_gain = 0; |
228 | | - return "C"; |
229 | | - default: |
| 168 | + var rules = new Json.Parser(); |
| 169 | + try { |
| 170 | + rules.load_from_data(replacement_rules_scientific.strip(), -1); |
| 171 | + var obj = rules.get_root().get_object(); |
| 172 | + if (!obj.has_member(current_symbol)) { |
230 | 173 | len_gain = 0; |
231 | 174 | return current_symbol; |
| 175 | + } |
| 176 | + var rule = obj.get_object_member(current_symbol); |
| 177 | + // Generic double replacement: if the rule has a "double" key and the previous symbol matches the current one |
| 178 | + var to_be_replaced_with = rule.get_string_member("default"); |
| 179 | + |
| 180 | + if (rule.has_member("double") && previous_symbol.strip () == to_be_replaced_with.strip ()) { |
| 181 | + len_gain = (int) rule.get_int_member("len_gain"); |
| 182 | + double_replaced = true; |
| 183 | + return rule.get_string_member("double"); |
| 184 | + } |
| 185 | + // Handle radial mode for x |
| 186 | + if (current_symbol == "x" && radial_mode && rule.has_member("radial")) { |
| 187 | + len_gain = (int) rule.get_int_member("len_gain"); |
| 188 | + return rule.get_string_member("radial"); |
| 189 | + } |
| 190 | + len_gain = (int) rule.get_int_member("len_gain"); |
| 191 | + return to_be_replaced_with; |
| 192 | + } catch (Error e) { |
| 193 | + len_gain = 0; |
| 194 | + return current_symbol; |
232 | 195 | } |
233 | 196 | } |
234 | 197 | } |
|
0 commit comments