├── .DS_Store ├── PRIVACY_POLICY ├── README.md ├── readme ├── app-icon.png ├── download-button.svg └── example.png └── scripts ├── provider.script.py └── provider.script.rb /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tanin47/tip/1d58970d61710bda42fbc7e4306129e801d01bdb/.DS_Store -------------------------------------------------------------------------------- /PRIVACY_POLICY: -------------------------------------------------------------------------------- 1 | Privacy policy 2 | =============== 3 | 4 | Programmable Tooltip doesn't collect any information about you. 5 | 6 | 7 | What this policy covers 8 | ------------------------ 9 | 10 | * The executable binary: Tip.app 11 | 12 | 13 | What this policy doesn't cover 14 | ------------------------------- 15 | 16 | * The provider script. 17 | * Because the provider script is owned by the users. By default, Programmable Tooltip cannot write to the provider script. 18 | * Please always review a downloaded provider script before using it. 19 | * Apple may collect usage and crash statistics, which are provided through [App Store Connect](https://developer.apple.com/app-store-connect/analytics/). 20 | 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Universal Tip icon](./readme/app-icon.png) Programmable Tooltip 2 | ============== 3 | 4 | [![Download from Mac App Store](./readme/download-button.svg)](https://apps.apple.com/us/app/universal-tip/id1495732622) 5 | 6 | Programmable Tooltip automates your micro-workflows on any Mac app. 7 | 8 | You can select text on any part of any app, open the tooltip, and choose the action you want to perform. This reduces the number of clicks and complex hand movement by multiple folds. 9 | 10 | You will work faster, reduce hand strain, and avoid the infamous Repetitive Strain Injury (RSI). 11 | 12 | Visit: [programmabletooltip.com](https://programmabletooltip.com) 13 | 14 | Examples 15 | --------- 16 | 17 | ### Convert the seconds from epoch to the human-readable time and copy it to clipboard 18 | 19 | Programmable Tooltip is used within Chrome. 20 | 21 | ![Convert seconds from epoch to time and copy](https://media.giphy.com/media/f952ZuRG9kqCoxGt8v/giphy.gif) 22 | 23 | If you've installed Programmable Tooltip, try converting seconds from epoch to time by triggering Programmable Tooltip on the following string: `1577733633` 24 | 25 | ### Open Github code search on the selected text 26 | 27 | Programmable Tooltip is used within Sublime. 28 | 29 | ![Open Github code search with the selected text](https://media.giphy.com/media/cjif6axsDr7tEaP0EF/giphy.gif) 30 | 31 | ### Open a file on Github from an error stacktrace line 32 | 33 | Programmable Tooltip is used within Terminal. 34 | 35 | ![Open file on Github from an error stacktrace line](https://media.giphy.com/media/JSYWptFElQmDJOXzXO/giphy.gif) 36 | 37 | ### Open a JIRA ticket on the selected text 38 | 39 | Programmable Tooltip is used within Terminal. 40 | 41 | ![Open JIRA with the selected text](https://media.giphy.com/media/H48pYa5PddvEY9MGP6/giphy.gif) 42 | 43 | ---- 44 | 45 | [![Download from Mac App Store](./readme/download-button.svg)](https://apps.apple.com/us/app/universal-tip/id1495732622) 46 | 47 | Visit: [programmabletooltip.com](https://programmabletooltip.com) 48 | -------------------------------------------------------------------------------- /readme/app-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tanin47/tip/1d58970d61710bda42fbc7e4306129e801d01bdb/readme/app-icon.png -------------------------------------------------------------------------------- /readme/download-button.svg: -------------------------------------------------------------------------------- 1 | 2 | Download_on_the_Mac_App_Store_Badge_US-UK_RGB_blk_092917 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /readme/example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tanin47/tip/1d58970d61710bda42fbc7e4306129e801d01bdb/readme/example.png -------------------------------------------------------------------------------- /scripts/provider.script.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | # Please copy this file to the folder: ~/Library/Application\ Scripts/tanin.tip/ 4 | 5 | import json 6 | import sys 7 | 8 | 9 | def main(input): 10 | items = [ 11 | {'type': 'text', 'value': f'Input {input}'}, 12 | {'type': 'url', 'label': f'Google {input}', 'value': f'https://google.com/search?q={input}'} 13 | ] 14 | 15 | print(json.dumps(items)) 16 | 17 | 18 | if __name__ == "__main__": 19 | main(sys.argv[1]) -------------------------------------------------------------------------------- /scripts/provider.script.rb: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | # Please copy this file to the folder: ~/Library/Application\ Scripts/tanin.tip/ 4 | 5 | require 'json' 6 | require 'cgi' 7 | 8 | def main(input) 9 | input = input.strip.force_encoding('UTF-8') 10 | # The force encoding prevents the error: ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError) 11 | 12 | items = [ 13 | { 14 | type: 'text', 15 | label: 'Copy uppercase', 16 | value: input.upcase 17 | }, 18 | { 19 | type: 'text', 20 | label: 'Copy lowercase', 21 | value: input.downcase 22 | }, 23 | { 24 | type: 'url', 25 | label: "Open Google Search for: #{input}", 26 | value: "https://google.com/search?q=#{CGI.escape(input)}" 27 | }, 28 | ] 29 | 30 | puts items.compact.to_json 31 | end 32 | 33 | if __FILE__ == $0 34 | main(ARGV[0]) 35 | end 36 | 37 | --------------------------------------------------------------------------------