├── .gitignore ├── LICENSE.md ├── README.md ├── Special-Characters-by-Typefacts.alfredworkflow ├── build-workflow.py └── src ├── characters.json ├── empty.png ├── icon.png └── info.plist /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | This workflow – excluding the Typefacts name, logo and branding – is licensed under the MIT License. 2 | 3 | 4 | ## MIT License 5 | 6 | Copyright (c) 2018 Typefacts.com 7 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 8 | 9 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 10 | 11 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Typefacts Special Characters Workflow for Alfred 3 2 | 3 | Many special characters needed for good typography are hard to find, some are not even available on the keyboard at all. 4 | This workflow gives you access to these characters and pastes them right into your current application. 5 | 6 | [Special Characters — An Alfred App Workflow on www.typefacts.com](http://typefacts.com/news/special-characters-an-alfred-app-workflow) 7 | 8 | ## Compiling 9 | ```bash 10 | py build-workflow.py -f -o . src/ 11 | ``` 12 | You may need to install the Python dependencies via `pip`. 13 | 14 | --- 15 | 16 | ### This workflow was built by: 17 | Norman Posselt ([@normanposselt](https://twitter.com/normanposselt)) 18 | Frank Rausch ([@frankrausch](https://twitter.com/frankrausch)) 19 | -------------------------------------------------------------------------------- /Special-Characters-by-Typefacts.alfredworkflow: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typefacts/alfred-special-characters/ecce308b4c811d48af97c2ed82025a1f81ac30e9/Special-Characters-by-Typefacts.alfredworkflow -------------------------------------------------------------------------------- /build-workflow.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | # encoding: utf-8 3 | # 4 | # Copyright (c) 2013 deanishe@deanishe.net. 5 | # 6 | # MIT Licence. See http://opensource.org/licenses/MIT 7 | # 8 | # Created on 2013-11-01 9 | # 10 | 11 | """workflow-build [options] 12 | 13 | Build Alfred Workflows. 14 | 15 | Compile contents of to a ZIP file (with extension 16 | `.alfredworkflow`). 17 | 18 | The name of the output file is generated from the workflow name, 19 | which is extracted from the workflow's `info.plist`. If a `version` 20 | file is contained within the workflow directory, it's contents 21 | will be appended to the compiled workflow's filename. 22 | 23 | Usage: 24 | workflow-build [-v|-q|-d] [-f] [-o ] ... 25 | workflow-build (-h|--version) 26 | 27 | Options: 28 | -o, --output= directory to save workflow(s) to 29 | default is current working directory 30 | -f, --force overwrite existing files 31 | -h, --help show this message and exit 32 | -V, --version show version number and exit 33 | -q, --quiet only show errors and above 34 | -v, --verbose show info messages and above 35 | -d, --debug show debug messages 36 | 37 | """ 38 | 39 | from __future__ import print_function 40 | 41 | from contextlib import contextmanager 42 | import logging 43 | import os 44 | import plistlib 45 | import re 46 | import shutil 47 | import string 48 | from subprocess import check_call, CalledProcessError 49 | import sys 50 | from tempfile import mkdtemp 51 | from unicodedata import normalize 52 | 53 | from docopt import docopt 54 | 55 | __version__ = "0.6" 56 | __author__ = "Dean Jackson " 57 | 58 | DEFAULT_LOG_LEVEL = logging.WARNING 59 | 60 | # Characters permitted in workflow filenames 61 | OK_CHARS = set(string.ascii_letters + string.digits + '-.') 62 | 63 | EXCLUDE_PATTERNS = [ 64 | '.*', 65 | '*.pyc', 66 | '*.log', 67 | '*.acorn', 68 | '*.swp', 69 | '*.bak', 70 | '*.sublime-project', 71 | '*.sublime-workflow', 72 | '*.git', 73 | '*.dist-info', 74 | '*.egg-info', 75 | '__pycache__', 76 | ] 77 | 78 | log = logging.getLogger('[%(levelname)s] %(message)s') 79 | logging.basicConfig(format='', level=logging.DEBUG) 80 | 81 | 82 | @contextmanager 83 | def chdir(dirpath): 84 | """Context-manager to change working directory.""" 85 | startdir = os.path.abspath(os.curdir) 86 | os.chdir(dirpath) 87 | log.debug('cwd=%s', dirpath) 88 | 89 | yield 90 | 91 | os.chdir(startdir) 92 | log.debug('cwd=%s', startdir) 93 | 94 | 95 | @contextmanager 96 | def tempdir(): 97 | """Context-manager to create and cd to a temporary directory.""" 98 | startdir = os.path.abspath(os.curdir) 99 | dirpath = mkdtemp() 100 | try: 101 | yield dirpath 102 | finally: 103 | shutil.rmtree(dirpath) 104 | 105 | 106 | def safename(name): 107 | """Make name filesystem and web-safe.""" 108 | 109 | # remove non-ASCII 110 | s = normalize('NFKD', name) 111 | b = s.encode('us-ascii', 'ignore') 112 | 113 | clean = [] 114 | for c in b: 115 | char = chr(c) 116 | if char in OK_CHARS: 117 | clean.append(char) 118 | else: 119 | clean.append('-') 120 | 121 | return re.sub(r'-+', '-', ''.join(clean)).strip('-') 122 | 123 | 124 | def build_workflow(workflow_dir, outputdir, overwrite=False, verbose=False): 125 | """Create an .alfredworkflow file from the contents of `workflow_dir`.""" 126 | with tempdir() as dirpath: 127 | tmpdir = os.path.join(dirpath, 'workflow') 128 | shutil.copytree(workflow_dir, tmpdir, 129 | ignore=shutil.ignore_patterns(*EXCLUDE_PATTERNS)) 130 | 131 | with chdir(tmpdir): 132 | # ------------------------------------------------------------ 133 | # Read workflow metadata from info.plist 134 | with open("info.plist", "rb") as fp: 135 | info = plistlib.load(fp) 136 | version = info.get('version') 137 | name = safename(info['name']) 138 | zippath = os.path.join(outputdir, name) 139 | # if version: 140 | # zippath = '{}-{}'.format(zippath, version) 141 | 142 | zippath += '.alfredworkflow' 143 | 144 | # ------------------------------------------------------------ 145 | # Remove unexported vars from info.plist 146 | 147 | for k in info.get('variablesdontexport', {}): 148 | info['variables'][k] = '' 149 | 150 | with open("info.plist", "wb") as fp: 151 | plistlib.dump(info, fp) 152 | 153 | # ------------------------------------------------------------ 154 | # Build workflow 155 | if os.path.exists(zippath): 156 | if overwrite: 157 | log.info('overwriting existing workflow') 158 | os.unlink(zippath) 159 | else: 160 | log.error('File "%s" exists. Use -f to overwrite', zippath) 161 | return False 162 | 163 | # build workflow 164 | command = ['zip', '-r'] 165 | if not verbose: 166 | command.append(u'-q') 167 | 168 | command.extend([zippath, '.']) 169 | 170 | log.debug('command=%r', command) 171 | 172 | try: 173 | check_call(command) 174 | except CalledProcessError as err: 175 | log.error('zip exited with %d', err.returncode) 176 | return False 177 | 178 | log.info('wrote %s', zippath) 179 | 180 | return True 181 | 182 | 183 | def main(args=None): 184 | """Run CLI.""" 185 | # ------------------------------------------------------------ 186 | # CLI flags 187 | args = docopt(__doc__, version=__version__) 188 | if args.get('--verbose'): 189 | log.setLevel(logging.INFO) 190 | elif args.get('--quiet'): 191 | log.setLevel(logging.ERROR) 192 | elif args.get('--debug'): 193 | log.setLevel(logging.DEBUG) 194 | else: 195 | log.setLevel(DEFAULT_LOG_LEVEL) 196 | 197 | log.debug('log level=%s', logging.getLevelName(log.level)) 198 | log.debug('args=%r', args) 199 | 200 | # Build options 201 | force = args['--force'] 202 | outputdir = os.path.abspath(args['--output'] or os.curdir) 203 | workflow_dirs = [os.path.abspath(p) for p in args['']] 204 | verbose = log.level == logging.DEBUG 205 | 206 | log.debug(u'outputdir=%r, workflow_dirs=%r', outputdir, workflow_dirs) 207 | 208 | # ------------------------------------------------------------ 209 | # Build workflow(s) 210 | errors = False 211 | for path in workflow_dirs: 212 | ok = build_workflow(path, outputdir, force, verbose) 213 | if not ok: 214 | errors = True 215 | 216 | if errors: 217 | return 1 218 | 219 | return 0 220 | 221 | 222 | if __name__ == '__main__': 223 | sys.exit(main(sys.argv[1:])) -------------------------------------------------------------------------------- /src/characters.json: -------------------------------------------------------------------------------- 1 | {"items": [ 2 | { 3 | "title": "≈\t almost equal to sign\n math almost equal", 4 | "subtitle": "U+2248", 5 | "icon": { 6 | "path": "empty.png" 7 | }, 8 | "arg": "≈", 9 | "text": { 10 | "copy": "≈" 11 | }, 12 | "mods": { 13 | "alt": { 14 | "valid": true, 15 | "arg": "\\u2248", 16 | "subtitle": "\\u2248 → Copy Hex Unicode" 17 | }, 18 | "cmd": { 19 | "valid": true, 20 | "arg": "≈", 21 | "subtitle": "≈ → Copy HTML Entity" 22 | } 23 | } 24 | }, 25 | { 26 | "title": "’\t apostrophe (the only correct one)\n ", 27 | "subtitle": "U+2019", 28 | "icon": { 29 | "path": "empty.png" 30 | }, 31 | "arg": "’", 32 | "text": { 33 | "copy": "’" 34 | }, 35 | "mods": { 36 | "alt": { 37 | "valid": true, 38 | "arg": "\\u2019", 39 | "subtitle": "\\u2019 → Copy Hex Unicode" 40 | }, 41 | "cmd": { 42 | "valid": true, 43 | "arg": "’", 44 | "subtitle": "’ → Copy HTML Entity" 45 | } 46 | } 47 | }, 48 | { 49 | "title": "⌘\t Apple Command Key\n apple command key", 50 | "subtitle": "U+2318", 51 | "icon": { 52 | "path": "empty.png" 53 | }, 54 | "arg": "⌘", 55 | "text": { 56 | "copy": "⌘" 57 | }, 58 | "mods": { 59 | "alt": { 60 | "valid": true, 61 | "arg": "\\u2318", 62 | "subtitle": "\\u2318 → Copy Hex Unicode" 63 | }, 64 | "cmd": { 65 | "valid": true, 66 | "arg": "⌘", 67 | "subtitle": "⌘ → Copy HTML Numeric Character Reference (Hex)" 68 | } 69 | } 70 | }, 71 | { 72 | "title": "⎋\t Apple Escape Key\n apple escape key", 73 | "subtitle": "U+238B", 74 | "icon": { 75 | "path": "empty.png" 76 | }, 77 | "arg": "⎋", 78 | "text": { 79 | "copy": "⎋" 80 | }, 81 | "mods": { 82 | "alt": { 83 | "valid": true, 84 | "arg": "\\u238b", 85 | "subtitle": "\\u238b → Copy Hex Unicode" 86 | }, 87 | "cmd": { 88 | "valid": true, 89 | "arg": "⎋", 90 | "subtitle": "⎋ → Copy HTML Numeric Character Reference (Hex)" 91 | } 92 | } 93 | }, 94 | { 95 | "title": "⌥\t Apple Option (Alt) Key\n apple option key", 96 | "subtitle": "U+2325", 97 | "icon": { 98 | "path": "empty.png" 99 | }, 100 | "arg": "⌥", 101 | "text": { 102 | "copy": "⌥" 103 | }, 104 | "mods": { 105 | "alt": { 106 | "valid": true, 107 | "arg": "\\u2325", 108 | "subtitle": "\\u2325 → Copy Hex Unicode" 109 | }, 110 | "cmd": { 111 | "valid": true, 112 | "arg": "⌥", 113 | "subtitle": "⌥ → Copy HTML Numeric Character Reference (Hex)" 114 | } 115 | } 116 | }, 117 | { 118 | "title": "⇧\t Apple Shift Key\n apple shift key", 119 | "subtitle": "U+21E7", 120 | "icon": { 121 | "path": "empty.png" 122 | }, 123 | "arg": "⇧", 124 | "text": { 125 | "copy": "⇧" 126 | }, 127 | "mods": { 128 | "alt": { 129 | "valid": true, 130 | "arg": "\\u21e7", 131 | "subtitle": "\\u21e7 → Copy Hex Unicode" 132 | }, 133 | "cmd": { 134 | "valid": true, 135 | "arg": "⇧", 136 | "subtitle": "⇧ → Copy HTML Numeric Character Reference (Hex)" 137 | } 138 | } 139 | }, 140 | { 141 | "title": "•\t bullet\n bold interpunct bullet point", 142 | "subtitle": "U+2022", 143 | "icon": { 144 | "path": "empty.png" 145 | }, 146 | "arg": "•", 147 | "text": { 148 | "copy": "•" 149 | }, 150 | "mods": { 151 | "alt": { 152 | "valid": true, 153 | "arg": "\\u2022", 154 | "subtitle": "\\u2022 → Copy Hex Unicode" 155 | }, 156 | "cmd": { 157 | "valid": true, 158 | "arg": "•", 159 | "subtitle": "• → Copy HTML Entity" 160 | } 161 | } 162 | }, 163 | { 164 | "title": "℅\t c/o\n care of c o correspondence", 165 | "subtitle": "U+2105", 166 | "icon": { 167 | "path": "empty.png" 168 | }, 169 | "arg": "℅", 170 | "text": { 171 | "copy": "℅" 172 | }, 173 | "mods": { 174 | "alt": { 175 | "valid": true, 176 | "arg": "\\u2105", 177 | "subtitle": "\\u2105 → Copy Hex Unicode" 178 | }, 179 | "cmd": { 180 | "valid": true, 181 | "arg": "℅", 182 | "subtitle": "℅ → Copy HTML Numeric Character Reference (Hex)" 183 | } 184 | } 185 | }, 186 | { 187 | "title": "÷\t division sign\n math division", 188 | "subtitle": "U+00F7", 189 | "icon": { 190 | "path": "empty.png" 191 | }, 192 | "arg": "÷", 193 | "text": { 194 | "copy": "÷" 195 | }, 196 | "mods": { 197 | "alt": { 198 | "valid": true, 199 | "arg": "\\u00f7", 200 | "subtitle": "\\u00f7 → Copy Hex Unicode" 201 | }, 202 | "cmd": { 203 | "valid": true, 204 | "arg": "÷", 205 | "subtitle": "÷ → Copy HTML Entity" 206 | } 207 | } 208 | }, 209 | { 210 | "title": "″\t double prime\n inch arcsecond second", 211 | "subtitle": "U+2033", 212 | "icon": { 213 | "path": "empty.png" 214 | }, 215 | "arg": "″", 216 | "text": { 217 | "copy": "″" 218 | }, 219 | "mods": { 220 | "alt": { 221 | "valid": true, 222 | "arg": "\\u2033", 223 | "subtitle": "\\u2033 → Copy Hex Unicode" 224 | }, 225 | "cmd": { 226 | "valid": true, 227 | "arg": "″", 228 | "subtitle": "″ → Copy HTML Entity" 229 | } 230 | } 231 | }, 232 | { 233 | "title": "→\t right arrow\n ", 234 | "subtitle": "U+2192", 235 | "icon": { 236 | "path": "empty.png" 237 | }, 238 | "arg": "→", 239 | "text": { 240 | "copy": "→" 241 | }, 242 | "mods": { 243 | "alt": { 244 | "valid": true, 245 | "arg": "\\u2192", 246 | "subtitle": "\\u2192 → Copy Hex Unicode" 247 | }, 248 | "cmd": { 249 | "valid": true, 250 | "arg": "→", 251 | "subtitle": "→ → Copy HTML Entity" 252 | } 253 | } 254 | }, 255 | { 256 | "title": "←\t left arrow\n ", 257 | "subtitle": "U+2190", 258 | "icon": { 259 | "path": "empty.png" 260 | }, 261 | "arg": "←", 262 | "text": { 263 | "copy": "←" 264 | }, 265 | "mods": { 266 | "alt": { 267 | "valid": true, 268 | "arg": "\\u2190", 269 | "subtitle": "\\u2190 → Copy Hex Unicode" 270 | }, 271 | "cmd": { 272 | "valid": true, 273 | "arg": "←", 274 | "subtitle": "← → Copy HTML Entity" 275 | } 276 | } 277 | }, 278 | { 279 | "title": "↑\t up arrow\n ", 280 | "subtitle": "U+2191", 281 | "icon": { 282 | "path": "empty.png" 283 | }, 284 | "arg": "↑", 285 | "text": { 286 | "copy": "↑" 287 | }, 288 | "mods": { 289 | "alt": { 290 | "valid": true, 291 | "arg": "\\u2191", 292 | "subtitle": "\\u2191 → Copy Hex Unicode" 293 | }, 294 | "cmd": { 295 | "valid": true, 296 | "arg": "↑", 297 | "subtitle": "↑ → Copy HTML Entity" 298 | } 299 | } 300 | }, 301 | { 302 | "title": "↓\t down arrow\n ", 303 | "subtitle": "U+2193", 304 | "icon": { 305 | "path": "empty.png" 306 | }, 307 | "arg": "↓", 308 | "text": { 309 | "copy": "↓" 310 | }, 311 | "mods": { 312 | "alt": { 313 | "valid": true, 314 | "arg": "\\u2193", 315 | "subtitle": "\\u2193 → Copy Hex Unicode" 316 | }, 317 | "cmd": { 318 | "valid": true, 319 | "arg": "↓", 320 | "subtitle": "↓ → Copy HTML Entity" 321 | } 322 | } 323 | }, 324 | { 325 | "title": "—\t em dash\n em dash", 326 | "subtitle": "U+2014", 327 | "icon": { 328 | "path": "empty.png" 329 | }, 330 | "arg": "—", 331 | "text": { 332 | "copy": "—" 333 | }, 334 | "mods": { 335 | "alt": { 336 | "valid": true, 337 | "arg": "\\u2014", 338 | "subtitle": "\\u2014 → Copy Hex Unicode" 339 | }, 340 | "cmd": { 341 | "valid": true, 342 | "arg": "—", 343 | "subtitle": "— → Copy HTML Entity" 344 | } 345 | } 346 | }, 347 | { 348 | "title": " \t em space\n ", 349 | "subtitle": "U+2003", 350 | "icon": { 351 | "path": "empty.png" 352 | }, 353 | "arg": " ", 354 | "text": { 355 | "copy": " " 356 | }, 357 | "mods": { 358 | "alt": { 359 | "valid": true, 360 | "arg": "\\u2003", 361 | "subtitle": "\\u2003 → Copy Hex Unicode" 362 | }, 363 | "cmd": { 364 | "valid": true, 365 | "arg": " ", 366 | "subtitle": "  → Copy HTML Entity" 367 | } 368 | } 369 | }, 370 | { 371 | "title": "–\t en dash\n en dash", 372 | "subtitle": "U+2013", 373 | "icon": { 374 | "path": "empty.png" 375 | }, 376 | "arg": "–", 377 | "text": { 378 | "copy": "–" 379 | }, 380 | "mods": { 381 | "alt": { 382 | "valid": true, 383 | "arg": "\\u2013", 384 | "subtitle": "\\u2013 → Copy Hex Unicode" 385 | }, 386 | "cmd": { 387 | "valid": true, 388 | "arg": "–", 389 | "subtitle": "– → Copy HTML Entity" 390 | } 391 | } 392 | }, 393 | { 394 | "title": " \t en space\n ", 395 | "subtitle": "U+2002", 396 | "icon": { 397 | "path": "empty.png" 398 | }, 399 | "arg": " ", 400 | "text": { 401 | "copy": " " 402 | }, 403 | "mods": { 404 | "alt": { 405 | "valid": true, 406 | "arg": "\\u2002", 407 | "subtitle": "\\u2002 → Copy Hex Unicode" 408 | }, 409 | "cmd": { 410 | "valid": true, 411 | "arg": " ", 412 | "subtitle": "  → Copy HTML Entity" 413 | } 414 | } 415 | }, 416 | { 417 | "title": "“\t English double quote left\n English double quote left", 418 | "subtitle": "U+201C", 419 | "icon": { 420 | "path": "empty.png" 421 | }, 422 | "arg": "“", 423 | "text": { 424 | "copy": "“" 425 | }, 426 | "mods": { 427 | "alt": { 428 | "valid": true, 429 | "arg": "\\u201c", 430 | "subtitle": "\\u201c → Copy Hex Unicode" 431 | }, 432 | "cmd": { 433 | "valid": true, 434 | "arg": "“", 435 | "subtitle": "“ → Copy HTML Entity" 436 | } 437 | } 438 | }, 439 | { 440 | "title": "”\t English double quote right\n English double quote right", 441 | "subtitle": "U+201D", 442 | "icon": { 443 | "path": "empty.png" 444 | }, 445 | "arg": "”", 446 | "text": { 447 | "copy": "”" 448 | }, 449 | "mods": { 450 | "alt": { 451 | "valid": true, 452 | "arg": "\\u201d", 453 | "subtitle": "\\u201d → Copy Hex Unicode" 454 | }, 455 | "cmd": { 456 | "valid": true, 457 | "arg": "”", 458 | "subtitle": "” → Copy HTML Entity" 459 | } 460 | } 461 | }, 462 | { 463 | "title": "‘\t English single quote left\n English single quote left", 464 | "subtitle": "U+2018", 465 | "icon": { 466 | "path": "empty.png" 467 | }, 468 | "arg": "‘", 469 | "text": { 470 | "copy": "‘" 471 | }, 472 | "mods": { 473 | "alt": { 474 | "valid": true, 475 | "arg": "\\u2018", 476 | "subtitle": "\\u2018 → Copy Hex Unicode" 477 | }, 478 | "cmd": { 479 | "valid": true, 480 | "arg": "‘", 481 | "subtitle": "‘ → Copy HTML Entity" 482 | } 483 | } 484 | }, 485 | { 486 | "title": "’\t English single quote right\n English single quote right", 487 | "subtitle": "U+2019", 488 | "icon": { 489 | "path": "empty.png" 490 | }, 491 | "arg": "’", 492 | "text": { 493 | "copy": "’" 494 | }, 495 | "mods": { 496 | "alt": { 497 | "valid": true, 498 | "arg": "\\u2019", 499 | "subtitle": "\\u2019 → Copy Hex Unicode" 500 | }, 501 | "cmd": { 502 | "valid": true, 503 | "arg": "’", 504 | "subtitle": "’ → Copy HTML Entity" 505 | } 506 | } 507 | }, 508 | { 509 | "title": "=\t equal sign\n math equal", 510 | "subtitle": "U+003D", 511 | "icon": { 512 | "path": "empty.png" 513 | }, 514 | "arg": "=", 515 | "text": { 516 | "copy": "=" 517 | }, 518 | "mods": { 519 | "alt": { 520 | "valid": true, 521 | "arg": "\\u003d", 522 | "subtitle": "\\u003d → Copy Hex Unicode" 523 | }, 524 | "cmd": { 525 | "valid": true, 526 | "arg": "=", 527 | "subtitle": "= → Copy HTML Numeric Character Reference (Hex)" 528 | } 529 | } 530 | }, 531 | { 532 | "title": " \t figure space\n number space", 533 | "subtitle": "U+2007", 534 | "icon": { 535 | "path": "empty.png" 536 | }, 537 | "arg": " ", 538 | "text": { 539 | "copy": " " 540 | }, 541 | "mods": { 542 | "alt": { 543 | "valid": true, 544 | "arg": "\\u2007", 545 | "subtitle": "\\u2007 → Copy Hex Unicode" 546 | }, 547 | "cmd": { 548 | "valid": true, 549 | "arg": " ", 550 | "subtitle": "  → Copy HTML Entity" 551 | } 552 | } 553 | }, 554 | { 555 | "title": "„\t German double quote left\n German double quote left", 556 | "subtitle": "U+201E", 557 | "icon": { 558 | "path": "empty.png" 559 | }, 560 | "arg": "„", 561 | "text": { 562 | "copy": "„" 563 | }, 564 | "mods": { 565 | "alt": { 566 | "valid": true, 567 | "arg": "\\u201e", 568 | "subtitle": "\\u201e → Copy Hex Unicode" 569 | }, 570 | "cmd": { 571 | "valid": true, 572 | "arg": "„", 573 | "subtitle": "„ → Copy HTML Entity" 574 | } 575 | } 576 | }, 577 | { 578 | "title": "“\t German double quote right\n German double quote right", 579 | "subtitle": "U+201C", 580 | "icon": { 581 | "path": "empty.png" 582 | }, 583 | "arg": "“", 584 | "text": { 585 | "copy": "“" 586 | }, 587 | "mods": { 588 | "alt": { 589 | "valid": true, 590 | "arg": "\\u201c", 591 | "subtitle": "\\u201c → Copy Hex Unicode" 592 | }, 593 | "cmd": { 594 | "valid": true, 595 | "arg": "“", 596 | "subtitle": "“ → Copy HTML Entity" 597 | } 598 | } 599 | }, 600 | { 601 | "title": "‚\t German single quote left\n German single quote left", 602 | "subtitle": "U+201A", 603 | "icon": { 604 | "path": "empty.png" 605 | }, 606 | "arg": "‚", 607 | "text": { 608 | "copy": "‚" 609 | }, 610 | "mods": { 611 | "alt": { 612 | "valid": true, 613 | "arg": "\\u201a", 614 | "subtitle": "\\u201a → Copy Hex Unicode" 615 | }, 616 | "cmd": { 617 | "valid": true, 618 | "arg": "‚", 619 | "subtitle": "‚ → Copy HTML Entity" 620 | } 621 | } 622 | }, 623 | { 624 | "title": "‘\t German single quote right\n German single quote right", 625 | "subtitle": "U+2018", 626 | "icon": { 627 | "path": "empty.png" 628 | }, 629 | "arg": "‘", 630 | "text": { 631 | "copy": "‘" 632 | }, 633 | "mods": { 634 | "alt": { 635 | "valid": true, 636 | "arg": "\\u2018", 637 | "subtitle": "\\u2018 → Copy Hex Unicode" 638 | }, 639 | "cmd": { 640 | "valid": true, 641 | "arg": "‘", 642 | "subtitle": "‘ → Copy HTML Entity" 643 | } 644 | } 645 | }, 646 | { 647 | "title": " \t hair space\n ", 648 | "subtitle": "U+200A", 649 | "icon": { 650 | "path": "empty.png" 651 | }, 652 | "arg": " ", 653 | "text": { 654 | "copy": " " 655 | }, 656 | "mods": { 657 | "alt": { 658 | "valid": true, 659 | "arg": "\\u200A", 660 | "subtitle": "\\u200A → Copy Hex Unicode" 661 | }, 662 | "cmd": { 663 | "valid": true, 664 | "arg": " ", 665 | "subtitle": "  → Copy HTML Entity" 666 | } 667 | } 668 | }, 669 | { 670 | "title": "…\t horizontal ellipsis\n three dots leader", 671 | "subtitle": "U+2026", 672 | "icon": { 673 | "path": "empty.png" 674 | }, 675 | "arg": "…", 676 | "text": { 677 | "copy": "…" 678 | }, 679 | "mods": { 680 | "alt": { 681 | "valid": true, 682 | "arg": "\\u2026", 683 | "subtitle": "\\u2026 → Copy Hex Unicode" 684 | }, 685 | "cmd": { 686 | "valid": true, 687 | "arg": "…", 688 | "subtitle": "… → Copy HTML Entity" 689 | } 690 | } 691 | }, 692 | { 693 | "title": "·\t middle dot\n interpunct middot centered dot middle dot", 694 | "subtitle": "U+2219", 695 | "icon": { 696 | "path": "empty.png" 697 | }, 698 | "arg": "·", 699 | "text": { 700 | "copy": "·" 701 | }, 702 | "mods": { 703 | "alt": { 704 | "valid": true, 705 | "arg": "\\u00b7", 706 | "subtitle": "\\u00b7 → Copy Hex Unicode" 707 | }, 708 | "cmd": { 709 | "valid": true, 710 | "arg": "·", 711 | "subtitle": "· → Copy HTML Entity" 712 | } 713 | } 714 | }, 715 | { 716 | "title": "‽\t interrobang\n question exclamation ? !", 717 | "subtitle": "U+203D", 718 | "icon": { 719 | "path": "empty.png" 720 | }, 721 | "arg": "‽", 722 | "text": { 723 | "copy": "‽" 724 | }, 725 | "mods": { 726 | "alt": { 727 | "valid": true, 728 | "arg": "\\u203d", 729 | "subtitle": "\\u203d → Copy Hex Unicode" 730 | }, 731 | "cmd": { 732 | "valid": true, 733 | "arg": "‽", 734 | "subtitle": "‽ → Copy HTML Numeric Character Reference (Hex)" 735 | } 736 | } 737 | }, 738 | { 739 | "title": "¡\t inverted exclamation mark\n inverted exclamation", 740 | "subtitle": "U+00A1", 741 | "icon": { 742 | "path": "empty.png" 743 | }, 744 | "arg": "¡", 745 | "text": { 746 | "copy": "¡" 747 | }, 748 | "mods": { 749 | "alt": { 750 | "valid": true, 751 | "arg": "\\u00a1", 752 | "subtitle": "\\u00a1 → Copy Hex Unicode" 753 | }, 754 | "cmd": { 755 | "valid": true, 756 | "arg": "¡", 757 | "subtitle": "¡ → Copy HTML Entity" 758 | } 759 | } 760 | }, 761 | { 762 | "title": "⸘\t gnaborretni\n interrobang inverted question exclamation ¿ ¡", 763 | "subtitle": "U+2E18", 764 | "icon": { 765 | "path": "empty.png" 766 | }, 767 | "arg": "⸘", 768 | "text": { 769 | "copy": "⸘" 770 | }, 771 | "mods": { 772 | "alt": { 773 | "valid": true, 774 | "arg": "\\u2e18", 775 | "subtitle": "\\u2e18 → Copy Hex Unicode" 776 | }, 777 | "cmd": { 778 | "valid": true, 779 | "arg": "⸘", 780 | "subtitle": "⸘ → Copy HTML Numeric Character Reference (Hex)" 781 | } 782 | } 783 | }, 784 | { 785 | "title": "¿\t inverted question mark\n inverted question ", 786 | "subtitle": "U+00BF", 787 | "icon": { 788 | "path": "empty.png" 789 | }, 790 | "arg": "¿", 791 | "text": { 792 | "copy": "¿" 793 | }, 794 | "mods": { 795 | "alt": { 796 | "valid": true, 797 | "arg": "\\u00bf", 798 | "subtitle": "\\u00bf → Copy Hex Unicode" 799 | }, 800 | "cmd": { 801 | "valid": true, 802 | "arg": "¿", 803 | "subtitle": "¿ → Copy HTML Entity" 804 | } 805 | } 806 | }, 807 | { 808 | "title": "ſ\t long s\n latin small letter long s", 809 | "subtitle": "U+017F", 810 | "icon": { 811 | "path": "empty.png" 812 | }, 813 | "arg": "ſ", 814 | "text": { 815 | "copy": "ſ" 816 | }, 817 | "mods": { 818 | "alt": { 819 | "valid": true, 820 | "arg": "\\u017f", 821 | "subtitle": "\\u017f → Copy Hex Unicode" 822 | }, 823 | "cmd": { 824 | "valid": true, 825 | "arg": "ſ", 826 | "subtitle": "ſ → Copy HTML Numeric Character Reference (Hex)" 827 | } 828 | } 829 | }, 830 | { 831 | "title": "−\t minus sign\n math minus subtraction", 832 | "subtitle": "U+2212", 833 | "icon": { 834 | "path": "empty.png" 835 | }, 836 | "arg": "−", 837 | "text": { 838 | "copy": "−" 839 | }, 840 | "mods": { 841 | "alt": { 842 | "valid": true, 843 | "arg": "\\u2212", 844 | "subtitle": "\\u2212 → Copy Hex Unicode" 845 | }, 846 | "cmd": { 847 | "valid": true, 848 | "arg": "−", 849 | "subtitle": "− → Copy HTML Entity" 850 | } 851 | } 852 | }, 853 | { 854 | "title": "×\t multiplication sign\n math times multiply", 855 | "subtitle": "U+00D7", 856 | "icon": { 857 | "path": "empty.png" 858 | }, 859 | "arg": "×", 860 | "text": { 861 | "copy": "×" 862 | }, 863 | "mods": { 864 | "alt": { 865 | "valid": true, 866 | "arg": "\\u00d7", 867 | "subtitle": "\\u00d7 → Copy Hex Unicode" 868 | }, 869 | "cmd": { 870 | "valid": true, 871 | "arg": "×", 872 | "subtitle": "× → Copy HTML Entity" 873 | } 874 | } 875 | }, 876 | { 877 | "title": " \t narrow non-breaking space\n thin no break space", 878 | "subtitle": "U+202F", 879 | "icon": { 880 | "path": "empty.png" 881 | }, 882 | "arg": "\u202F", 883 | "text": { 884 | "copy": "" 885 | }, 886 | "mods": { 887 | "alt": { 888 | "valid": true, 889 | "arg": "\\u202F", 890 | "subtitle": "\\u202F → Copy Hex Unicode" 891 | }, 892 | "cmd": { 893 | "valid": true, 894 | "arg": " ", 895 | "subtitle": "  → Copy HTML Numeric Character Reference (Hex)" 896 | } 897 | } 898 | }, 899 | { 900 | "title": " \t non-breaking space\n no break space", 901 | "subtitle": "U+00A0", 902 | "icon": { 903 | "path": "empty.png" 904 | }, 905 | "arg": " ", 906 | "text": { 907 | "copy": " " 908 | }, 909 | "mods": { 910 | "alt": { 911 | "valid": true, 912 | "arg": "\\u00A0", 913 | "subtitle": "\\u00A0 → Copy Hex Unicode" 914 | }, 915 | "cmd": { 916 | "valid": true, 917 | "arg": " ", 918 | "subtitle": "  → Copy HTML Entity" 919 | } 920 | } 921 | }, 922 | { 923 | "title": "≠\t not equal to sign\n math not equal", 924 | "subtitle": "U+2260", 925 | "icon": { 926 | "path": "empty.png" 927 | }, 928 | "arg": "≠", 929 | "text": { 930 | "copy": "≠" 931 | }, 932 | "mods": { 933 | "alt": { 934 | "valid": true, 935 | "arg": "\\u2260", 936 | "subtitle": "\\u2260 → Copy Hex Unicode" 937 | }, 938 | "cmd": { 939 | "valid": true, 940 | "arg": "≠", 941 | "subtitle": "≠ → Copy HTML Entity" 942 | } 943 | } 944 | }, 945 | { 946 | "title": "½\t one half\n math fraction 1 2", 947 | "subtitle": "U+00BD", 948 | "icon": { 949 | "path": "empty.png" 950 | }, 951 | "arg": "½", 952 | "text": { 953 | "copy": "½" 954 | }, 955 | "mods": { 956 | "alt": { 957 | "valid": true, 958 | "arg": "\\u00bd", 959 | "subtitle": "\\u00bd → Copy Hex Unicode" 960 | }, 961 | "cmd": { 962 | "valid": true, 963 | "arg": "½", 964 | "subtitle": "½ → Copy HTML Entity" 965 | } 966 | } 967 | }, 968 | { 969 | "title": "¼\t one quarter\n math fraction 1 4", 970 | "subtitle": "U+00BC", 971 | "icon": { 972 | "path": "empty.png" 973 | }, 974 | "arg": "¼", 975 | "text": { 976 | "copy": "¼" 977 | }, 978 | "mods": { 979 | "alt": { 980 | "valid": true, 981 | "arg": "\\u00bc", 982 | "subtitle": "\\u00bc → Copy Hex Unicode" 983 | }, 984 | "cmd": { 985 | "valid": true, 986 | "arg": "¼", 987 | "subtitle": "¼ → Copy HTML Entity" 988 | } 989 | } 990 | }, 991 | { 992 | "title": "π\t pi sign\n math greek pi", 993 | "subtitle": "U+03c0", 994 | "icon": { 995 | "path": "empty.png" 996 | }, 997 | "arg": "π", 998 | "text": { 999 | "copy": "π" 1000 | }, 1001 | "mods": { 1002 | "alt": { 1003 | "valid": true, 1004 | "arg": "\\u03c0", 1005 | "subtitle": "\\u03c0 → Copy Hex Unicode" 1006 | }, 1007 | "cmd": { 1008 | "valid": true, 1009 | "arg": "π", 1010 | "subtitle": "π → Copy HTML Entity" 1011 | } 1012 | } 1013 | }, 1014 | { 1015 | "title": "+\t plus sign\n math plus addition", 1016 | "subtitle": "U+002B", 1017 | "icon": { 1018 | "path": "empty.png" 1019 | }, 1020 | "arg": "+", 1021 | "text": { 1022 | "copy": "+" 1023 | }, 1024 | "mods": { 1025 | "alt": { 1026 | "valid": true, 1027 | "arg": "\\u002B", 1028 | "subtitle": "\\u002B → Copy Hex Unicode" 1029 | }, 1030 | "cmd": { 1031 | "valid": true, 1032 | "arg": "+", 1033 | "subtitle": "+ → Copy HTML Numeric Character Reference (Hex)" 1034 | } 1035 | } 1036 | }, 1037 | { 1038 | "title": " \t punctuation space\n ", 1039 | "subtitle": "U+2008", 1040 | "icon": { 1041 | "path": "empty.png" 1042 | }, 1043 | "arg": " ", 1044 | "text": { 1045 | "copy": " " 1046 | }, 1047 | "mods": { 1048 | "alt": { 1049 | "valid": true, 1050 | "arg": "\\u2008", 1051 | "subtitle": "\\u2008 → Copy Hex Unicode" 1052 | }, 1053 | "cmd": { 1054 | "valid": true, 1055 | "arg": " ", 1056 | "subtitle": "  → Copy HTML Entity" 1057 | } 1058 | } 1059 | }, 1060 | { 1061 | "title": "′\t single prime\n foot feet arcminute minute", 1062 | "subtitle": "U+2032", 1063 | "icon": { 1064 | "path": "empty.png" 1065 | }, 1066 | "arg": "′", 1067 | "text": { 1068 | "copy": "′" 1069 | }, 1070 | "mods": { 1071 | "alt": { 1072 | "valid": true, 1073 | "arg": "\\u2032", 1074 | "subtitle": "\\u2032 → Copy Hex Unicode" 1075 | }, 1076 | "cmd": { 1077 | "valid": true, 1078 | "arg": "′", 1079 | "subtitle": "′ → Copy HTML Entity" 1080 | } 1081 | } 1082 | }, 1083 | { 1084 | "title": "★\t star filled\n ", 1085 | "subtitle": "U+2605", 1086 | "icon": { 1087 | "path": "empty.png" 1088 | }, 1089 | "arg": "★", 1090 | "text": { 1091 | "copy": "★" 1092 | }, 1093 | "mods": { 1094 | "alt": { 1095 | "valid": true, 1096 | "arg": "\\u2605", 1097 | "subtitle": "\\u2605 → Copy Hex Unicode" 1098 | }, 1099 | "cmd": { 1100 | "valid": true, 1101 | "arg": "★", 1102 | "subtitle": "★ → Copy HTML Numeric Character Reference (Hex)" 1103 | } 1104 | } 1105 | }, 1106 | { 1107 | "title": "☆\t star outline\n ", 1108 | "subtitle": "U+2606", 1109 | "icon": { 1110 | "path": "empty.png" 1111 | }, 1112 | "arg": "☆", 1113 | "text": { 1114 | "copy": "☆" 1115 | }, 1116 | "mods": { 1117 | "alt": { 1118 | "valid": true, 1119 | "arg": "\\u2606", 1120 | "subtitle": "\\u2606 → Copy Hex Unicode" 1121 | }, 1122 | "cmd": { 1123 | "valid": true, 1124 | "arg": "☆", 1125 | "subtitle": "☆ → Copy HTML Numeric Character Reference (Hex)" 1126 | } 1127 | } 1128 | }, 1129 | { 1130 | "title": "³\t superior three\n 3", 1131 | "subtitle": "U+00B3", 1132 | "icon": { 1133 | "path": "empty.png" 1134 | }, 1135 | "arg": "³", 1136 | "text": { 1137 | "copy": "³" 1138 | }, 1139 | "mods": { 1140 | "alt": { 1141 | "valid": true, 1142 | "arg": "\\u00b3", 1143 | "subtitle": "\\u00b3 → Copy Hex Unicode" 1144 | }, 1145 | "cmd": { 1146 | "valid": true, 1147 | "arg": "³", 1148 | "subtitle": "³ → Copy HTML Entity" 1149 | } 1150 | } 1151 | }, 1152 | { 1153 | "title": "²\t superior two\n 2", 1154 | "subtitle": "U+00B2", 1155 | "icon": { 1156 | "path": "empty.png" 1157 | }, 1158 | "arg": "²", 1159 | "text": { 1160 | "copy": "²" 1161 | }, 1162 | "mods": { 1163 | "alt": { 1164 | "valid": true, 1165 | "arg": "\\u00b2", 1166 | "subtitle": "\\u00b2 → Copy Hex Unicode" 1167 | }, 1168 | "cmd": { 1169 | "valid": true, 1170 | "arg": "²", 1171 | "subtitle": "² → Copy HTML Entity" 1172 | } 1173 | } 1174 | }, 1175 | { 1176 | "title": " \t thin space\n ", 1177 | "subtitle": "U+2009", 1178 | "icon": { 1179 | "path": "empty.png" 1180 | }, 1181 | "arg": " ", 1182 | "text": { 1183 | "copy": " " 1184 | }, 1185 | "mods": { 1186 | "alt": { 1187 | "valid": true, 1188 | "arg": "\\u2009", 1189 | "subtitle": "\\u2009 → Copy Hex Unicode" 1190 | }, 1191 | "cmd": { 1192 | "valid": true, 1193 | "arg": " ", 1194 | "subtitle": "  → Copy HTML Entity" 1195 | } 1196 | } 1197 | }, 1198 | { 1199 | "title": "¾\t three quarters\n math fraction 3 4", 1200 | "subtitle": "U+00BE", 1201 | "icon": { 1202 | "path": "empty.png" 1203 | }, 1204 | "arg": "¾", 1205 | "text": { 1206 | "copy": "¾" 1207 | }, 1208 | "mods": { 1209 | "alt": { 1210 | "valid": true, 1211 | "arg": "\\u00be", 1212 | "subtitle": "\\u00be → Copy Hex Unicode" 1213 | }, 1214 | "cmd": { 1215 | "valid": true, 1216 | "arg": "¾", 1217 | "subtitle": "¾ → Copy HTML Entity" 1218 | } 1219 | } 1220 | }, 1221 | { 1222 | "title": "‴\t triple prime\n ", 1223 | "subtitle": "U+2034", 1224 | "icon": { 1225 | "path": "empty.png" 1226 | }, 1227 | "arg": "‴", 1228 | "text": { 1229 | "copy": "‴" 1230 | }, 1231 | "mods": { 1232 | "alt": { 1233 | "valid": true, 1234 | "arg": "\\u2034", 1235 | "subtitle": "\\u2034 → Copy Hex Unicode" 1236 | }, 1237 | "cmd": { 1238 | "valid": true, 1239 | "arg": "‴", 1240 | "subtitle": "‴ → Copy HTML Numeric Character Reference (Hex)" 1241 | } 1242 | } 1243 | }, 1244 | { 1245 | "title": "™\t trade mark sign\n trade mark ™", 1246 | "subtitle": "U+2122", 1247 | "icon": { 1248 | "path": "empty.png" 1249 | }, 1250 | "arg": "™", 1251 | "text": { 1252 | "copy": "™" 1253 | }, 1254 | "mods": { 1255 | "alt": { 1256 | "valid": true, 1257 | "arg": "\\u2122", 1258 | "subtitle": "\\u2122 → Copy Hex Unicode" 1259 | }, 1260 | "cmd": { 1261 | "valid": true, 1262 | "arg": "™", 1263 | "subtitle": "™ → Copy HTML Entity" 1264 | } 1265 | } 1266 | }, 1267 | { 1268 | "title": "®\t registered sign\n registered sign ®", 1269 | "subtitle": "U+00AE", 1270 | "icon": { 1271 | "path": "empty.png" 1272 | }, 1273 | "arg": "®", 1274 | "text": { 1275 | "copy": "®" 1276 | }, 1277 | "mods": { 1278 | "alt": { 1279 | "valid": true, 1280 | "arg": "\\u00AE", 1281 | "subtitle": "\\u00AE → Copy Hex Unicode" 1282 | }, 1283 | "cmd": { 1284 | "valid": true, 1285 | "arg": "®", 1286 | "subtitle": "® → Copy HTML Entity" 1287 | } 1288 | } 1289 | }, 1290 | { 1291 | "title": "⸮\t reversed question mark\n reversed question irony punctuation ⸮", 1292 | "subtitle": "U+2E2E", 1293 | "icon": { 1294 | "path": "empty.png" 1295 | }, 1296 | "arg": "⸮", 1297 | "text": { 1298 | "copy": "⸮" 1299 | }, 1300 | "mods": { 1301 | "alt": { 1302 | "valid": true, 1303 | "arg": "\\u2E2E", 1304 | "subtitle": "\\u2E2E → Copy Hex Unicode" 1305 | }, 1306 | "cmd": { 1307 | "valid": true, 1308 | "arg": "⸮", 1309 | "subtitle": "⸮ → Copy HTML Numeric Character Reference (Hex)" 1310 | } 1311 | } 1312 | }, 1313 | { 1314 | "title": "¶ \t pilcrow sign\n pilcrow sign paragraph ¶ ", 1315 | "subtitle": "U+00B6", 1316 | "icon": { 1317 | "path": "empty.png" 1318 | }, 1319 | "arg": "¶ ", 1320 | "text": { 1321 | "copy": "¶ " 1322 | }, 1323 | "mods": { 1324 | "alt": { 1325 | "valid": true, 1326 | "arg": "\\u00b6", 1327 | "subtitle": "\\u00b6 → Copy Hex Unicode" 1328 | }, 1329 | "cmd": { 1330 | "valid": true, 1331 | "arg": "¶", 1332 | "subtitle": "¶ → Copy HTML Entity" 1333 | } 1334 | } 1335 | }, 1336 | { 1337 | "title": "✓\t check mark\n check mark sign ✓", 1338 | "subtitle": "U+2713", 1339 | "icon": { 1340 | "path": "empty.png" 1341 | }, 1342 | "arg": "✓", 1343 | "text": { 1344 | "copy": "✓" 1345 | }, 1346 | "mods": { 1347 | "alt": { 1348 | "valid": true, 1349 | "arg": "\\u2713", 1350 | "subtitle": "\\u2713 → Copy Hex Unicode" 1351 | }, 1352 | "cmd": { 1353 | "valid": true, 1354 | "arg": "✓", 1355 | "subtitle": "✓ → Copy HTML Numeric Character Reference (Hex)" 1356 | } 1357 | } 1358 | }, 1359 | { 1360 | "title": "฿\t baht sign\n baht sign thai currency ฿", 1361 | "subtitle": "U+0E3F", 1362 | "icon": { 1363 | "path": "empty.png" 1364 | }, 1365 | "arg": "฿", 1366 | "text": { 1367 | "copy": "฿" 1368 | }, 1369 | "mods": { 1370 | "alt": { 1371 | "valid": true, 1372 | "arg": "\\u0E3F", 1373 | "subtitle": "\\u0E3F → Copy Hex Unicode" 1374 | }, 1375 | "cmd": { 1376 | "valid": true, 1377 | "arg": "฿", 1378 | "subtitle": "฿ → Copy HTML Numeric Character Reference (Hex)" 1379 | } 1380 | } 1381 | }, 1382 | { 1383 | "title": "¢\t cent sign\n cent sign currency ¢", 1384 | "subtitle": "U+00A2", 1385 | "icon": { 1386 | "path": "empty.png" 1387 | }, 1388 | "arg": "¢", 1389 | "text": { 1390 | "copy": "¢" 1391 | }, 1392 | "mods": { 1393 | "alt": { 1394 | "valid": true, 1395 | "arg": "\\u00A2", 1396 | "subtitle": "\\u00A2 → Copy Hex Unicode" 1397 | }, 1398 | "cmd": { 1399 | "valid": true, 1400 | "arg": "¢", 1401 | "subtitle": "¢ → Copy HTML Entity" 1402 | } 1403 | } 1404 | }, 1405 | { 1406 | "title": "¤\t currency sign\n currency sign ¤", 1407 | "subtitle": "U+00A4", 1408 | "icon": { 1409 | "path": "empty.png" 1410 | }, 1411 | "arg": "¤", 1412 | "text": { 1413 | "copy": "¤" 1414 | }, 1415 | "mods": { 1416 | "alt": { 1417 | "valid": true, 1418 | "arg": "\\u0024", 1419 | "subtitle": "\\u0024 → Copy Hex Unicode" 1420 | }, 1421 | "cmd": { 1422 | "valid": true, 1423 | "arg": "¤", 1424 | "subtitle": "¤ → Copy HTML Entity" 1425 | } 1426 | } 1427 | }, 1428 | { 1429 | "title": "$\t dollar sign\n dollar sign currency $", 1430 | "subtitle": "U+0024", 1431 | "icon": { 1432 | "path": "empty.png" 1433 | }, 1434 | "arg": "$", 1435 | "text": { 1436 | "copy": "$" 1437 | }, 1438 | "mods": { 1439 | "alt": { 1440 | "valid": true, 1441 | "arg": "\\u0024", 1442 | "subtitle": "\\u0024 → Copy Hex Unicode" 1443 | }, 1444 | "cmd": { 1445 | "valid": true, 1446 | "arg": "$", 1447 | "subtitle": "$ → Copy HTML Numeric Character Reference (Hex)" 1448 | } 1449 | } 1450 | }, 1451 | { 1452 | "title": "€\t euro sign\n euro sign currency €", 1453 | "subtitle": "U+20A0", 1454 | "icon": { 1455 | "path": "empty.png" 1456 | }, 1457 | "arg": "€", 1458 | "text": { 1459 | "copy": "€" 1460 | }, 1461 | "mods": { 1462 | "alt": { 1463 | "valid": true, 1464 | "arg": "\\u20A0", 1465 | "subtitle": "\\u20A0 → Copy Hex Unicode" 1466 | }, 1467 | "cmd": { 1468 | "valid": true, 1469 | "arg": "€", 1470 | "subtitle": "€ → Copy HTML Entity" 1471 | } 1472 | } 1473 | }, 1474 | { 1475 | "title": "ƒ\t florin sign\n aperture florin sign currency ƒ", 1476 | "subtitle": "U+0192", 1477 | "icon": { 1478 | "path": "empty.png" 1479 | }, 1480 | "arg": "ƒ", 1481 | "text": { 1482 | "copy": "ƒ" 1483 | }, 1484 | "mods": { 1485 | "alt": { 1486 | "valid": true, 1487 | "arg": "\\u0192", 1488 | "subtitle": "\\u0192 → Copy Hex Unicode" 1489 | }, 1490 | "cmd": { 1491 | "valid": true, 1492 | "arg": "ƒ", 1493 | "subtitle": "ƒ → Copy HTML Entity" 1494 | } 1495 | } 1496 | }, 1497 | { 1498 | "title": "£\t pound sign\n pound sign currency £", 1499 | "subtitle": "U+00A3", 1500 | "icon": { 1501 | "path": "empty.png" 1502 | }, 1503 | "arg": "£", 1504 | "text": { 1505 | "copy": "£" 1506 | }, 1507 | "mods": { 1508 | "alt": { 1509 | "valid": true, 1510 | "arg": "\\u00A3", 1511 | "subtitle": "\\u00A3 → Copy Hex Unicode" 1512 | }, 1513 | "cmd": { 1514 | "valid": true, 1515 | "arg": "£", 1516 | "subtitle": "£ → Copy HTML Entity" 1517 | } 1518 | } 1519 | }, 1520 | { 1521 | "title": "₺\t turkish lira sign\n turkish lira sign currency ₺", 1522 | "subtitle": "U+20BA", 1523 | "icon": { 1524 | "path": "empty.png" 1525 | }, 1526 | "arg": "₺", 1527 | "text": { 1528 | "copy": "₺" 1529 | }, 1530 | "mods": { 1531 | "alt": { 1532 | "valid": true, 1533 | "arg": "\\u20BA", 1534 | "subtitle": "\\u20BA → Copy Hex Unicode" 1535 | }, 1536 | "cmd": { 1537 | "valid": true, 1538 | "arg": "₺", 1539 | "subtitle": "₺ → Copy HTML Numeric Character Reference (Hex)" 1540 | } 1541 | } 1542 | }, 1543 | { 1544 | "title": "¥\t yen sign\n yen sign ¥", 1545 | "subtitle": "U+00A5", 1546 | "icon": { 1547 | "path": "empty.png" 1548 | }, 1549 | "arg": "¥", 1550 | "text": { 1551 | "copy": "¥" 1552 | }, 1553 | "mods": { 1554 | "alt": { 1555 | "valid": true, 1556 | "arg": "\\u00A5", 1557 | "subtitle": "\\u00A5 → Copy Hex Unicode" 1558 | }, 1559 | "cmd": { 1560 | "valid": true, 1561 | "arg": "¥", 1562 | "subtitle": "¥ → Copy HTML Entity" 1563 | } 1564 | } 1565 | }, 1566 | { 1567 | "title": "​ \t zero-width space\n zwsp space", 1568 | "subtitle": "U+200B", 1569 | "icon": { 1570 | "path": "empty.png" 1571 | }, 1572 | "arg": "​", 1573 | "text": { 1574 | "copy": "\u200b" 1575 | }, 1576 | "mods": { 1577 | "alt": { 1578 | "valid": true, 1579 | "arg": "\\u200b", 1580 | "subtitle": "\\u200b → Copy Hex Unicode" 1581 | }, 1582 | "cmd": { 1583 | "valid": true, 1584 | "arg": "​", 1585 | "subtitle": "​ → Copy HTML Numeric Character Reference (Hex)" 1586 | } 1587 | } 1588 | }, 1589 | { 1590 | "title": "ẞ\t german capital sharp s; fallback w/ capital ss\n german capital sharp s; fallback with capital ss ẞ versal sz eszett", 1591 | "subtitle": "U+1E9E", 1592 | "icon": { 1593 | "path": "empty.png" 1594 | }, 1595 | "arg": "ẞ", 1596 | "text": { 1597 | "copy": "ẞ" 1598 | }, 1599 | "mods": { 1600 | "alt": { 1601 | "valid": true, 1602 | "arg": "\\u1e9e", 1603 | "subtitle": "\\u1e9e → Copy Hex Unicode" 1604 | }, 1605 | "cmd": { 1606 | "valid": true, 1607 | "arg": "ẞ", 1608 | "subtitle": "ẞ → Copy HTML Numeric Character Reference (Hex)" 1609 | } 1610 | } 1611 | }, 1612 | { 1613 | "title": "©\t copyright sign\n copyright ©", 1614 | "subtitle": "U+00A9", 1615 | "icon": { 1616 | "path": "empty.png" 1617 | }, 1618 | "arg": "©", 1619 | "text": { 1620 | "copy": "©" 1621 | }, 1622 | "mods": { 1623 | "alt": { 1624 | "valid": true, 1625 | "arg": "\\u00A9", 1626 | "subtitle": "\\u00A9 → Copy Hex Unicode" 1627 | }, 1628 | "cmd": { 1629 | "valid": true, 1630 | "arg": "©", 1631 | "subtitle": "© → Copy HTML Numeric Character Reference (Hex)" 1632 | } 1633 | } 1634 | }, 1635 | { 1636 | "title": "℗\t sound recording copyright sign\n sound recording copyright ℗", 1637 | "subtitle": "U+2117", 1638 | "icon": { 1639 | "path": "empty.png" 1640 | }, 1641 | "arg": "℗", 1642 | "text": { 1643 | "copy": "℗" 1644 | }, 1645 | "mods": { 1646 | "alt": { 1647 | "valid": true, 1648 | "arg": "\\u2117", 1649 | "subtitle": "\\u2117 → Copy Hex Unicode" 1650 | }, 1651 | "cmd": { 1652 | "valid": true, 1653 | "arg": "℗", 1654 | "subtitle": "℗ → Copy HTML Numeric Character Reference (Hex)" 1655 | } 1656 | } 1657 | }, 1658 | { 1659 | "title": "№\t numero sign\n numero sign №", 1660 | "subtitle": "U+2116", 1661 | "icon": { 1662 | "path": "empty.png" 1663 | }, 1664 | "arg": "№", 1665 | "text": { 1666 | "copy": "№" 1667 | }, 1668 | "mods": { 1669 | "alt": { 1670 | "valid": true, 1671 | "arg": "\\u2116", 1672 | "subtitle": "\\u2116 → Copy Hex Unicode" 1673 | }, 1674 | "cmd": { 1675 | "valid": true, 1676 | "arg": "№", 1677 | "subtitle": "№ → Copy HTML Numeric Character Reference (Hex)" 1678 | } 1679 | } 1680 | }, 1681 | { 1682 | "title": "℠\t service mark\n service mark sign ℠", 1683 | "subtitle": "U+2120", 1684 | "icon": { 1685 | "path": "empty.png" 1686 | }, 1687 | "arg": "℠", 1688 | "text": { 1689 | "copy": "℠" 1690 | }, 1691 | "mods": { 1692 | "alt": { 1693 | "valid": true, 1694 | "arg": "\\u2120", 1695 | "subtitle": "\\u2120 → Copy Hex Unicode" 1696 | }, 1697 | "cmd": { 1698 | "valid": true, 1699 | "arg": "℠", 1700 | "subtitle": "℠ → Copy HTML Numeric Character Reference (Hex)" 1701 | } 1702 | } 1703 | }, 1704 | { 1705 | "title": "‰\t per mille\n per mille sign ‰", 1706 | "subtitle": "U+2030", 1707 | "icon": { 1708 | "path": "empty.png" 1709 | }, 1710 | "arg": "‰", 1711 | "text": { 1712 | "copy": "‰" 1713 | }, 1714 | "mods": { 1715 | "alt": { 1716 | "valid": true, 1717 | "arg": "\\u2030", 1718 | "subtitle": "\\u2030 → Copy Hex Unicode" 1719 | }, 1720 | "cmd": { 1721 | "valid": true, 1722 | "arg": "‰", 1723 | "subtitle": "‰ → Copy HTML Numeric Character Reference (Hex)" 1724 | } 1725 | } 1726 | }, 1727 | { 1728 | "title": "‱\t per ten thousand\n per ten thousand sign ‱", 1729 | "subtitle": "U+2031", 1730 | "icon": { 1731 | "path": "empty.png" 1732 | }, 1733 | "arg": "‱", 1734 | "text": { 1735 | "copy": "‱" 1736 | }, 1737 | "mods": { 1738 | "alt": { 1739 | "valid": true, 1740 | "arg": "\\u2031", 1741 | "subtitle": "\\u2031 → Copy Hex Unicode" 1742 | }, 1743 | "cmd": { 1744 | "valid": true, 1745 | "arg": "‱", 1746 | "subtitle": "‱ → Copy HTML Numeric Character Reference (Hex)" 1747 | } 1748 | } 1749 | }, 1750 | { 1751 | "title": "∑\t n-ary summation\n n-ary summation sign sum ∑", 1752 | "subtitle": "U+2211", 1753 | "icon": { 1754 | "path": "empty.png" 1755 | }, 1756 | "arg": "∑", 1757 | "text": { 1758 | "copy": "∑" 1759 | }, 1760 | "mods": { 1761 | "alt": { 1762 | "valid": true, 1763 | "arg": "\\u2211", 1764 | "subtitle": "\\u2211 → Copy Hex Unicode" 1765 | }, 1766 | "cmd": { 1767 | "valid": true, 1768 | "arg": "∑", 1769 | "subtitle": "∑ → Copy HTML Numeric Character Reference (Hex)" 1770 | } 1771 | } 1772 | }, 1773 | { 1774 | "title": "℃\t Degree Celsius\n degree celsius ℃", 1775 | "subtitle": "U+2103", 1776 | "icon": { 1777 | "path": "empty.png" 1778 | }, 1779 | "arg": "℃", 1780 | "text": { 1781 | "copy": "℃" 1782 | }, 1783 | "mods": { 1784 | "alt": { 1785 | "valid": true, 1786 | "arg": "\\u2103", 1787 | "subtitle": "\\u2103 → Copy Hex Unicode" 1788 | }, 1789 | "cmd": { 1790 | "valid": true, 1791 | "arg": "℃", 1792 | "subtitle": "℃ → Copy HTML Numeric Character Reference (Hex)" 1793 | } 1794 | } 1795 | }, 1796 | { 1797 | "title": "℉\t Degree Fahrenheit\n degree fahrenheit ℉", 1798 | "subtitle": "U+2109", 1799 | "icon": { 1800 | "path": "empty.png" 1801 | }, 1802 | "arg": "℉", 1803 | "text": { 1804 | "copy": "℉" 1805 | }, 1806 | "mods": { 1807 | "alt": { 1808 | "valid": true, 1809 | "arg": "\\u2109", 1810 | "subtitle": "\\u2109 → Copy Hex Unicode" 1811 | }, 1812 | "cmd": { 1813 | "valid": true, 1814 | "arg": "℉", 1815 | "subtitle": "℉ → Copy HTML Numeric Character Reference (Hex)" 1816 | } 1817 | } 1818 | }, 1819 | { 1820 | "title": "°\t degree sign\n degree sign °", 1821 | "subtitle": "U+00B0", 1822 | "icon": { 1823 | "path": "empty.png" 1824 | }, 1825 | "arg": "°", 1826 | "text": { 1827 | "copy": "°" 1828 | }, 1829 | "mods": { 1830 | "alt": { 1831 | "valid": true, 1832 | "arg": "\\u00b0", 1833 | "subtitle": "\\u00b0 → Copy Hex Unicode" 1834 | }, 1835 | "cmd": { 1836 | "valid": true, 1837 | "arg": "°", 1838 | "subtitle": "° → Copy HTML Numeric Character Reference (Hex)" 1839 | } 1840 | } 1841 | }, 1842 | { 1843 | "title": "»\t right-pointing double guillemet quotation\n right-pointing double guillemet quotation »", 1844 | "subtitle": "U+00BB", 1845 | "icon": { 1846 | "path": "empty.png" 1847 | }, 1848 | "arg": "»", 1849 | "text": { 1850 | "copy": "»" 1851 | }, 1852 | "mods": { 1853 | "alt": { 1854 | "valid": true, 1855 | "arg": "\\u00bb", 1856 | "subtitle": "\\u00bb → Copy Hex Unicode" 1857 | }, 1858 | "cmd": { 1859 | "valid": true, 1860 | "arg": "»", 1861 | "subtitle": "» → Copy HTML Numeric Character Reference (Hex)" 1862 | } 1863 | } 1864 | }, 1865 | { 1866 | "title": "«\t left-pointing double guillemet quotation\n left-pointing double guillemet quotation «", 1867 | "subtitle": "U+00AB", 1868 | "icon": { 1869 | "path": "empty.png" 1870 | }, 1871 | "arg": "«", 1872 | "text": { 1873 | "copy": "«" 1874 | }, 1875 | "mods": { 1876 | "alt": { 1877 | "valid": true, 1878 | "arg": "\\u00AB", 1879 | "subtitle": "\\u00AB → Copy Hex Unicode" 1880 | }, 1881 | "cmd": { 1882 | "valid": true, 1883 | "arg": "«", 1884 | "subtitle": "« → Copy HTML Numeric Character Reference (Hex)" 1885 | } 1886 | } 1887 | }, 1888 | { 1889 | "title": "‹\t left-pointing single guillemet quotation \n left-pointing single guillemet quotation ‹", 1890 | "subtitle": "U+2039", 1891 | "icon": { 1892 | "path": "empty.png" 1893 | }, 1894 | "arg": "‹", 1895 | "text": { 1896 | "copy": "‹" 1897 | }, 1898 | "mods": { 1899 | "alt": { 1900 | "valid": true, 1901 | "arg": "\\u2039", 1902 | "subtitle": "\\u2039 → Copy Hex Unicode" 1903 | }, 1904 | "cmd": { 1905 | "valid": true, 1906 | "arg": "‹", 1907 | "subtitle": "‹ → Copy HTML Numeric Character Reference (Hex)" 1908 | } 1909 | } 1910 | }, 1911 | { 1912 | "title": "›\t right-pointing single guillemet quotation\n right-pointing single guillemet quotation ›", 1913 | "subtitle": "U+203A", 1914 | "icon": { 1915 | "path": "empty.png" 1916 | }, 1917 | "arg": "›", 1918 | "text": { 1919 | "copy": "›" 1920 | }, 1921 | "mods": { 1922 | "alt": { 1923 | "valid": true, 1924 | "arg": "\\u203A", 1925 | "subtitle": "\\u203A → Copy Hex Unicode" 1926 | }, 1927 | "cmd": { 1928 | "valid": true, 1929 | "arg": "›", 1930 | "subtitle": "› → Copy HTML Numeric Character Reference (Hex)" 1931 | } 1932 | } 1933 | }, 1934 | { 1935 | "title": "­\t soft hyphen\n soft hyphen ­", 1936 | "subtitle": "U+00AD", 1937 | "icon": { 1938 | "path": "empty.png" 1939 | }, 1940 | "arg": "­", 1941 | "text": { 1942 | "copy": "­" 1943 | }, 1944 | "mods": { 1945 | "alt": { 1946 | "valid": true, 1947 | "arg": "\\u00AD", 1948 | "subtitle": "\\u00AD → Copy Hex Unicode" 1949 | }, 1950 | "cmd": { 1951 | "valid": true, 1952 | "arg": "­", 1953 | "subtitle": "­ → Copy HTML Numeric Character Reference (Hex)" 1954 | } 1955 | } 1956 | }, 1957 | { 1958 | "title": "‑\t non-breaking hyphen\n non-breaking hyphen ‑", 1959 | "subtitle": "U+2011", 1960 | "icon": { 1961 | "path": "empty.png" 1962 | }, 1963 | "arg": "‑", 1964 | "text": { 1965 | "copy": "‑" 1966 | }, 1967 | "mods": { 1968 | "alt": { 1969 | "valid": true, 1970 | "arg": "\\u2011", 1971 | "subtitle": "\\u2011 → Copy Hex Unicode" 1972 | }, 1973 | "cmd": { 1974 | "valid": true, 1975 | "arg": "‑", 1976 | "subtitle": "‑ → Copy HTML Numeric Character Reference (Hex)" 1977 | } 1978 | } 1979 | }, 1980 | ]} 1981 | -------------------------------------------------------------------------------- /src/empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typefacts/alfred-special-characters/ecce308b4c811d48af97c2ed82025a1f81ac30e9/src/empty.png -------------------------------------------------------------------------------- /src/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typefacts/alfred-special-characters/ecce308b4c811d48af97c2ed82025a1f81ac30e9/src/icon.png -------------------------------------------------------------------------------- /src/info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | bundleid 6 | com.typefacts.alfred-specialchars 7 | connections 8 | 9 | 50B0CD10-4D52-4898-9C05-DD3A34A829C3 10 | 11 | 12 | destinationuid 13 | BBDE9259-99C8-410D-970C-69A0B9414F71 14 | modifiers 15 | 0 16 | modifiersubtext 17 | 18 | vitoclose 19 | 20 | 21 | 22 | 23 | createdby 24 | Norman Posselt & Frank Rausch 25 | description 26 | Search for special characters and paste them into the frontmost app. 27 | disabled 28 | 29 | name 30 | Special Characters by Typefacts 31 | objects 32 | 33 | 34 | config 35 | 36 | alfredfiltersresults 37 | 38 | alfredfiltersresultsmatchmode 39 | 0 40 | argumenttreatemptyqueryasnil 41 | 42 | argumenttrimmode 43 | 0 44 | argumenttype 45 | 1 46 | escaping 47 | 127 48 | keyword 49 | tf 50 | queuedelaycustom 51 | 1 52 | queuedelayimmediatelyinitially 53 | 54 | queuedelaymode 55 | 0 56 | queuemode 57 | 1 58 | runningsubtext 59 | Loading Characters… 60 | script 61 | cat characters.json 62 | scriptargtype 63 | 1 64 | scriptfile 65 | test.sh 66 | subtext 67 | 68 | title 69 | Insert Special Character 70 | type 71 | 0 72 | withspace 73 | 74 | 75 | type 76 | alfred.workflow.input.scriptfilter 77 | uid 78 | 50B0CD10-4D52-4898-9C05-DD3A34A829C3 79 | version 80 | 3 81 | 82 | 83 | config 84 | 85 | autopaste 86 | 87 | clipboardtext 88 | {query} 89 | transient 90 | 91 | 92 | type 93 | alfred.workflow.output.clipboard 94 | uid 95 | BBDE9259-99C8-410D-970C-69A0B9414F71 96 | version 97 | 3 98 | 99 | 100 | readme 101 | The Typefacts Special Characters Workflow 102 | 103 | Many special characters needed for good typography are hard to find, some are not even available on the keyboard at all. 104 | 105 | This workflow gives you access to these characters and pastes them right into your current application. 106 | 107 | --- 108 | 109 | This workflow was built by: 110 | 111 | Norman Posselt (@norman_posselt) 112 | Frank Rausch (@frankrausch) 113 | 114 | --- 115 | 116 | This workflow – excluding the Typefacts name, logo and branding – is licensed under the MIT License. 117 | 118 | 119 | MIT License 120 | 121 | Copyright (c) 2016 Typefacts.com 122 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 123 | 124 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 125 | 126 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 127 | uidata 128 | 129 | 50B0CD10-4D52-4898-9C05-DD3A34A829C3 130 | 131 | colorindex 132 | 1 133 | xpos 134 | 70 135 | ypos 136 | 50 137 | 138 | BBDE9259-99C8-410D-970C-69A0B9414F71 139 | 140 | xpos 141 | 310 142 | ypos 143 | 50 144 | 145 | 146 | variablesdontexport 147 | 148 | version 149 | 1.1.9 150 | webaddress 151 | http://typefacts.com 152 | 153 | 154 | --------------------------------------------------------------------------------