├── .babelrc ├── .editorconfig ├── .env.example ├── .eslintrc.yml ├── .gitignore ├── .travis.yml ├── README.md ├── _config.yml ├── handlers ├── entityHandler.js ├── index.js ├── langsCommand.js ├── removeAction.js ├── startCommand.js └── themeCommand.js ├── helpers ├── debug.js ├── index.js └── sleep.js ├── index.js ├── knexfile.js ├── migrations ├── 20171126121307_create_users_table.js └── 20171126121343_create_chats_table.js ├── package-lock.json ├── package.json └── src ├── bot.mjs ├── config ├── config.mjs ├── languages.yml ├── messages.mjs └── methods.mjs ├── model ├── Chat │ └── chat-model.mjs ├── Chunk │ └── chunk-model.mjs └── User │ └── user-model.mjs └── server.mjs /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["@babel/preset-env"], 3 | "plugins": [ 4 | [ 5 | "transform-runtime", 6 | "transform-object-rest-spread" 7 | ], 8 | { 9 | "useBuiltIns": true 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*.php] 4 | charset = utf-8 5 | end_of_line = lf 6 | insert_final_newline = true 7 | trim_trailing_whitespace = true 8 | indent_style = space 9 | indent_size = 4 10 | 11 | [*.js] 12 | indent_size = 2 13 | 14 | [*.mjs] 15 | indent_size = 2 16 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | NODE_ENV=development 2 | APP_ENV=development 3 | 4 | WEBHOOK_DOMAIN= 5 | WEBHOOK_PORT=8443 6 | WEBHOOK_KEY=cert/privkey1.pem 7 | WEBHOOK_CERT=cert/fullchain1.pem 8 | WEBHOOK_PATH=bot 9 | 10 | DB_HOST=localhost 11 | DB_PORT=3306 12 | DB_DATABASE= 13 | DB_USER= 14 | DB_PASSWORD= 15 | 16 | BOT_TOKEN="/\d{9}:\w{16}_\w{18}/" 17 | BOT_USER="/\w+bot/i" 18 | 19 | DEFAULT_THEME=github 20 | IMAGES_DIR=images 21 | -------------------------------------------------------------------------------- /.eslintrc.yml: -------------------------------------------------------------------------------- 1 | root: true 2 | parser: babel-eslint 3 | extends: 4 | - '@atomix' 5 | env: 6 | es6: true 7 | node: true 8 | parserOptions: 9 | sourceType: module 10 | ecmaVersion: 2018 11 | ecmaFeatures: 12 | globalReturn: false 13 | modules: true 14 | globals: 15 | BigInt: true 16 | rules: 17 | max-len: off 18 | import/no-cycle: off 19 | import/extensions: off 20 | no-param-reassign: off 21 | prettier/prettier: off 22 | prefer-rest-params: off 23 | prefer-destructuring: off 24 | no-underscore-dangle: off 25 | unicorn/filename-case: off 26 | unicorn/prefer-spread: off 27 | class-methods-use-this: off 28 | function-paren-newline: off 29 | import/no-default-export: off 30 | # unicorn/prevent-abbreviations: 31 | # - error 32 | # - 33 | # whitelist: 34 | # ctx: true 35 | # err: true 36 | curly: 37 | - error 38 | comma-dangle: 39 | - error 40 | - always-multiline 41 | id-length: 42 | - error 43 | - 44 | min: 2 45 | exceptions: 46 | - i 47 | - x 48 | - y 49 | - e 50 | id-match: 51 | - error 52 | - "^(([A-Za-z0-9]+){2,})|([A-Z][A-Z_0-9]+)$" 53 | - 54 | properties: false 55 | onlyDeclarations: true 56 | indent: 57 | - error 58 | - 2 59 | - 60 | SwitchCase: 1 61 | quotes: 62 | - error 63 | - single 64 | semi: 65 | - error 66 | - never 67 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # node-waf configuration 27 | .lock-wscript 28 | 29 | # Compiled binary addons (https://nodejs.org/api/addons.html) 30 | build/Release 31 | 32 | # Dependency directories 33 | bower_components/ 34 | node_modules/ 35 | jspm_packages/ 36 | 37 | # Typescript v1 declaration files 38 | typings/ 39 | 40 | # Optional npm cache directory 41 | .npm 42 | 43 | # Optional eslint cache 44 | .eslintcache 45 | 46 | # Optional REPL history 47 | .node_repl_history 48 | 49 | # Output of 'npm pack' 50 | *.tgz 51 | 52 | # Yarn Integrity file 53 | .yarn-integrity 54 | 55 | # VSCode 56 | .vscode/ 57 | 58 | # dotenv environment variables file 59 | .env 60 | 61 | # package-lock.json 62 | 63 | Node/ 64 | PHP/ 65 | cert/ 66 | images/ 67 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - 9 4 | - 10 5 | - 12 6 | script: 7 | - npm run lint 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Syntax Highlighter Bot 2 | 3 | ![Travis (.org)](https://img.shields.io/travis/com/Piterden/syntax-highlighter-bot.svg?style=for-the-badge) ![GitHub search hit counter](https://img.shields.io/github/search/Piterden/syntax-highlighter-bot/highlight.svg?style=for-the-badge) ![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/Piterden/syntax-highlighter-bot.svg?style=for-the-badge) 4 | 5 | The bot for creating an image with highlighted code from a message. 6 | 7 | ## Overview 8 | 9 | This bot was written on top of the [Telegraf.js](https://github.com/telegraf/telegraf) bot framework, so all you need to have is the Node.js > v6. 10 | 11 | ## Usage 12 | 13 | [Demo](https://t.me/cris_highlight_bot) (WIP version). 14 | 15 | The bot listens for entities type of `pre` in any text message. It means, it will render all pieces of text, wrapped in triple backticks (multiline code). Also you could force the language, writing its name on the first line, right after backticks. Just like on the GitHub. 16 | 17 | Look at the example of a code should be handled by the bot: 18 | 19 | ``` 20 | \`\`\`js 21 | /** 22 | * Show themes list 23 | */ 24 | bot.command('theme', (ctx) => isPrivateChat(ctx) 25 | ? ctx.replyWithMarkdown( 26 | messages.themeChoose(ctx.state.user.theme), 27 | Markup.keyboard(themesKeyboard(themes)).oneTime().resize().extra() 28 | ) 29 | : ctx.reply(messages.themeGroup) 30 | )\`\`\` 31 | ``` 32 | 33 | ### Commands 34 | 35 | - `/start` - Initial launch of the bot. 36 | - `/theme` - Shows the list of included themes and allows you to select a theme which you like more. 37 | - `/langs` - Shows the list of supported languages. 38 | 39 | ## Installing 40 | 41 | First of all clone this repository and install dependencies. Run in the terminal: 42 | 43 | ```bash 44 | $ git clone git@github.com:Piterden/syntax-highlighter-bot.git 45 | $ cd syntax-highlighter-bot 46 | $ npm i 47 | ``` 48 | 49 | Then you need to create and fill the new `.env` file: 50 | 51 | ```bash 52 | $ cp .env.example .env 53 | $ editor .env 54 | ``` 55 | 56 | ## Built With 57 | 58 | * [Telegraf.js](https://github.com/telegraf/telegraf) - The bot framework. 59 | * [Objection.js](http://vincit.github.io/objection.js/) - ORM. 60 | * [Express.js](https://expressjs.com/) - HTTP server. 61 | * [Knex.js](http://knexjs.org/) - Query builder. 62 | 63 | ## Contributing 64 | 65 | Please read [CONTRIBUTING.md](https://gist.github.com/PurpleBooth/b24679402957c63ec426) for details on our code of conduct, and the process for submitting pull requests to us. 66 | 67 | ## Authors 68 | 69 | * **Cristian Ospina** - *Bot's [initial version](https://github.com/Piterden/syntax-highlighter-bot/tree/old-double-bot)* - [CristianOspina](https://github.com/CristianOspina) 70 | * **Denis Efremov** - *Rewrite to the Node.js* - [Piterden](https://github.com/Piterden) 71 | 72 | ## License 73 | 74 | This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details 75 | 76 | ## Donate 77 | 78 | - **BTC** `3F275vPSCvYW19MHZqSjw79fEwwU4MbTgV` 79 | - **LTC** `MGMCQB3QAcrSBjU3eGJviqB2J2f5BNVRGr` 80 | - **DOGE** `D5m69FRDGEn3G3xuakvqTxUpGVt6NegKJp` 81 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-hacker -------------------------------------------------------------------------------- /handlers/entityHandler.js: -------------------------------------------------------------------------------- 1 | /* global document */ 2 | 3 | import { languages } from '../src/config/config.mjs' 4 | import { messages, langs } from '../src/config/messages.mjs' 5 | import { replyWithPhoto, replyWithMediaGroup } from '../src/config/methods.mjs' 6 | 7 | const langsConfig = Object.keys(languages).reduce((result, key) => { 8 | const { ace_mode: lang, aliases = [], extensions = [] } = languages[key]; 9 | 10 | [...aliases, ...extensions].forEach((name) => { 11 | result[name] = lang 12 | }) 13 | 14 | return result 15 | }, {}) 16 | 17 | const unindent = (text) => { 18 | const lines = text.split('\n') 19 | const counts = lines 20 | .filter(Boolean) 21 | .map((line) => line.match(/^\s*/)[0].length) 22 | const min = Math.min(...counts) 23 | const re = new RegExp(`\\s{${min}}`) 24 | 25 | return lines.map((line) => line.replace(re, '')).join('\n') 26 | } 27 | 28 | export default (browser) => [ 29 | ({ type }) => type === 'pre', 30 | async (ctx) => { 31 | const entities = ctx.message.entities || [] 32 | const images = await Promise.all(entities 33 | .filter(({ type }) => type === 'pre') 34 | .map(async (entity) => { 35 | let lang 36 | let full 37 | let source = ctx.message.text.slice( 38 | entity.offset, 39 | entity.offset + entity.length 40 | ) 41 | const match = source.match(/^(\w+)\s+?\n/) 42 | const themeSlug = ctx.state && ctx.state.user 43 | ? ctx.state.user.theme 44 | : 'Atom One Dark' 45 | 46 | if (match && match[1] && (langs.includes(match[1]) || match[1] === 'js')) { 47 | [full, lang] = match 48 | if (langsConfig[lang]) { 49 | lang = langsConfig[lang] 50 | lang = lang === 'c_cpp' ? 'cpp' : lang 51 | } 52 | source = source.replace(new RegExp(full, 'i'), '') 53 | } else { 54 | lang = 'auto' 55 | source = source.replace(new RegExp('^\\n', 'i'), '') 56 | } 57 | 58 | const html = messages.getHtml( 59 | unindent(source), 60 | themeSlug, 61 | lang !== 'auto' && lang 62 | ) 63 | const page = await browser.newPage() 64 | 65 | await page.evaluate((markup) => { 66 | document.write(markup) 67 | }, html) 68 | const code = await page.$('#code') 69 | const buffer = await code.screenshot() 70 | 71 | await page.close() 72 | return buffer 73 | }) || []) 74 | 75 | if (images.length === 0) { 76 | return 77 | } 78 | if (images.length === 1) { 79 | replyWithPhoto(ctx, images[0]) 80 | return 81 | } 82 | replyWithMediaGroup(ctx, images) 83 | }, 84 | ] 85 | -------------------------------------------------------------------------------- /handlers/index.js: -------------------------------------------------------------------------------- 1 | export { default as langsCommand } from './langsCommand.js' 2 | export { default as removeAction } from './removeAction.js' 3 | export { default as startCommand } from './startCommand.js' 4 | export { default as themeCommand } from './themeCommand.js' 5 | export { default as entityHandler } from './entityHandler.js' 6 | -------------------------------------------------------------------------------- /handlers/langsCommand.js: -------------------------------------------------------------------------------- 1 | import { debug, sleep } from '../helpers/index.js' 2 | import { messages } from '../src/config/messages.mjs' 3 | 4 | const { MESSAGES_TIMEOUT } = process.env 5 | 6 | export default async (ctx) => { 7 | if (ctx.chat.type === 'private') { 8 | await ctx.replyWithMarkdown(messages.langsList()).catch(debug) 9 | return 10 | } 11 | const message = await ctx.replyWithMarkdown(messages.themeGroup) 12 | .catch(debug) 13 | 14 | await sleep(MESSAGES_TIMEOUT) 15 | ctx.deleteMessage(message.message_id) 16 | } 17 | -------------------------------------------------------------------------------- /handlers/removeAction.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Handle remove action. 3 | */ 4 | export default () => [/^remove::(\d+)(?:::([\d|]+))?$/, async (ctx) => { 5 | ctx.answerCbQuery() 6 | if (Number(ctx.match[1]) === ctx.update.callback_query.from.id) { 7 | if (ctx.match[2]) { 8 | ctx.match[2].split('|').forEach((id) => { 9 | ctx.telegram.deleteMessage( 10 | ctx.update.callback_query.message.chat.id, 11 | Number(id) 12 | ) 13 | }) 14 | } 15 | await ctx.telegram.deleteMessage( 16 | ctx.update.callback_query.message.chat.id, 17 | ctx.update.callback_query.message.message_id 18 | ) 19 | ctx.answerCbQuery(`Message${ctx.match[2] ? 's' : ''} removed.`) 20 | return 21 | } 22 | ctx.answerCbQuery('Sorry. Only author and admins are allowed to remove messages!') 23 | }] 24 | -------------------------------------------------------------------------------- /handlers/startCommand.js: -------------------------------------------------------------------------------- 1 | import Telegraf from 'telegraf' 2 | 3 | import { debug, sleep } from '../helpers/index.js' 4 | import { messages } from '../src/config/messages.mjs' 5 | 6 | const { Markup } = Telegraf 7 | const { MESSAGES_TIMEOUT } = process.env 8 | 9 | export default async (ctx) => { 10 | // ctx.reply('fix') 11 | if (ctx.chat.type === 'private') { 12 | await ctx.replyWithMarkdown( 13 | messages.welcomeUser(ctx.state.user || ctx.from), 14 | { ...Markup.removeKeyboard().extra(), disable_web_page_preview: true } 15 | ).catch(debug) 16 | return 17 | } 18 | const message = await ctx.replyWithMarkdown( 19 | messages.themeGroup, 20 | { ...Markup.removeKeyboard().extra(), disable_web_page_preview: true } 21 | ).catch(debug) 22 | 23 | await sleep(MESSAGES_TIMEOUT) 24 | ctx.deleteMessage(message.message_id) 25 | } 26 | -------------------------------------------------------------------------------- /handlers/themeCommand.js: -------------------------------------------------------------------------------- 1 | import Telegraf from 'telegraf' 2 | 3 | import { debug, sleep } from '../helpers/index.js' 4 | import { messages, themes } from '../src/config/messages.mjs' 5 | 6 | const { Markup } = Telegraf 7 | const { MESSAGES_TIMEOUT } = process.env 8 | 9 | export default async (ctx) => { 10 | // ctx.reply('fix') 11 | if (ctx.chat.type === 'private') { 12 | await ctx.replyWithMarkdown( 13 | messages.themeChoose(ctx.state.user ? ctx.state.user.theme : {}), 14 | Markup.keyboard(messages.themesKeyboard(themes)) 15 | .oneTime() 16 | .resize() 17 | .extra() 18 | ).catch(debug) 19 | return 20 | } 21 | const message = await ctx.replyWithMarkdown(messages.themeGroup) 22 | .catch(debug) 23 | 24 | await sleep(MESSAGES_TIMEOUT) 25 | ctx.deleteMessage(message.message_id) 26 | } 27 | -------------------------------------------------------------------------------- /helpers/debug.js: -------------------------------------------------------------------------------- 1 | import { inspect } from 'util' 2 | 3 | export default (data) => console.log(inspect(data, { 4 | colors: true, 5 | showHidden: true, 6 | depth: Infinity, 7 | })) 8 | -------------------------------------------------------------------------------- /helpers/index.js: -------------------------------------------------------------------------------- 1 | export { default as debug } from './debug.js' 2 | export { default as sleep } from './sleep.js' 3 | -------------------------------------------------------------------------------- /helpers/sleep.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Sleep pause. 3 | * 4 | * @param {Number} time The time in milliseconds. 5 | * @return {Promise} 6 | */ 7 | export default (time) => new Promise((resolve) => { 8 | setTimeout(resolve, time) 9 | }) 10 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | import Knex from 'knex' 2 | import dotenv from 'dotenv' 3 | import Telegraf from 'telegraf' 4 | import puppeteer from 'puppeteer' 5 | 6 | import dbConfig from './knexfile.js' 7 | import { 8 | langsCommand, 9 | removeAction, 10 | startCommand, 11 | themeCommand, 12 | entityHandler, 13 | } from './handlers/index.js' 14 | 15 | dotenv.load() 16 | 17 | const { NODE_ENV, BOT_USER, BOT_TOKEN } = process.env 18 | const knex = Knex(dbConfig[NODE_ENV]) 19 | 20 | /** 21 | * Gets the property value. 22 | * 23 | * @param {ElementHandle|JSHandle} el Element 24 | * @param {String} propName The property name 25 | * @return {String} The property value. 26 | */ 27 | const getPropertyValue = async (el, propName) => { 28 | const prop = await el.getProperty(propName) 29 | const value = await prop.jsonValue() 30 | 31 | return value 32 | } 33 | 34 | /** 35 | * Run main programm 36 | */ 37 | const run = async () => { 38 | const browser = await puppeteer.launch({ 39 | headless: true, 40 | args: [ 41 | '--no-sandbox', 42 | '--disable-setuid-sandbox', 43 | ], 44 | }) 45 | const bot = new Telegraf(BOT_TOKEN, { username: BOT_USER }) 46 | 47 | bot.context.db = knex 48 | 49 | bot.command('/start', startCommand) 50 | bot.command('/start@cris_highlight_bot', startCommand) 51 | bot.command('/langs', langsCommand) 52 | bot.command('/langs@cris_highlight_bot', langsCommand) 53 | bot.command('/theme', themeCommand) 54 | bot.command('/theme@cris_highlight_bot', themeCommand) 55 | bot.entity(...entityHandler(browser)) 56 | bot.action(...removeAction()) 57 | 58 | bot.launch() 59 | } 60 | 61 | run() 62 | -------------------------------------------------------------------------------- /knexfile.js: -------------------------------------------------------------------------------- 1 | import dotenv from 'dotenv' 2 | 3 | dotenv.load() 4 | 5 | const { 6 | DB_DRIVER, DB_DATABASE, DB_USER, DB_PASSWORD, DB_CHARSET, 7 | } = process.env 8 | 9 | const config = { 10 | client: DB_DRIVER, 11 | connection: { 12 | database: DB_DATABASE, 13 | user: DB_USER, 14 | password: DB_PASSWORD, 15 | charset: DB_CHARSET, 16 | }, 17 | pool: { 18 | min: 2, 19 | max: 10, 20 | }, 21 | migrations: { 22 | tableName: 'migrations', 23 | }, 24 | } 25 | 26 | export default { 27 | staging: config, 28 | production: config, 29 | development: config, 30 | } 31 | -------------------------------------------------------------------------------- /migrations/20171126121307_create_users_table.js: -------------------------------------------------------------------------------- 1 | exports.up = async (knex, Promise) => (await knex.schema.hasTable('users')) 2 | ? null 3 | : knex.schema.createTable('users', (table) => { 4 | table.integer('id').unsigned() 5 | table.boolean('is_bot') 6 | table.string('first_name') 7 | table.string('last_name') 8 | table.string('username') 9 | table.string('language_code') 10 | table.string('theme', 40) 11 | table.timestamp('created_at').defaultTo(knex.fn.now()) 12 | table.timestamp('updated_at') 13 | 14 | table.primary('id') 15 | }) 16 | 17 | exports.down = async (knex, Promise) => (await knex.schema.hasTable('users')) 18 | ? knex.schema.dropTable('users') 19 | : null 20 | -------------------------------------------------------------------------------- /migrations/20171126121343_create_chats_table.js: -------------------------------------------------------------------------------- 1 | exports.up = async (knex, Promise) => (await knex.schema.hasTable('chats')) 2 | ? null 3 | : knex.schema.createTable('chats', (table) => { 4 | table.bigInteger('id').unique() 5 | table.string('title', 255).unique() 6 | table.string('type', 40) 7 | table.boolean('active') 8 | table.timestamps(['created_at', 'updated_at']) 9 | 10 | table.primary('id') 11 | }) 12 | 13 | exports.down = async (knex, Promise) => (await knex.schema.hasTable('chats')) 14 | ? knex.schema.dropTable('chats') 15 | : null 16 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "syntaxhighlightbot", 3 | "version": "2.0.0-001-alpha", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "migrate": "npm run migrate:up", 9 | "migrate:up": "knex migrate:latest", 10 | "migrate:down": "knex migrate:rollback", 11 | "migrate:refresh": "knex migrate:rollback && knex migrate:latest", 12 | "lint": "eslint --ext .js,.mjs .", 13 | "dev": "nodemon -V index.js", 14 | "watch": "nodemon -e js,mjs,json -w . -V index.js", 15 | "preinstall": "npx npm-force-resolutions" 16 | }, 17 | "author": "Denis Efremov ", 18 | "repository": { 19 | "type": "git", 20 | "url": "https://github.com/Piterden/syntax-highlighter-bot.git" 21 | }, 22 | "license": "MIT", 23 | "dependencies": { 24 | "@pm2/io": "^3.1.1", 25 | "dotenv": "^6.0.0", 26 | "graceful-fs": "^4.2.3", 27 | "highlight.js": "^10.4.1", 28 | "knex": "^0.20.1", 29 | "language-classifier": "0.0.1", 30 | "mysql2": "^2.1.0", 31 | "nodemon": "^2.0.2", 32 | "prismjs": "^1.25.0", 33 | "puppeteer": "^2.1.1", 34 | "telegraf": "^3.34.1", 35 | "yaml": "^1.7.2" 36 | }, 37 | "devDependencies": { 38 | "@atomix/eslint-config": "^7.1.0", 39 | "eslint": "^5.16.0", 40 | "eslint-config-node": "^4.0.0", 41 | "eslint-config-standard": "^11.0.0", 42 | "eslint-plugin-node": "^9.2.0", 43 | "eslint-plugin-promise": "^4.2.1", 44 | "eslint-plugin-standard": "^3.1.0", 45 | "eslint-plugin-unicorn": "^7.1.0", 46 | "husky": "^3.1.0", 47 | "prettier": "^1.19.1" 48 | }, 49 | "husky": { 50 | "hooks": { 51 | "pre-push": "npm run lint" 52 | } 53 | }, 54 | "type": "module", 55 | "resolutions": { 56 | "graceful-fs": "4.2.3" 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/bot.mjs: -------------------------------------------------------------------------------- 1 | // import Knex from 'knex' 2 | // import webshot from 'webshot' 3 | // import Telegraf from 'telegraf' 4 | // import Markup from 'telegraf/markup' 5 | 6 | // import dbConfig from '../knexfile' 7 | // import { webshotOptions, languages } from './config/config' 8 | // import { messages, themes, langs } from './config/messages' 9 | // import { 10 | // getPath, getUserPath, getThemeSlug, getThemeName, getImageFileName, 11 | // isExisted, getFileURL, isPrivateChat, chatUser, themesKeyboard, 12 | // replyWithPhoto, replyWithMediaGroup, onError, getWebShot, 13 | // } from './config/methods' 14 | 15 | // import Server from './server' 16 | 17 | // import UserModel from './model/User/user-model' 18 | // import ChatModel from './model/Chat/chat-model' 19 | // // import ChunkModel from './model/Chunk/chunk-model' 20 | 21 | // // const knex = Knex(dbConfig[ENV.NODE_ENV]) 22 | 23 | // ChatModel.knex(knex) 24 | // UserModel.knex(knex) 25 | // // ChunkModel.knex(knex) 26 | 27 | // // const server = new Server(new Telegraf(ENV.BOT_TOKEN, { 28 | // // telegram: { webhookReply: true }, 29 | // // })) 30 | 31 | // const langsConfig = Object.keys(languages).reduce((result, key) => { 32 | // const { ace_mode: lang, aliases = [], extensions = [] } = languages[key]; 33 | 34 | // [...aliases, ...extensions].forEach((name) => { 35 | // result[name] = lang 36 | // }) 37 | 38 | // return result 39 | // }, {}) 40 | 41 | // /** 42 | // * Log middleware 43 | // */ 44 | // // server.bot.use((ctx, next) => { 45 | // // const start = Date.now() 46 | 47 | // // return next(ctx).then(() => { 48 | // // console.log(` 49 | // // ${JSON.stringify(ctx.update, null, ' ')} 50 | // // ---------------------------------------- 51 | // // Response time ${Date.now() - start}ms 52 | // // ========================================`) 53 | // // }) 54 | // // }) 55 | 56 | // // const trimLines = (code) => { 57 | // // const starts = code.replace(/\t/g, ' ').match(/\n +/g) 58 | // // const trimLength = Math.min(...starts.map((start) => start.match(/ /g).length)) 59 | 60 | // // return code.replace(new RegExp(`(?<=\\n) {${trimLength}}`, 'g'), '') 61 | // // } 62 | 63 | // /** 64 | // * User middleware 65 | // */ 66 | // server.bot.use((ctx, next) => ctx.state.user 67 | // ? next(ctx) 68 | // : UserModel.store(ctx, next)) 69 | 70 | // /** 71 | // * Start bot command 72 | // */ 73 | // const startCommand = async (ctx) => { 74 | // ctx.reply('fix') 75 | // if (isPrivateChat(ctx)) { 76 | // await ctx.replyWithMarkdown( 77 | // messages.welcomeUser(ctx.state.user || chatUser(ctx)), 78 | // { ...Markup.removeKeyboard().extra(), disable_web_page_preview: true } 79 | // ) 80 | // return 81 | // } 82 | // const message = await ctx.replyWithMarkdown( 83 | // messages.themeGroup, 84 | // { ...Markup.removeKeyboard().extra(), disable_web_page_preview: true } 85 | // ) 86 | 87 | // setTimeout(() => { 88 | // ctx.deleteMessage(message.message_id) 89 | // }, 10000) 90 | // } 91 | 92 | // server.bot.command('/start', startCommand) 93 | // server.bot.command('/start@cris_highlight_bot', startCommand) 94 | 95 | // /** 96 | // * Show languages list 97 | // */ 98 | // const langsCommand = async (ctx) => { 99 | // ctx.reply('fix') 100 | // if (isPrivateChat(ctx)) { 101 | // await ctx.replyWithMarkdown(messages.langsList()) 102 | // return 103 | // } 104 | // const message = await ctx.replyWithMarkdown(messages.themeGroup) 105 | 106 | // setTimeout(() => { 107 | // ctx.deleteMessage(message.message_id) 108 | // }, 10000) 109 | // } 110 | 111 | // server.bot.command('/langs', langsCommand) 112 | // server.bot.command('/langs@cris_highlight_bot', langsCommand) 113 | 114 | // /** 115 | // * Show themes list 116 | // */ 117 | // const themeCommand = async (ctx) => { 118 | // ctx.reply('fix') 119 | // if (isPrivateChat(ctx)) { 120 | // await ctx.replyWithMarkdown( 121 | // messages.themeChoose(ctx.state.user.theme), 122 | // Markup.keyboard(themesKeyboard(themes)).oneTime().resize().extra() 123 | // ) 124 | // return 125 | // } 126 | // const message = await ctx.replyWithMarkdown(messages.themeGroup) 127 | 128 | // setTimeout(() => { 129 | // ctx.deleteMessage(message.message_id) 130 | // }, 10000) 131 | // } 132 | 133 | // server.bot.command('/theme', themeCommand) 134 | // server.bot.command('/theme@cris_highlight_bot', themeCommand) 135 | 136 | // /** 137 | // * Theme choose command 138 | // */ 139 | // server.bot.hears(/^🎨 (.+)/, (ctx) => { 140 | // if (!isPrivateChat(ctx)) { 141 | // return 142 | // } 143 | 144 | // const themeSlug = getThemeSlug(ctx.match[1]) 145 | // const themeName = getThemeName(themeSlug) 146 | 147 | // if (!themes.includes(themeSlug)) { 148 | // return 149 | // } 150 | 151 | // const body = messages.demoCode(themeName) 152 | // const filePath = getPath(getImageFileName(body, themeSlug)) 153 | 154 | // webshot(messages.getHtml(body, themeSlug), filePath, webshotOptions, (err) => { 155 | // if (err) { 156 | // return console.log(err) 157 | // } 158 | 159 | // const button = Markup.callbackButton( 160 | // `Apply ${themeName} theme`, 161 | // `/apply/${themeSlug}` 162 | // ) 163 | 164 | // ctx.replyWithChatAction('upload_photo') 165 | 166 | // return ctx.replyWithPhoto( 167 | // { url: getFileURL(filePath) }, 168 | // Markup.inlineKeyboard([button]).extra() 169 | // ) 170 | // }) 171 | // }) 172 | 173 | // /** 174 | // * Save theme 175 | // */ 176 | // server.bot.action(/^\/apply\/(.+)$/, (ctx) => UserModel.applyTheme( 177 | // chatUser(ctx), 178 | // getThemeName(ctx.match[1]), 179 | // (user) => { 180 | // ctx.answerCbQuery() 181 | // ctx.replyWithMarkdown( 182 | // messages.themeChanged(user), 183 | // Markup.removeKeyboard().extra() 184 | // ) 185 | // } 186 | // )) 187 | 188 | // /** 189 | // * Catch code message 190 | // */ 191 | // server.bot.entity(({ type }) => type === 'pre', async (ctx) => { 192 | // const images = await Promise.all(ctx.message.entities 193 | // .filter(({ type }) => type === 'pre') 194 | // .map(async (entity) => { 195 | // let lang 196 | // let full 197 | // let source = ctx.message.text.slice(entity.offset, entity.offset + entity.length) 198 | // const match = source.match(/^(\w+)\n/) 199 | // const themeSlug = ctx.state && ctx.state.user 200 | // ? ctx.state.user.theme 201 | // : 'Atom One Dark' 202 | 203 | // if (match && match[1] && (langs.includes(match[1]) || match[1] === 'js')) { 204 | // [full, lang] = match 205 | // if (langsConfig[lang]) { 206 | // lang = langsConfig[lang] 207 | // } 208 | // source = source.replace(new RegExp(full, 'i'), '') 209 | // } else { 210 | // lang = 'auto' 211 | // source = source.replace(new RegExp('^\\n', 'i'), '') 212 | // } 213 | 214 | // const html = messages.getHtml( 215 | // /* trimLines( */source.trim()/* ) */, 216 | // themeSlug, 217 | // lang !== 'auto' && lang 218 | // ) 219 | // const filename = getImageFileName(html, themeSlug) 220 | // let imagePath = getUserPath(ctx, filename) 221 | 222 | // // await ChunkModel.store({ 223 | // // userId: ctx.state && Number(ctx.state.user.id), 224 | // // chatId: Number(ctx.chat.id), 225 | // // filename, 226 | // // lang, 227 | // // source, 228 | // // }) 229 | 230 | // if (!isExisted(imagePath)) { 231 | // imagePath = await getWebShot(html, imagePath, webshotOptions) 232 | // .catch(console.log) 233 | // } 234 | 235 | // return imagePath 236 | // })) 237 | 238 | // if (images.length === 0) { 239 | // return 240 | // } 241 | // if (images.length === 1) { 242 | // replyWithPhoto(ctx, images[0]) 243 | // return 244 | // } 245 | // replyWithMediaGroup(ctx, images) 246 | // }) 247 | 248 | // /** 249 | // * Handle remove action. 250 | // */ 251 | // server.bot.action(/^remove::(\d+)(?:::([\d|]+))?$/, async (ctx) => { 252 | // ctx.answerCbQuery() 253 | // if (Number(ctx.match[1]) === ctx.update.callback_query.from.id) { 254 | // if (ctx.match[2]) { 255 | // ctx.match[2].split('|').forEach((id) => { 256 | // ctx.telegram.deleteMessage( 257 | // ctx.update.callback_query.message.chat.id, 258 | // Number(id) 259 | // ) 260 | // }) 261 | // } 262 | // await ctx.telegram.deleteMessage( 263 | // ctx.update.callback_query.message.chat.id, 264 | // ctx.update.callback_query.message.message_id 265 | // ) 266 | // ctx.answerCbQuery(`Message${ctx.match[2] ? 's' : ''} removed.`) 267 | // return 268 | // } 269 | // ctx.answerCbQuery('Sorry. Only author and admins are allowed to remove messages!') 270 | // }) 271 | 272 | // /** 273 | // * Bot was added to a group 274 | // */ 275 | // server.bot.on(['new_chat_members'], async (ctx) => { 276 | // if (ctx.message.new_chat_member.username === ENV.BOT_USER) { 277 | // const chat = await ChatModel.query() 278 | // .findById(Number(ctx.chat.id)) 279 | // .catch(onError) 280 | 281 | // if (chat) { 282 | // await ChatModel.query() 283 | // .patchAndFetchById(Number(chat.id), { active: true }) 284 | // .catch(onError) 285 | // } else { 286 | // const { id, title, type } = ctx.chat 287 | 288 | // await ChatModel.query() 289 | // .insert({ id: Number(id), title, type, active: true }) 290 | // .catch(onError) 291 | // } 292 | // } 293 | // }) 294 | 295 | // /** 296 | // * Bot was removed from group 297 | // */ 298 | // server.bot.on(['left_chat_member'], async (ctx) => { 299 | // if (ctx.message.left_chat_member.username === ENV.BOT_USER) { 300 | // await ChatModel.query() 301 | // .patchAndFetchById(Number(ctx.chat.id), { active: false }) 302 | // .catch(onError) 303 | // } 304 | // }) 305 | 306 | // /** 307 | // * Inline query 308 | // */ 309 | // // server.bot.on('inline_query', (ctx) => { 310 | // // let code = ctx.update.inline_query.query 311 | // // const match = code.match(/^(\w+)\n/) 312 | // // let lang = match && match[1] 313 | // // const theme = ctx.state && ctx.state.user ? ctx.state.user.theme : 'github' 314 | 315 | // // clearFolder(ctx.state && ctx.state.user) 316 | 317 | // // if (match && langs.includes(lang)) { 318 | // // code = code.replace(new RegExp(match[0], 'i'), '') 319 | // // } 320 | // // else { 321 | // // lang = undefined 322 | // // } 323 | 324 | // // const html = messages.getHtml(code, theme, lang) 325 | // // const imagePath = getUserPath(ctx, getImageFileName(html, theme)) 326 | 327 | // // if (isExisted(imagePath)) { 328 | // // return ctx.answerInlineQuery([getPhotoData(imagePath)]) 329 | // // } 330 | 331 | // // // console.log(html, imagePath, webshotOptions) 332 | 333 | // // return webshot(html, imagePath, webshotOptions, (err) => { 334 | // // if (err) return console.log(err) 335 | 336 | // // return ctx.answerInlineQuery([getPhotoData(imagePath.replace( 337 | // // '/home/dev812/web/syntax-highlighter-bot/images/', 338 | // // '' 339 | // // ))]) 340 | // // }) 341 | // // }) 342 | // // ctx.telegram.answerInlineQuery(ctx.inlineQuery.id, result) 343 | -------------------------------------------------------------------------------- /src/config/config.mjs: -------------------------------------------------------------------------------- 1 | import fs from 'graceful-fs' 2 | import path from 'path' 3 | import YAML from 'yaml' 4 | 5 | const { WEBHOOK_DOMAIN, WEBHOOK_PORT, WEBHOOK_KEY, WEBHOOK_CERT } = process.env 6 | 7 | export const languages = YAML.parse(fs.readFileSync( 8 | path.resolve('src/config/languages.yml'), 9 | 'utf8', 10 | )) 11 | 12 | export const tlsOptions = { 13 | key: fs.readFileSync(path.resolve(WEBHOOK_KEY)), 14 | cert: fs.readFileSync(path.resolve(WEBHOOK_CERT)), 15 | } 16 | 17 | export const webshotOptions = { 18 | streamType: 'png', 19 | siteType: 'html', 20 | captureSelector: '#code', 21 | quality: 100, 22 | shotSize: { width: 'all', height: 'all' }, 23 | // windowSize: { width: 1920, height: 1080 }, 24 | // phantomPath: path.resolve('node_modules/phantomjs/lib/phantom/bin/phantomjs'), 25 | phantomConfig: { 'ssl-protocol': 'any', 'ignore-ssl-errors': 'true' }, 26 | takeShotOnCallback: true, 27 | } 28 | 29 | export const url = `https://${WEBHOOK_DOMAIN}:${WEBHOOK_PORT}/` 30 | -------------------------------------------------------------------------------- /src/config/languages.yml: -------------------------------------------------------------------------------- 1 | # Defines all Languages known to GitHub. 2 | # 3 | # fs_name - Optional field. Only necessary as a replacement for the sample directory name if the 4 | # language name is not a valid filename under the Windows filesystem (e.g., if it 5 | # contains an asterisk). 6 | # type - Either data, programming, markup, prose, or nil 7 | # aliases - An Array of additional aliases (implicitly 8 | # includes name.downcase) 9 | # ace_mode - A String name of the Ace Mode used for highlighting whenever 10 | # a file is edited. This must match one of the filenames in http://git.io/3XO_Cg. 11 | # Use "text" if a mode does not exist. 12 | # codemirror_mode - A String name of the CodeMirror Mode used for highlighting whenever a file is edited. 13 | # This must match a mode from https://git.io/vi9Fx 14 | # codemirror_mime_type - A String name of the file mime type used for highlighting whenever a file is edited. 15 | # This should match the `mime` associated with the mode from https://git.io/f4SoQ 16 | # wrap - Boolean wrap to enable line wrapping (default: false) 17 | # extensions - An Array of associated extensions (the first one is 18 | # considered the primary extension, the others should be 19 | # listed alphabetically) 20 | # filenames - An Array of filenames commonly associated with the language 21 | # interpreters - An Array of associated interpreters 22 | # searchable - Boolean flag to enable searching (defaults to true) 23 | # language_id - Integer used as a language-name-independent indexed field so that we can rename 24 | # languages in Linguist without reindexing all the code on GitHub. Must not be 25 | # changed for existing languages without the explicit permission of GitHub staff. 26 | # color - CSS hex color to represent the language. Only used if type is "programming" or "markup". 27 | # tm_scope - The TextMate scope that represents this programming 28 | # language. This should match one of the scopes listed in 29 | # the grammars.yml file. Use "none" if there is no grammar 30 | # for this language. 31 | # group - Name of the parent language. Languages in a group are counted 32 | # in the statistics as the parent language. 33 | # 34 | # Any additions or modifications (even trivial) should have corresponding 35 | # test changes in `test/test_blob.rb`. 36 | # 37 | # Please keep this list alphabetized. Capitalization comes before lowercase. 38 | 39 | --- 40 | 1C Enterprise: 41 | type: programming 42 | color: "#814CCC" 43 | extensions: 44 | - ".bsl" 45 | - ".os" 46 | tm_scope: source.bsl 47 | ace_mode: text 48 | language_id: 0 49 | ABAP: 50 | type: programming 51 | color: "#E8274B" 52 | extensions: 53 | - ".abap" 54 | ace_mode: abap 55 | language_id: 1 56 | ABNF: 57 | type: data 58 | ace_mode: text 59 | extensions: 60 | - ".abnf" 61 | tm_scope: source.abnf 62 | language_id: 429 63 | AGS Script: 64 | type: programming 65 | color: "#B9D9FF" 66 | aliases: 67 | - ags 68 | extensions: 69 | - ".asc" 70 | - ".ash" 71 | tm_scope: source.c++ 72 | ace_mode: c_cpp 73 | codemirror_mode: clike 74 | codemirror_mime_type: text/x-c++src 75 | language_id: 2 76 | AMPL: 77 | type: programming 78 | color: "#E6EFBB" 79 | extensions: 80 | - ".ampl" 81 | - ".mod" 82 | tm_scope: source.ampl 83 | ace_mode: text 84 | language_id: 3 85 | ANTLR: 86 | type: programming 87 | color: "#9DC3FF" 88 | extensions: 89 | - ".g4" 90 | ace_mode: text 91 | language_id: 4 92 | API Blueprint: 93 | type: markup 94 | color: "#2ACCA8" 95 | ace_mode: markdown 96 | extensions: 97 | - ".apib" 98 | tm_scope: text.html.markdown.source.gfm.apib 99 | language_id: 5 100 | APL: 101 | type: programming 102 | color: "#5A8164" 103 | extensions: 104 | - ".apl" 105 | - ".dyalog" 106 | interpreters: 107 | - apl 108 | - aplx 109 | - dyalog 110 | tm_scope: source.apl 111 | ace_mode: text 112 | codemirror_mode: apl 113 | codemirror_mime_type: text/apl 114 | language_id: 6 115 | ASN.1: 116 | type: data 117 | extensions: 118 | - ".asn" 119 | - ".asn1" 120 | tm_scope: source.asn 121 | ace_mode: text 122 | codemirror_mode: asn.1 123 | codemirror_mime_type: text/x-ttcn-asn 124 | language_id: 7 125 | ASP: 126 | type: programming 127 | color: "#6a40fd" 128 | tm_scope: text.html.asp 129 | aliases: 130 | - aspx 131 | - aspx-vb 132 | extensions: 133 | - ".asp" 134 | - ".asax" 135 | - ".ascx" 136 | - ".ashx" 137 | - ".asmx" 138 | - ".aspx" 139 | - ".axd" 140 | ace_mode: text 141 | codemirror_mode: htmlembedded 142 | codemirror_mime_type: application/x-aspx 143 | language_id: 8 144 | ATS: 145 | type: programming 146 | color: "#1ac620" 147 | aliases: 148 | - ats2 149 | extensions: 150 | - ".dats" 151 | - ".hats" 152 | - ".sats" 153 | tm_scope: source.ats 154 | ace_mode: ocaml 155 | language_id: 9 156 | ActionScript: 157 | type: programming 158 | tm_scope: source.actionscript.3 159 | color: "#882B0F" 160 | aliases: 161 | - actionscript 3 162 | - actionscript3 163 | - as3 164 | extensions: 165 | - ".as" 166 | ace_mode: actionscript 167 | language_id: 10 168 | Ada: 169 | type: programming 170 | color: "#02f88c" 171 | extensions: 172 | - ".adb" 173 | - ".ada" 174 | - ".ads" 175 | aliases: 176 | - ada95 177 | - ada2005 178 | ace_mode: ada 179 | language_id: 11 180 | Adobe Font Metrics: 181 | type: data 182 | tm_scope: source.afm 183 | extensions: 184 | - ".afm" 185 | aliases: 186 | - acfm 187 | - adobe composite font metrics 188 | - adobe multiple font metrics 189 | - amfm 190 | ace_mode: text 191 | language_id: 147198098 192 | Agda: 193 | type: programming 194 | color: "#315665" 195 | extensions: 196 | - ".agda" 197 | ace_mode: text 198 | language_id: 12 199 | Alloy: 200 | type: programming 201 | color: "#64C800" 202 | extensions: 203 | - ".als" 204 | ace_mode: text 205 | language_id: 13 206 | Alpine Abuild: 207 | type: programming 208 | group: Shell 209 | aliases: 210 | - abuild 211 | - apkbuild 212 | filenames: 213 | - APKBUILD 214 | tm_scope: source.shell 215 | ace_mode: sh 216 | codemirror_mode: shell 217 | codemirror_mime_type: text/x-sh 218 | language_id: 14 219 | Altium Designer: 220 | type: data 221 | aliases: 222 | - altium 223 | extensions: 224 | - ".OutJob" 225 | - ".PcbDoc" 226 | - ".PrjPCB" 227 | - ".SchDoc" 228 | tm_scope: source.ini 229 | ace_mode: ini 230 | language_id: 187772328 231 | AngelScript: 232 | type: programming 233 | color: "#C7D7DC" 234 | extensions: 235 | - ".as" 236 | - ".angelscript" 237 | tm_scope: source.angelscript 238 | ace_mode: text 239 | codemirror_mode: clike 240 | codemirror_mime_type: text/x-c++src 241 | language_id: 389477596 242 | Ant Build System: 243 | type: data 244 | tm_scope: text.xml.ant 245 | filenames: 246 | - ant.xml 247 | - build.xml 248 | ace_mode: xml 249 | codemirror_mode: xml 250 | codemirror_mime_type: application/xml 251 | language_id: 15 252 | ApacheConf: 253 | type: data 254 | aliases: 255 | - aconf 256 | - apache 257 | extensions: 258 | - ".apacheconf" 259 | - ".vhost" 260 | filenames: 261 | - ".htaccess" 262 | - apache2.conf 263 | - httpd.conf 264 | tm_scope: source.apache-config 265 | ace_mode: apache_conf 266 | language_id: 16 267 | Apex: 268 | type: programming 269 | extensions: 270 | - ".cls" 271 | tm_scope: source.java 272 | ace_mode: java 273 | codemirror_mode: clike 274 | codemirror_mime_type: text/x-java 275 | language_id: 17 276 | Apollo Guidance Computer: 277 | type: programming 278 | group: Assembly 279 | extensions: 280 | - ".agc" 281 | tm_scope: source.agc 282 | ace_mode: assembly_x86 283 | language_id: 18 284 | AppleScript: 285 | type: programming 286 | aliases: 287 | - osascript 288 | extensions: 289 | - ".applescript" 290 | - ".scpt" 291 | interpreters: 292 | - osascript 293 | ace_mode: applescript 294 | color: "#101F1F" 295 | language_id: 19 296 | Arc: 297 | type: programming 298 | color: "#aa2afe" 299 | extensions: 300 | - ".arc" 301 | tm_scope: none 302 | ace_mode: text 303 | language_id: 20 304 | AsciiDoc: 305 | type: prose 306 | ace_mode: asciidoc 307 | wrap: true 308 | extensions: 309 | - ".asciidoc" 310 | - ".adoc" 311 | - ".asc" 312 | tm_scope: text.html.asciidoc 313 | language_id: 22 314 | AspectJ: 315 | type: programming 316 | color: "#a957b0" 317 | extensions: 318 | - ".aj" 319 | tm_scope: source.aspectj 320 | ace_mode: text 321 | language_id: 23 322 | Assembly: 323 | type: programming 324 | color: "#6E4C13" 325 | aliases: 326 | - asm 327 | - nasm 328 | extensions: 329 | - ".asm" 330 | - ".a51" 331 | - ".inc" 332 | - ".nasm" 333 | tm_scope: source.assembly 334 | ace_mode: assembly_x86 335 | language_id: 24 336 | Asymptote: 337 | type: programming 338 | color: "#4a0c0c" 339 | extensions: 340 | - ".asy" 341 | interpreters: 342 | - asy 343 | tm_scope: source.c++ 344 | ace_mode: c_cpp 345 | codemirror_mode: clike 346 | codemirror_mime_type: text/x-kotlin 347 | language_id: 591605007 348 | Augeas: 349 | type: programming 350 | extensions: 351 | - ".aug" 352 | tm_scope: none 353 | ace_mode: text 354 | language_id: 25 355 | AutoHotkey: 356 | type: programming 357 | color: "#6594b9" 358 | aliases: 359 | - ahk 360 | extensions: 361 | - ".ahk" 362 | - ".ahkl" 363 | tm_scope: source.ahk 364 | ace_mode: autohotkey 365 | language_id: 26 366 | AutoIt: 367 | type: programming 368 | color: "#1C3552" 369 | aliases: 370 | - au3 371 | - AutoIt3 372 | - AutoItScript 373 | extensions: 374 | - ".au3" 375 | tm_scope: source.autoit 376 | ace_mode: autohotkey 377 | language_id: 27 378 | Awk: 379 | type: programming 380 | extensions: 381 | - ".awk" 382 | - ".auk" 383 | - ".gawk" 384 | - ".mawk" 385 | - ".nawk" 386 | interpreters: 387 | - awk 388 | - gawk 389 | - mawk 390 | - nawk 391 | ace_mode: text 392 | language_id: 28 393 | Ballerina: 394 | type: programming 395 | extensions: 396 | - ".bal" 397 | tm_scope: source.ballerina 398 | ace_mode: text 399 | color: "#FF5000" 400 | language_id: 720859680 401 | Batchfile: 402 | type: programming 403 | aliases: 404 | - bat 405 | - batch 406 | - dosbatch 407 | - winbatch 408 | extensions: 409 | - ".bat" 410 | - ".cmd" 411 | tm_scope: source.batchfile 412 | ace_mode: batchfile 413 | color: "#C1F12E" 414 | language_id: 29 415 | Befunge: 416 | type: programming 417 | extensions: 418 | - ".befunge" 419 | ace_mode: text 420 | language_id: 30 421 | BibTeX: 422 | type: markup 423 | group: TeX 424 | extensions: 425 | - ".bib" 426 | tm_scope: text.bibtex 427 | ace_mode: tex 428 | codemirror_mode: stex 429 | codemirror_mime_type: text/x-stex 430 | language_id: 982188347 431 | Bison: 432 | type: programming 433 | group: Yacc 434 | tm_scope: source.bison 435 | extensions: 436 | - ".bison" 437 | ace_mode: text 438 | language_id: 31 439 | BitBake: 440 | type: programming 441 | tm_scope: none 442 | extensions: 443 | - ".bb" 444 | ace_mode: text 445 | language_id: 32 446 | Blade: 447 | type: markup 448 | group: HTML 449 | extensions: 450 | - ".blade" 451 | - ".blade.php" 452 | tm_scope: text.html.php.blade 453 | ace_mode: text 454 | language_id: 33 455 | BlitzBasic: 456 | type: programming 457 | aliases: 458 | - b3d 459 | - blitz3d 460 | - blitzplus 461 | - bplus 462 | extensions: 463 | - ".bb" 464 | - ".decls" 465 | tm_scope: source.blitzmax 466 | ace_mode: text 467 | language_id: 34 468 | BlitzMax: 469 | type: programming 470 | color: "#cd6400" 471 | extensions: 472 | - ".bmx" 473 | aliases: 474 | - bmax 475 | ace_mode: text 476 | language_id: 35 477 | Bluespec: 478 | type: programming 479 | extensions: 480 | - ".bsv" 481 | tm_scope: source.bsv 482 | ace_mode: verilog 483 | language_id: 36 484 | Boo: 485 | type: programming 486 | color: "#d4bec1" 487 | extensions: 488 | - ".boo" 489 | ace_mode: text 490 | tm_scope: source.boo 491 | language_id: 37 492 | Brainfuck: 493 | type: programming 494 | color: "#2F2530" 495 | extensions: 496 | - ".b" 497 | - ".bf" 498 | tm_scope: source.bf 499 | ace_mode: text 500 | codemirror_mode: brainfuck 501 | codemirror_mime_type: text/x-brainfuck 502 | language_id: 38 503 | Brightscript: 504 | type: programming 505 | extensions: 506 | - ".brs" 507 | tm_scope: source.brightscript 508 | ace_mode: text 509 | language_id: 39 510 | C: 511 | type: programming 512 | color: "#555555" 513 | extensions: 514 | - ".c" 515 | - ".cats" 516 | - ".h" 517 | - ".idc" 518 | interpreters: 519 | - tcc 520 | ace_mode: c_cpp 521 | codemirror_mode: clike 522 | codemirror_mime_type: text/x-csrc 523 | language_id: 41 524 | C#: 525 | type: programming 526 | ace_mode: csharp 527 | codemirror_mode: clike 528 | codemirror_mime_type: text/x-csharp 529 | tm_scope: source.cs 530 | color: "#178600" 531 | aliases: 532 | - csharp 533 | extensions: 534 | - ".cs" 535 | - ".cake" 536 | - ".csx" 537 | language_id: 42 538 | C++: 539 | type: programming 540 | ace_mode: c_cpp 541 | codemirror_mode: clike 542 | codemirror_mime_type: text/x-c++src 543 | color: "#f34b7d" 544 | aliases: 545 | - cpp 546 | extensions: 547 | - ".cpp" 548 | - ".c++" 549 | - ".cc" 550 | - ".cp" 551 | - ".cxx" 552 | - ".h" 553 | - ".h++" 554 | - ".hh" 555 | - ".hpp" 556 | - ".hxx" 557 | - ".inc" 558 | - ".inl" 559 | - ".ino" 560 | - ".ipp" 561 | - ".re" 562 | - ".tcc" 563 | - ".tpp" 564 | language_id: 43 565 | C-ObjDump: 566 | type: data 567 | extensions: 568 | - ".c-objdump" 569 | tm_scope: objdump.x86asm 570 | ace_mode: assembly_x86 571 | language_id: 44 572 | C2hs Haskell: 573 | type: programming 574 | group: Haskell 575 | aliases: 576 | - c2hs 577 | extensions: 578 | - ".chs" 579 | tm_scope: source.haskell 580 | ace_mode: haskell 581 | codemirror_mode: haskell 582 | codemirror_mime_type: text/x-haskell 583 | language_id: 45 584 | CLIPS: 585 | type: programming 586 | extensions: 587 | - ".clp" 588 | tm_scope: source.clips 589 | ace_mode: text 590 | language_id: 46 591 | CMake: 592 | type: programming 593 | extensions: 594 | - ".cmake" 595 | - ".cmake.in" 596 | filenames: 597 | - CMakeLists.txt 598 | ace_mode: text 599 | codemirror_mode: cmake 600 | codemirror_mime_type: text/x-cmake 601 | language_id: 47 602 | COBOL: 603 | type: programming 604 | extensions: 605 | - ".cob" 606 | - ".cbl" 607 | - ".ccp" 608 | - ".cobol" 609 | - ".cpy" 610 | ace_mode: cobol 611 | codemirror_mode: cobol 612 | codemirror_mime_type: text/x-cobol 613 | language_id: 48 614 | COLLADA: 615 | type: data 616 | extensions: 617 | - ".dae" 618 | tm_scope: text.xml 619 | ace_mode: xml 620 | codemirror_mode: xml 621 | codemirror_mime_type: text/xml 622 | language_id: 49 623 | CSON: 624 | type: data 625 | tm_scope: source.coffee 626 | ace_mode: coffee 627 | codemirror_mode: coffeescript 628 | codemirror_mime_type: text/x-coffeescript 629 | extensions: 630 | - ".cson" 631 | language_id: 424 632 | CSS: 633 | type: markup 634 | tm_scope: source.css 635 | ace_mode: css 636 | codemirror_mode: css 637 | codemirror_mime_type: text/css 638 | color: "#563d7c" 639 | extensions: 640 | - ".css" 641 | language_id: 50 642 | CSV: 643 | type: data 644 | ace_mode: text 645 | tm_scope: none 646 | extensions: 647 | - ".csv" 648 | language_id: 51 649 | CWeb: 650 | type: programming 651 | extensions: 652 | - ".w" 653 | tm_scope: none 654 | ace_mode: text 655 | language_id: 657332628 656 | Cabal Config: 657 | type: data 658 | aliases: 659 | - Cabal 660 | extensions: 661 | - ".cabal" 662 | filenames: 663 | - cabal.config 664 | - cabal.project 665 | ace_mode: haskell 666 | codemirror_mode: haskell 667 | codemirror_mime_type: text/x-haskell 668 | tm_scope: source.cabal 669 | language_id: 677095381 670 | Cap'n Proto: 671 | type: programming 672 | tm_scope: source.capnp 673 | extensions: 674 | - ".capnp" 675 | ace_mode: text 676 | language_id: 52 677 | CartoCSS: 678 | type: programming 679 | aliases: 680 | - Carto 681 | extensions: 682 | - ".mss" 683 | ace_mode: text 684 | tm_scope: source.css.mss 685 | language_id: 53 686 | Ceylon: 687 | type: programming 688 | color: "#dfa535" 689 | extensions: 690 | - ".ceylon" 691 | tm_scope: source.ceylon 692 | ace_mode: text 693 | language_id: 54 694 | Chapel: 695 | type: programming 696 | color: "#8dc63f" 697 | aliases: 698 | - chpl 699 | extensions: 700 | - ".chpl" 701 | ace_mode: text 702 | language_id: 55 703 | Charity: 704 | type: programming 705 | extensions: 706 | - ".ch" 707 | tm_scope: none 708 | ace_mode: text 709 | language_id: 56 710 | ChucK: 711 | type: programming 712 | extensions: 713 | - ".ck" 714 | tm_scope: source.java 715 | ace_mode: java 716 | codemirror_mode: clike 717 | codemirror_mime_type: text/x-java 718 | language_id: 57 719 | Cirru: 720 | type: programming 721 | color: "#ccccff" 722 | ace_mode: cirru 723 | extensions: 724 | - ".cirru" 725 | language_id: 58 726 | Clarion: 727 | type: programming 728 | color: "#db901e" 729 | ace_mode: text 730 | extensions: 731 | - ".clw" 732 | tm_scope: source.clarion 733 | language_id: 59 734 | Clean: 735 | type: programming 736 | color: "#3F85AF" 737 | extensions: 738 | - ".icl" 739 | - ".dcl" 740 | tm_scope: source.clean 741 | ace_mode: text 742 | language_id: 60 743 | Click: 744 | type: programming 745 | color: "#E4E6F3" 746 | extensions: 747 | - ".click" 748 | tm_scope: source.click 749 | ace_mode: text 750 | language_id: 61 751 | Clojure: 752 | type: programming 753 | ace_mode: clojure 754 | codemirror_mode: clojure 755 | codemirror_mime_type: text/x-clojure 756 | color: "#db5855" 757 | extensions: 758 | - ".clj" 759 | - ".boot" 760 | - ".cl2" 761 | - ".cljc" 762 | - ".cljs" 763 | - ".cljs.hl" 764 | - ".cljscm" 765 | - ".cljx" 766 | - ".hic" 767 | filenames: 768 | - riemann.config 769 | language_id: 62 770 | Closure Templates: 771 | type: markup 772 | group: HTML 773 | ace_mode: soy_template 774 | codemirror_mode: soy 775 | codemirror_mime_type: text/x-soy 776 | aliases: 777 | - soy 778 | extensions: 779 | - ".soy" 780 | tm_scope: text.html.soy 781 | language_id: 357046146 782 | Cloud Firestore Security Rules: 783 | type: data 784 | ace_mode: less 785 | codemirror_mode: css 786 | codemirror_mime_type: text/css 787 | tm_scope: source.firestore 788 | filenames: 789 | - firestore.rules 790 | language_id: 407996372 791 | CoNLL-U: 792 | type: data 793 | extensions: 794 | - ".conllu" 795 | - ".conll" 796 | tm_scope: text.conllu 797 | ace_mode: text 798 | aliases: 799 | - CoNLL 800 | - CoNLL-X 801 | language_id: 421026389 802 | CoffeeScript: 803 | type: programming 804 | tm_scope: source.coffee 805 | ace_mode: coffee 806 | codemirror_mode: coffeescript 807 | codemirror_mime_type: text/x-coffeescript 808 | color: "#244776" 809 | aliases: 810 | - coffee 811 | - coffee-script 812 | extensions: 813 | - ".coffee" 814 | - "._coffee" 815 | - ".cake" 816 | - ".cjsx" 817 | - ".iced" 818 | filenames: 819 | - Cakefile 820 | interpreters: 821 | - coffee 822 | language_id: 63 823 | ColdFusion: 824 | type: programming 825 | ace_mode: coldfusion 826 | color: "#ed2cd6" 827 | aliases: 828 | - cfm 829 | - cfml 830 | - coldfusion html 831 | extensions: 832 | - ".cfm" 833 | - ".cfml" 834 | tm_scope: text.html.cfm 835 | language_id: 64 836 | ColdFusion CFC: 837 | type: programming 838 | group: ColdFusion 839 | ace_mode: coldfusion 840 | aliases: 841 | - cfc 842 | extensions: 843 | - ".cfc" 844 | tm_scope: source.cfscript 845 | language_id: 65 846 | Common Lisp: 847 | type: programming 848 | tm_scope: source.lisp 849 | color: "#3fb68b" 850 | aliases: 851 | - lisp 852 | extensions: 853 | - ".lisp" 854 | - ".asd" 855 | - ".cl" 856 | - ".l" 857 | - ".lsp" 858 | - ".ny" 859 | - ".podsl" 860 | - ".sexp" 861 | interpreters: 862 | - lisp 863 | - sbcl 864 | - ccl 865 | - clisp 866 | - ecl 867 | ace_mode: lisp 868 | codemirror_mode: commonlisp 869 | codemirror_mime_type: text/x-common-lisp 870 | language_id: 66 871 | Common Workflow Language: 872 | aliases: 873 | - cwl 874 | type: programming 875 | ace_mode: yaml 876 | codemirror_mode: yaml 877 | codemirror_mime_type: text/x-yaml 878 | extensions: 879 | - ".cwl" 880 | interpreters: 881 | - cwl-runner 882 | color: "#B5314C" 883 | tm_scope: source.cwl 884 | language_id: 988547172 885 | Component Pascal: 886 | type: programming 887 | color: "#B0CE4E" 888 | extensions: 889 | - ".cp" 890 | - ".cps" 891 | tm_scope: source.pascal 892 | aliases: 893 | - delphi 894 | - objectpascal 895 | ace_mode: pascal 896 | codemirror_mode: pascal 897 | codemirror_mime_type: text/x-pascal 898 | language_id: 67 899 | Cool: 900 | type: programming 901 | extensions: 902 | - ".cl" 903 | tm_scope: source.cool 904 | ace_mode: text 905 | language_id: 68 906 | Coq: 907 | type: programming 908 | extensions: 909 | - ".coq" 910 | - ".v" 911 | ace_mode: text 912 | language_id: 69 913 | Cpp-ObjDump: 914 | type: data 915 | extensions: 916 | - ".cppobjdump" 917 | - ".c++-objdump" 918 | - ".c++objdump" 919 | - ".cpp-objdump" 920 | - ".cxx-objdump" 921 | tm_scope: objdump.x86asm 922 | aliases: 923 | - c++-objdump 924 | ace_mode: assembly_x86 925 | language_id: 70 926 | Creole: 927 | type: prose 928 | wrap: true 929 | extensions: 930 | - ".creole" 931 | tm_scope: text.html.creole 932 | ace_mode: text 933 | language_id: 71 934 | Crystal: 935 | type: programming 936 | color: "#000100" 937 | extensions: 938 | - ".cr" 939 | ace_mode: ruby 940 | codemirror_mode: crystal 941 | codemirror_mime_type: text/x-crystal 942 | tm_scope: source.crystal 943 | interpreters: 944 | - crystal 945 | language_id: 72 946 | Csound: 947 | type: programming 948 | aliases: 949 | - csound-orc 950 | extensions: 951 | - ".orc" 952 | - ".udo" 953 | tm_scope: source.csound 954 | ace_mode: csound_orchestra 955 | language_id: 73 956 | Csound Document: 957 | type: programming 958 | aliases: 959 | - csound-csd 960 | extensions: 961 | - ".csd" 962 | tm_scope: source.csound-document 963 | ace_mode: csound_document 964 | language_id: 74 965 | Csound Score: 966 | type: programming 967 | aliases: 968 | - csound-sco 969 | extensions: 970 | - ".sco" 971 | tm_scope: source.csound-score 972 | ace_mode: csound_score 973 | language_id: 75 974 | Cuda: 975 | type: programming 976 | extensions: 977 | - ".cu" 978 | - ".cuh" 979 | tm_scope: source.cuda-c++ 980 | ace_mode: c_cpp 981 | codemirror_mode: clike 982 | codemirror_mime_type: text/x-c++src 983 | color: "#3A4E3A" 984 | language_id: 77 985 | Cycript: 986 | type: programming 987 | extensions: 988 | - ".cy" 989 | tm_scope: source.js 990 | ace_mode: javascript 991 | codemirror_mode: javascript 992 | codemirror_mime_type: text/javascript 993 | language_id: 78 994 | Cython: 995 | type: programming 996 | group: Python 997 | extensions: 998 | - ".pyx" 999 | - ".pxd" 1000 | - ".pxi" 1001 | aliases: 1002 | - pyrex 1003 | ace_mode: text 1004 | codemirror_mode: python 1005 | codemirror_mime_type: text/x-cython 1006 | language_id: 79 1007 | D: 1008 | type: programming 1009 | color: "#ba595e" 1010 | extensions: 1011 | - ".d" 1012 | - ".di" 1013 | ace_mode: d 1014 | codemirror_mode: d 1015 | codemirror_mime_type: text/x-d 1016 | language_id: 80 1017 | D-ObjDump: 1018 | type: data 1019 | extensions: 1020 | - ".d-objdump" 1021 | tm_scope: objdump.x86asm 1022 | ace_mode: assembly_x86 1023 | language_id: 81 1024 | DIGITAL Command Language: 1025 | type: programming 1026 | aliases: 1027 | - dcl 1028 | extensions: 1029 | - ".com" 1030 | tm_scope: none 1031 | ace_mode: text 1032 | language_id: 82 1033 | DM: 1034 | type: programming 1035 | color: "#447265" 1036 | extensions: 1037 | - ".dm" 1038 | aliases: 1039 | - byond 1040 | tm_scope: source.dm 1041 | ace_mode: c_cpp 1042 | language_id: 83 1043 | DNS Zone: 1044 | type: data 1045 | extensions: 1046 | - ".zone" 1047 | - ".arpa" 1048 | tm_scope: text.zone_file 1049 | ace_mode: text 1050 | language_id: 84 1051 | DTrace: 1052 | type: programming 1053 | aliases: 1054 | - dtrace-script 1055 | extensions: 1056 | - ".d" 1057 | interpreters: 1058 | - dtrace 1059 | tm_scope: source.c 1060 | ace_mode: c_cpp 1061 | codemirror_mode: clike 1062 | codemirror_mime_type: text/x-csrc 1063 | language_id: 85 1064 | Darcs Patch: 1065 | type: data 1066 | aliases: 1067 | - dpatch 1068 | extensions: 1069 | - ".darcspatch" 1070 | - ".dpatch" 1071 | tm_scope: none 1072 | ace_mode: text 1073 | language_id: 86 1074 | Dart: 1075 | type: programming 1076 | color: "#00B4AB" 1077 | extensions: 1078 | - ".dart" 1079 | interpreters: 1080 | - dart 1081 | ace_mode: dart 1082 | codemirror_mode: dart 1083 | codemirror_mime_type: application/dart 1084 | language_id: 87 1085 | DataWeave: 1086 | type: programming 1087 | color: "#003a52" 1088 | extensions: 1089 | - ".dwl" 1090 | ace_mode: text 1091 | tm_scope: source.data-weave 1092 | language_id: 974514097 1093 | Dhall: 1094 | type: programming 1095 | color: "#dfafff" 1096 | extensions: 1097 | - ".dhall" 1098 | tm_scope: source.haskell 1099 | ace_mode: haskell 1100 | codemirror_mode: haskell 1101 | codemirror_mime_type: text/x-haskell 1102 | language_id: 793969321 1103 | Diff: 1104 | type: data 1105 | extensions: 1106 | - ".diff" 1107 | - ".patch" 1108 | aliases: 1109 | - udiff 1110 | tm_scope: source.diff 1111 | ace_mode: diff 1112 | codemirror_mode: diff 1113 | codemirror_mime_type: text/x-diff 1114 | language_id: 88 1115 | Dockerfile: 1116 | type: programming 1117 | color: "#384d54" 1118 | tm_scope: source.dockerfile 1119 | extensions: 1120 | - ".dockerfile" 1121 | filenames: 1122 | - Dockerfile 1123 | ace_mode: dockerfile 1124 | codemirror_mode: dockerfile 1125 | codemirror_mime_type: text/x-dockerfile 1126 | language_id: 89 1127 | Dogescript: 1128 | type: programming 1129 | color: "#cca760" 1130 | extensions: 1131 | - ".djs" 1132 | tm_scope: none 1133 | ace_mode: text 1134 | language_id: 90 1135 | Dylan: 1136 | type: programming 1137 | color: "#6c616e" 1138 | extensions: 1139 | - ".dylan" 1140 | - ".dyl" 1141 | - ".intr" 1142 | - ".lid" 1143 | ace_mode: text 1144 | codemirror_mode: dylan 1145 | codemirror_mime_type: text/x-dylan 1146 | language_id: 91 1147 | E: 1148 | type: programming 1149 | color: "#ccce35" 1150 | extensions: 1151 | - ".E" 1152 | interpreters: 1153 | - rune 1154 | tm_scope: none 1155 | ace_mode: text 1156 | language_id: 92 1157 | EBNF: 1158 | type: data 1159 | extensions: 1160 | - ".ebnf" 1161 | tm_scope: source.ebnf 1162 | ace_mode: text 1163 | codemirror_mode: ebnf 1164 | codemirror_mime_type: text/x-ebnf 1165 | language_id: 430 1166 | ECL: 1167 | type: programming 1168 | color: "#8a1267" 1169 | extensions: 1170 | - ".ecl" 1171 | - ".eclxml" 1172 | tm_scope: none 1173 | ace_mode: text 1174 | codemirror_mode: ecl 1175 | codemirror_mime_type: text/x-ecl 1176 | language_id: 93 1177 | ECLiPSe: 1178 | type: programming 1179 | group: prolog 1180 | extensions: 1181 | - ".ecl" 1182 | tm_scope: source.prolog.eclipse 1183 | ace_mode: prolog 1184 | language_id: 94 1185 | EJS: 1186 | type: markup 1187 | group: HTML 1188 | extensions: 1189 | - ".ejs" 1190 | tm_scope: text.html.js 1191 | ace_mode: ejs 1192 | language_id: 95 1193 | EML: 1194 | type: data 1195 | extensions: 1196 | - ".eml" 1197 | - ".mbox" 1198 | tm_scope: text.eml.basic 1199 | ace_mode: text 1200 | language_id: 529653389 1201 | EQ: 1202 | type: programming 1203 | color: "#a78649" 1204 | extensions: 1205 | - ".eq" 1206 | tm_scope: source.cs 1207 | ace_mode: csharp 1208 | codemirror_mode: clike 1209 | codemirror_mime_type: text/x-csharp 1210 | language_id: 96 1211 | Eagle: 1212 | type: data 1213 | extensions: 1214 | - ".sch" 1215 | - ".brd" 1216 | tm_scope: text.xml 1217 | ace_mode: xml 1218 | codemirror_mode: xml 1219 | codemirror_mime_type: text/xml 1220 | language_id: 97 1221 | Easybuild: 1222 | type: data 1223 | group: Python 1224 | ace_mode: python 1225 | codemirror_mode: python 1226 | codemirror_mime_type: text/x-python 1227 | tm_scope: source.python 1228 | extensions: 1229 | - ".eb" 1230 | language_id: 342840477 1231 | Ecere Projects: 1232 | type: data 1233 | group: JavaScript 1234 | extensions: 1235 | - ".epj" 1236 | tm_scope: source.json 1237 | ace_mode: json 1238 | codemirror_mode: javascript 1239 | codemirror_mime_type: application/json 1240 | language_id: 98 1241 | EditorConfig: 1242 | type: data 1243 | group: INI 1244 | filenames: 1245 | - ".editorconfig" 1246 | aliases: 1247 | - editor-config 1248 | ace_mode: ini 1249 | codemirror_mode: properties 1250 | codemirror_mime_type: text/x-properties 1251 | tm_scope: source.editorconfig 1252 | language_id: 96139566 1253 | Edje Data Collection: 1254 | type: data 1255 | extensions: 1256 | - ".edc" 1257 | tm_scope: source.json 1258 | ace_mode: json 1259 | codemirror_mode: javascript 1260 | codemirror_mime_type: application/json 1261 | language_id: 342840478 1262 | Eiffel: 1263 | type: programming 1264 | color: "#946d57" 1265 | extensions: 1266 | - ".e" 1267 | ace_mode: eiffel 1268 | codemirror_mode: eiffel 1269 | codemirror_mime_type: text/x-eiffel 1270 | language_id: 99 1271 | Elixir: 1272 | type: programming 1273 | color: "#6e4a7e" 1274 | extensions: 1275 | - ".ex" 1276 | - ".exs" 1277 | ace_mode: elixir 1278 | filenames: 1279 | - mix.lock 1280 | interpreters: 1281 | - elixir 1282 | language_id: 100 1283 | Elm: 1284 | type: programming 1285 | color: "#60B5CC" 1286 | extensions: 1287 | - ".elm" 1288 | tm_scope: source.elm 1289 | ace_mode: elm 1290 | codemirror_mode: elm 1291 | codemirror_mime_type: text/x-elm 1292 | language_id: 101 1293 | Emacs Lisp: 1294 | type: programming 1295 | tm_scope: source.emacs.lisp 1296 | color: "#c065db" 1297 | aliases: 1298 | - elisp 1299 | - emacs 1300 | filenames: 1301 | - ".abbrev_defs" 1302 | - ".emacs" 1303 | - ".emacs.desktop" 1304 | - ".gnus" 1305 | - ".spacemacs" 1306 | - ".viper" 1307 | - Cask 1308 | - Project.ede 1309 | - _emacs 1310 | - abbrev_defs 1311 | extensions: 1312 | - ".el" 1313 | - ".emacs" 1314 | - ".emacs.desktop" 1315 | ace_mode: lisp 1316 | codemirror_mode: commonlisp 1317 | codemirror_mime_type: text/x-common-lisp 1318 | language_id: 102 1319 | EmberScript: 1320 | type: programming 1321 | color: "#FFF4F3" 1322 | extensions: 1323 | - ".em" 1324 | - ".emberscript" 1325 | tm_scope: source.coffee 1326 | ace_mode: coffee 1327 | codemirror_mode: coffeescript 1328 | codemirror_mime_type: text/x-coffeescript 1329 | language_id: 103 1330 | Erlang: 1331 | type: programming 1332 | color: "#B83998" 1333 | extensions: 1334 | - ".erl" 1335 | - ".app.src" 1336 | - ".es" 1337 | - ".escript" 1338 | - ".hrl" 1339 | - ".xrl" 1340 | - ".yrl" 1341 | filenames: 1342 | - Emakefile 1343 | - rebar.config 1344 | - rebar.config.lock 1345 | - rebar.lock 1346 | ace_mode: erlang 1347 | codemirror_mode: erlang 1348 | codemirror_mime_type: text/x-erlang 1349 | interpreters: 1350 | - escript 1351 | language_id: 104 1352 | F#: 1353 | type: programming 1354 | color: "#b845fc" 1355 | aliases: 1356 | - fsharp 1357 | extensions: 1358 | - ".fs" 1359 | - ".fsi" 1360 | - ".fsx" 1361 | tm_scope: source.fsharp 1362 | ace_mode: text 1363 | codemirror_mode: mllike 1364 | codemirror_mime_type: text/x-fsharp 1365 | language_id: 105 1366 | F*: 1367 | fs_name: Fstar 1368 | type: programming 1369 | color: "#572e30" 1370 | aliases: 1371 | - fstar 1372 | extensions: 1373 | - ".fst" 1374 | tm_scope: source.fstar 1375 | ace_mode: text 1376 | language_id: 336943375 1377 | FIGlet Font: 1378 | type: data 1379 | aliases: 1380 | - FIGfont 1381 | extensions: 1382 | - ".flf" 1383 | tm_scope: source.figfont 1384 | ace_mode: text 1385 | language_id: 686129783 1386 | FLUX: 1387 | type: programming 1388 | color: "#88ccff" 1389 | extensions: 1390 | - ".fx" 1391 | - ".flux" 1392 | tm_scope: none 1393 | ace_mode: text 1394 | language_id: 106 1395 | Factor: 1396 | type: programming 1397 | color: "#636746" 1398 | extensions: 1399 | - ".factor" 1400 | filenames: 1401 | - ".factor-boot-rc" 1402 | - ".factor-rc" 1403 | ace_mode: text 1404 | codemirror_mode: factor 1405 | codemirror_mime_type: text/x-factor 1406 | language_id: 108 1407 | Fancy: 1408 | type: programming 1409 | color: "#7b9db4" 1410 | extensions: 1411 | - ".fy" 1412 | - ".fancypack" 1413 | filenames: 1414 | - Fakefile 1415 | ace_mode: text 1416 | language_id: 109 1417 | Fantom: 1418 | type: programming 1419 | color: "#14253c" 1420 | extensions: 1421 | - ".fan" 1422 | tm_scope: source.fan 1423 | ace_mode: text 1424 | language_id: 110 1425 | Filebench WML: 1426 | type: programming 1427 | extensions: 1428 | - ".f" 1429 | tm_scope: none 1430 | ace_mode: text 1431 | language_id: 111 1432 | Filterscript: 1433 | type: programming 1434 | group: RenderScript 1435 | extensions: 1436 | - ".fs" 1437 | tm_scope: none 1438 | ace_mode: text 1439 | language_id: 112 1440 | Formatted: 1441 | type: data 1442 | extensions: 1443 | - ".for" 1444 | - ".eam.fs" 1445 | tm_scope: none 1446 | ace_mode: text 1447 | language_id: 113 1448 | Forth: 1449 | type: programming 1450 | color: "#341708" 1451 | extensions: 1452 | - ".fth" 1453 | - ".4th" 1454 | - ".f" 1455 | - ".for" 1456 | - ".forth" 1457 | - ".fr" 1458 | - ".frt" 1459 | - ".fs" 1460 | ace_mode: forth 1461 | codemirror_mode: forth 1462 | codemirror_mime_type: text/x-forth 1463 | language_id: 114 1464 | Fortran: 1465 | type: programming 1466 | color: "#4d41b1" 1467 | extensions: 1468 | - ".f90" 1469 | - ".f" 1470 | - ".f03" 1471 | - ".f08" 1472 | - ".f77" 1473 | - ".f95" 1474 | - ".for" 1475 | - ".fpp" 1476 | tm_scope: source.fortran.modern 1477 | ace_mode: text 1478 | codemirror_mode: fortran 1479 | codemirror_mime_type: text/x-fortran 1480 | language_id: 107 1481 | FreeMarker: 1482 | type: programming 1483 | color: "#0050b2" 1484 | aliases: 1485 | - ftl 1486 | extensions: 1487 | - ".ftl" 1488 | tm_scope: text.html.ftl 1489 | ace_mode: ftl 1490 | language_id: 115 1491 | Frege: 1492 | type: programming 1493 | color: "#00cafe" 1494 | extensions: 1495 | - ".fr" 1496 | tm_scope: source.haskell 1497 | ace_mode: haskell 1498 | language_id: 116 1499 | G-code: 1500 | type: programming 1501 | color: "#D08CF2" 1502 | extensions: 1503 | - ".g" 1504 | - ".cnc" 1505 | - ".gco" 1506 | - ".gcode" 1507 | tm_scope: source.gcode 1508 | ace_mode: gcode 1509 | language_id: 117 1510 | GAMS: 1511 | type: programming 1512 | extensions: 1513 | - ".gms" 1514 | tm_scope: none 1515 | ace_mode: text 1516 | language_id: 118 1517 | GAP: 1518 | type: programming 1519 | extensions: 1520 | - ".g" 1521 | - ".gap" 1522 | - ".gd" 1523 | - ".gi" 1524 | - ".tst" 1525 | tm_scope: source.gap 1526 | ace_mode: text 1527 | language_id: 119 1528 | GCC Machine Description: 1529 | type: programming 1530 | extensions: 1531 | - ".md" 1532 | tm_scope: source.lisp 1533 | ace_mode: lisp 1534 | codemirror_mode: commonlisp 1535 | codemirror_mime_type: text/x-common-lisp 1536 | language_id: 121 1537 | GDB: 1538 | type: programming 1539 | extensions: 1540 | - ".gdb" 1541 | - ".gdbinit" 1542 | tm_scope: source.gdb 1543 | ace_mode: text 1544 | language_id: 122 1545 | GDScript: 1546 | type: programming 1547 | color: "#355570" 1548 | extensions: 1549 | - ".gd" 1550 | tm_scope: source.gdscript 1551 | ace_mode: text 1552 | language_id: 123 1553 | GLSL: 1554 | type: programming 1555 | extensions: 1556 | - ".glsl" 1557 | - ".fp" 1558 | - ".frag" 1559 | - ".frg" 1560 | - ".fs" 1561 | - ".fsh" 1562 | - ".fshader" 1563 | - ".geo" 1564 | - ".geom" 1565 | - ".glslv" 1566 | - ".gshader" 1567 | - ".shader" 1568 | - ".tesc" 1569 | - ".tese" 1570 | - ".vert" 1571 | - ".vrx" 1572 | - ".vsh" 1573 | - ".vshader" 1574 | ace_mode: glsl 1575 | language_id: 124 1576 | GN: 1577 | type: data 1578 | extensions: 1579 | - ".gn" 1580 | - ".gni" 1581 | interpreters: 1582 | - gn 1583 | filenames: 1584 | - ".gn" 1585 | tm_scope: source.gn 1586 | ace_mode: python 1587 | codemirror_mode: python 1588 | codemirror_mime_type: text/x-python 1589 | language_id: 302957008 1590 | Game Maker Language: 1591 | type: programming 1592 | color: "#71b417" 1593 | extensions: 1594 | - ".gml" 1595 | tm_scope: source.c++ 1596 | ace_mode: c_cpp 1597 | codemirror_mode: clike 1598 | codemirror_mime_type: text/x-c++src 1599 | language_id: 125 1600 | Genie: 1601 | type: programming 1602 | ace_mode: text 1603 | extensions: 1604 | - ".gs" 1605 | color: "#fb855d" 1606 | tm_scope: none 1607 | language_id: 792408528 1608 | Genshi: 1609 | type: programming 1610 | extensions: 1611 | - ".kid" 1612 | tm_scope: text.xml.genshi 1613 | aliases: 1614 | - xml+genshi 1615 | - xml+kid 1616 | ace_mode: xml 1617 | codemirror_mode: xml 1618 | codemirror_mime_type: text/xml 1619 | language_id: 126 1620 | Gentoo Ebuild: 1621 | type: programming 1622 | group: Shell 1623 | extensions: 1624 | - ".ebuild" 1625 | tm_scope: source.shell 1626 | ace_mode: sh 1627 | codemirror_mode: shell 1628 | codemirror_mime_type: text/x-sh 1629 | language_id: 127 1630 | Gentoo Eclass: 1631 | type: programming 1632 | group: Shell 1633 | extensions: 1634 | - ".eclass" 1635 | tm_scope: source.shell 1636 | ace_mode: sh 1637 | codemirror_mode: shell 1638 | codemirror_mime_type: text/x-sh 1639 | language_id: 128 1640 | Gerber Image: 1641 | type: data 1642 | aliases: 1643 | - rs-274x 1644 | extensions: 1645 | - ".gbr" 1646 | - ".gbl" 1647 | - ".gbo" 1648 | - ".gbp" 1649 | - ".gbs" 1650 | - ".gko" 1651 | - ".gml" 1652 | - ".gpb" 1653 | - ".gpt" 1654 | - ".gtl" 1655 | - ".gto" 1656 | - ".gtp" 1657 | - ".gts" 1658 | interpreters: 1659 | - gerbv 1660 | - gerbview 1661 | tm_scope: source.gerber 1662 | ace_mode: text 1663 | language_id: 404627610 1664 | Gettext Catalog: 1665 | type: prose 1666 | searchable: false 1667 | aliases: 1668 | - pot 1669 | extensions: 1670 | - ".po" 1671 | - ".pot" 1672 | tm_scope: source.po 1673 | ace_mode: text 1674 | language_id: 129 1675 | Gherkin: 1676 | type: programming 1677 | extensions: 1678 | - ".feature" 1679 | tm_scope: text.gherkin.feature 1680 | aliases: 1681 | - cucumber 1682 | ace_mode: text 1683 | color: "#5B2063" 1684 | language_id: 76 1685 | Git Attributes: 1686 | type: data 1687 | group: INI 1688 | aliases: 1689 | - gitattributes 1690 | filenames: 1691 | - ".gitattributes" 1692 | tm_scope: source.gitattributes 1693 | ace_mode: gitignore 1694 | codemirror_mode: shell 1695 | codemirror_mime_type: text/x-sh 1696 | language_id: 956324166 1697 | Git Config: 1698 | type: data 1699 | group: INI 1700 | aliases: 1701 | - gitconfig 1702 | - gitmodules 1703 | extensions: 1704 | - ".gitconfig" 1705 | filenames: 1706 | - ".gitconfig" 1707 | - ".gitmodules" 1708 | ace_mode: ini 1709 | codemirror_mode: properties 1710 | codemirror_mime_type: text/x-properties 1711 | tm_scope: source.gitconfig 1712 | language_id: 807968997 1713 | Glyph: 1714 | type: programming 1715 | color: "#c1ac7f" 1716 | extensions: 1717 | - ".glf" 1718 | tm_scope: source.tcl 1719 | ace_mode: tcl 1720 | codemirror_mode: tcl 1721 | codemirror_mime_type: text/x-tcl 1722 | language_id: 130 1723 | Glyph Bitmap Distribution Format: 1724 | type: data 1725 | extensions: 1726 | - ".bdf" 1727 | tm_scope: source.bdf 1728 | ace_mode: text 1729 | language_id: 997665271 1730 | Gnuplot: 1731 | type: programming 1732 | color: "#f0a9f0" 1733 | extensions: 1734 | - ".gp" 1735 | - ".gnu" 1736 | - ".gnuplot" 1737 | - ".plot" 1738 | - ".plt" 1739 | interpreters: 1740 | - gnuplot 1741 | ace_mode: text 1742 | language_id: 131 1743 | Go: 1744 | type: programming 1745 | color: "#00ADD8" 1746 | aliases: 1747 | - golang 1748 | extensions: 1749 | - ".go" 1750 | ace_mode: golang 1751 | codemirror_mode: go 1752 | codemirror_mime_type: text/x-go 1753 | language_id: 132 1754 | Golo: 1755 | type: programming 1756 | color: "#88562A" 1757 | extensions: 1758 | - ".golo" 1759 | tm_scope: source.golo 1760 | ace_mode: text 1761 | language_id: 133 1762 | Gosu: 1763 | type: programming 1764 | color: "#82937f" 1765 | extensions: 1766 | - ".gs" 1767 | - ".gst" 1768 | - ".gsx" 1769 | - ".vark" 1770 | tm_scope: source.gosu.2 1771 | ace_mode: text 1772 | language_id: 134 1773 | Grace: 1774 | type: programming 1775 | extensions: 1776 | - ".grace" 1777 | tm_scope: source.grace 1778 | ace_mode: text 1779 | language_id: 135 1780 | Gradle: 1781 | type: data 1782 | extensions: 1783 | - ".gradle" 1784 | tm_scope: source.groovy.gradle 1785 | ace_mode: text 1786 | language_id: 136 1787 | Grammatical Framework: 1788 | type: programming 1789 | aliases: 1790 | - gf 1791 | extensions: 1792 | - ".gf" 1793 | color: "#79aa7a" 1794 | tm_scope: source.gf 1795 | ace_mode: haskell 1796 | codemirror_mode: haskell 1797 | codemirror_mime_type: text/x-haskell 1798 | language_id: 137 1799 | Graph Modeling Language: 1800 | type: data 1801 | extensions: 1802 | - ".gml" 1803 | tm_scope: none 1804 | ace_mode: text 1805 | language_id: 138 1806 | GraphQL: 1807 | type: data 1808 | extensions: 1809 | - ".graphql" 1810 | - ".gql" 1811 | - ".graphqls" 1812 | tm_scope: source.graphql 1813 | ace_mode: text 1814 | language_id: 139 1815 | Graphviz (DOT): 1816 | type: data 1817 | tm_scope: source.dot 1818 | extensions: 1819 | - ".dot" 1820 | - ".gv" 1821 | ace_mode: text 1822 | language_id: 140 1823 | Groovy: 1824 | type: programming 1825 | ace_mode: groovy 1826 | codemirror_mode: groovy 1827 | codemirror_mime_type: text/x-groovy 1828 | color: "#e69f56" 1829 | extensions: 1830 | - ".groovy" 1831 | - ".grt" 1832 | - ".gtpl" 1833 | - ".gvy" 1834 | interpreters: 1835 | - groovy 1836 | filenames: 1837 | - Jenkinsfile 1838 | language_id: 142 1839 | Groovy Server Pages: 1840 | type: programming 1841 | group: Groovy 1842 | aliases: 1843 | - gsp 1844 | - java server page 1845 | extensions: 1846 | - ".gsp" 1847 | tm_scope: text.html.jsp 1848 | ace_mode: jsp 1849 | codemirror_mode: htmlembedded 1850 | codemirror_mime_type: application/x-jsp 1851 | language_id: 143 1852 | HAProxy: 1853 | type: data 1854 | extensions: 1855 | - ".cfg" 1856 | filenames: 1857 | - haproxy.cfg 1858 | tm_scope: source.haproxy-config 1859 | ace_mode: text 1860 | language_id: 366607477 1861 | HCL: 1862 | type: programming 1863 | extensions: 1864 | - ".hcl" 1865 | - ".tf" 1866 | - ".tfvars" 1867 | - ".workflow" 1868 | aliases: 1869 | - terraform 1870 | ace_mode: ruby 1871 | codemirror_mode: ruby 1872 | codemirror_mime_type: text/x-ruby 1873 | tm_scope: source.terraform 1874 | language_id: 144 1875 | HLSL: 1876 | type: programming 1877 | extensions: 1878 | - ".hlsl" 1879 | - ".cginc" 1880 | - ".fx" 1881 | - ".fxh" 1882 | - ".hlsli" 1883 | ace_mode: text 1884 | tm_scope: source.hlsl 1885 | language_id: 145 1886 | HTML: 1887 | type: markup 1888 | tm_scope: text.html.basic 1889 | ace_mode: html 1890 | codemirror_mode: htmlmixed 1891 | codemirror_mime_type: text/html 1892 | color: "#e34c26" 1893 | aliases: 1894 | - xhtml 1895 | extensions: 1896 | - ".html" 1897 | - ".htm" 1898 | - ".html.hl" 1899 | - ".inc" 1900 | - ".st" 1901 | - ".xht" 1902 | - ".xhtml" 1903 | language_id: 146 1904 | HTML+Django: 1905 | type: markup 1906 | tm_scope: text.html.django 1907 | group: HTML 1908 | extensions: 1909 | - ".jinja" 1910 | - ".jinja2" 1911 | - ".mustache" 1912 | - ".njk" 1913 | aliases: 1914 | - django 1915 | - html+django/jinja 1916 | - html+jinja 1917 | - htmldjango 1918 | - njk 1919 | - nunjucks 1920 | ace_mode: django 1921 | codemirror_mode: django 1922 | codemirror_mime_type: text/x-django 1923 | language_id: 147 1924 | HTML+ECR: 1925 | type: markup 1926 | tm_scope: text.html.ecr 1927 | group: HTML 1928 | aliases: 1929 | - ecr 1930 | extensions: 1931 | - ".ecr" 1932 | ace_mode: text 1933 | codemirror_mode: htmlmixed 1934 | codemirror_mime_type: text/html 1935 | language_id: 148 1936 | HTML+EEX: 1937 | type: markup 1938 | tm_scope: text.html.elixir 1939 | group: HTML 1940 | aliases: 1941 | - eex 1942 | extensions: 1943 | - ".eex" 1944 | ace_mode: text 1945 | codemirror_mode: htmlmixed 1946 | codemirror_mime_type: text/html 1947 | language_id: 149 1948 | HTML+ERB: 1949 | type: markup 1950 | tm_scope: text.html.erb 1951 | group: HTML 1952 | aliases: 1953 | - erb 1954 | extensions: 1955 | - ".erb" 1956 | - ".erb.deface" 1957 | ace_mode: text 1958 | codemirror_mode: htmlembedded 1959 | codemirror_mime_type: application/x-erb 1960 | language_id: 150 1961 | HTML+PHP: 1962 | type: markup 1963 | tm_scope: text.html.php 1964 | group: HTML 1965 | extensions: 1966 | - ".phtml" 1967 | ace_mode: php 1968 | codemirror_mode: php 1969 | codemirror_mime_type: application/x-httpd-php 1970 | language_id: 151 1971 | HTML+Razor: 1972 | type: markup 1973 | tm_scope: text.html.cshtml 1974 | group: HTML 1975 | aliases: 1976 | - razor 1977 | extensions: 1978 | - ".cshtml" 1979 | - ".razor" 1980 | ace_mode: razor 1981 | codemirror_mode: htmlmixed 1982 | codemirror_mime_type: text/html 1983 | language_id: 479039817 1984 | HTTP: 1985 | type: data 1986 | extensions: 1987 | - ".http" 1988 | tm_scope: source.httpspec 1989 | ace_mode: text 1990 | codemirror_mode: http 1991 | codemirror_mime_type: message/http 1992 | language_id: 152 1993 | HXML: 1994 | type: data 1995 | ace_mode: text 1996 | extensions: 1997 | - ".hxml" 1998 | tm_scope: source.hxml 1999 | language_id: 786683730 2000 | Hack: 2001 | type: programming 2002 | ace_mode: php 2003 | codemirror_mode: php 2004 | codemirror_mime_type: application/x-httpd-php 2005 | extensions: 2006 | - ".hh" 2007 | - ".php" 2008 | tm_scope: source.hack 2009 | color: "#878787" 2010 | language_id: 153 2011 | Haml: 2012 | group: HTML 2013 | type: markup 2014 | extensions: 2015 | - ".haml" 2016 | - ".haml.deface" 2017 | ace_mode: haml 2018 | codemirror_mode: haml 2019 | codemirror_mime_type: text/x-haml 2020 | language_id: 154 2021 | Handlebars: 2022 | type: markup 2023 | group: HTML 2024 | aliases: 2025 | - hbs 2026 | - htmlbars 2027 | extensions: 2028 | - ".handlebars" 2029 | - ".hbs" 2030 | tm_scope: text.html.handlebars 2031 | ace_mode: handlebars 2032 | language_id: 155 2033 | Harbour: 2034 | type: programming 2035 | color: "#0e60e3" 2036 | extensions: 2037 | - ".hb" 2038 | tm_scope: source.harbour 2039 | ace_mode: text 2040 | language_id: 156 2041 | Haskell: 2042 | type: programming 2043 | color: "#5e5086" 2044 | extensions: 2045 | - ".hs" 2046 | - ".hsc" 2047 | interpreters: 2048 | - runhaskell 2049 | ace_mode: haskell 2050 | codemirror_mode: haskell 2051 | codemirror_mime_type: text/x-haskell 2052 | language_id: 157 2053 | Haxe: 2054 | type: programming 2055 | ace_mode: haxe 2056 | codemirror_mode: haxe 2057 | codemirror_mime_type: text/x-haxe 2058 | color: "#df7900" 2059 | extensions: 2060 | - ".hx" 2061 | - ".hxsl" 2062 | tm_scope: source.hx 2063 | language_id: 158 2064 | HiveQL: 2065 | type: programming 2066 | extensions: 2067 | - ".q" 2068 | color: "#dce200" 2069 | tm_scope: source.hql 2070 | ace_mode: sql 2071 | language_id: 931814087 2072 | HolyC: 2073 | type: programming 2074 | color: "#ffefaf" 2075 | extensions: 2076 | - ".hc" 2077 | tm_scope: source.hc 2078 | ace_mode: c_cpp 2079 | codemirror_mode: clike 2080 | codemirror_mime_type: text/x-csrc 2081 | language_id: 928121743 2082 | Hy: 2083 | type: programming 2084 | ace_mode: text 2085 | color: "#7790B2" 2086 | extensions: 2087 | - ".hy" 2088 | interpreters: 2089 | - hy 2090 | aliases: 2091 | - hylang 2092 | tm_scope: source.hy 2093 | language_id: 159 2094 | HyPhy: 2095 | type: programming 2096 | ace_mode: text 2097 | extensions: 2098 | - ".bf" 2099 | tm_scope: none 2100 | language_id: 160 2101 | IDL: 2102 | type: programming 2103 | color: "#a3522f" 2104 | extensions: 2105 | - ".pro" 2106 | - ".dlm" 2107 | ace_mode: text 2108 | codemirror_mode: idl 2109 | codemirror_mime_type: text/x-idl 2110 | language_id: 161 2111 | IGOR Pro: 2112 | type: programming 2113 | extensions: 2114 | - ".ipf" 2115 | aliases: 2116 | - igor 2117 | - igorpro 2118 | tm_scope: none 2119 | ace_mode: text 2120 | language_id: 162 2121 | INI: 2122 | type: data 2123 | extensions: 2124 | - ".ini" 2125 | - ".cfg" 2126 | - ".lektorproject" 2127 | - ".prefs" 2128 | - ".pro" 2129 | - ".properties" 2130 | filenames: 2131 | - buildozer.spec 2132 | tm_scope: source.ini 2133 | aliases: 2134 | - dosini 2135 | ace_mode: ini 2136 | codemirror_mode: properties 2137 | codemirror_mime_type: text/x-properties 2138 | language_id: 163 2139 | IRC log: 2140 | type: data 2141 | aliases: 2142 | - irc 2143 | - irc logs 2144 | extensions: 2145 | - ".irclog" 2146 | - ".weechatlog" 2147 | tm_scope: none 2148 | ace_mode: text 2149 | codemirror_mode: mirc 2150 | codemirror_mime_type: text/mirc 2151 | language_id: 164 2152 | Idris: 2153 | type: programming 2154 | color: "#b30000" 2155 | extensions: 2156 | - ".idr" 2157 | - ".lidr" 2158 | ace_mode: text 2159 | tm_scope: source.idris 2160 | language_id: 165 2161 | Ignore List: 2162 | type: data 2163 | group: INI 2164 | aliases: 2165 | - ignore 2166 | - gitignore 2167 | - git-ignore 2168 | extensions: 2169 | - ".gitignore" 2170 | filenames: 2171 | - ".atomignore" 2172 | - ".babelignore" 2173 | - ".bzrignore" 2174 | - ".coffeelintignore" 2175 | - ".cvsignore" 2176 | - ".dockerignore" 2177 | - ".eslintignore" 2178 | - ".gitignore" 2179 | - ".nodemonignore" 2180 | - ".npmignore" 2181 | - ".prettierignore" 2182 | - ".stylelintignore" 2183 | - ".vscodeignore" 2184 | - gitignore-global 2185 | - gitignore_global 2186 | ace_mode: gitignore 2187 | tm_scope: source.gitignore 2188 | codemirror_mode: shell 2189 | codemirror_mime_type: text/x-sh 2190 | language_id: 74444240 2191 | Inform 7: 2192 | type: programming 2193 | wrap: true 2194 | extensions: 2195 | - ".ni" 2196 | - ".i7x" 2197 | tm_scope: source.inform7 2198 | aliases: 2199 | - i7 2200 | - inform7 2201 | ace_mode: text 2202 | language_id: 166 2203 | Inno Setup: 2204 | type: programming 2205 | extensions: 2206 | - ".iss" 2207 | tm_scope: none 2208 | ace_mode: text 2209 | language_id: 167 2210 | Io: 2211 | type: programming 2212 | color: "#a9188d" 2213 | extensions: 2214 | - ".io" 2215 | interpreters: 2216 | - io 2217 | ace_mode: io 2218 | language_id: 168 2219 | Ioke: 2220 | type: programming 2221 | color: "#078193" 2222 | extensions: 2223 | - ".ik" 2224 | interpreters: 2225 | - ioke 2226 | ace_mode: text 2227 | language_id: 169 2228 | Isabelle: 2229 | type: programming 2230 | color: "#FEFE00" 2231 | extensions: 2232 | - ".thy" 2233 | tm_scope: source.isabelle.theory 2234 | ace_mode: text 2235 | language_id: 170 2236 | Isabelle ROOT: 2237 | type: programming 2238 | group: Isabelle 2239 | filenames: 2240 | - ROOT 2241 | tm_scope: source.isabelle.root 2242 | ace_mode: text 2243 | language_id: 171 2244 | J: 2245 | type: programming 2246 | color: "#9EEDFF" 2247 | extensions: 2248 | - ".ijs" 2249 | interpreters: 2250 | - jconsole 2251 | tm_scope: source.j 2252 | ace_mode: text 2253 | language_id: 172 2254 | JFlex: 2255 | type: programming 2256 | group: Lex 2257 | extensions: 2258 | - ".flex" 2259 | - ".jflex" 2260 | tm_scope: source.jflex 2261 | ace_mode: text 2262 | language_id: 173 2263 | JSON: 2264 | type: data 2265 | tm_scope: source.json 2266 | ace_mode: json 2267 | codemirror_mode: javascript 2268 | codemirror_mime_type: application/json 2269 | searchable: false 2270 | extensions: 2271 | - ".json" 2272 | - ".avsc" 2273 | - ".geojson" 2274 | - ".gltf" 2275 | - ".har" 2276 | - ".ice" 2277 | - ".JSON-tmLanguage" 2278 | - ".jsonl" 2279 | - ".mcmeta" 2280 | - ".tfstate" 2281 | - ".tfstate.backup" 2282 | - ".topojson" 2283 | - ".webapp" 2284 | - ".webmanifest" 2285 | - ".yy" 2286 | - ".yyp" 2287 | filenames: 2288 | - ".arcconfig" 2289 | - ".htmlhintrc" 2290 | - ".tern-config" 2291 | - ".tern-project" 2292 | - ".watchmanconfig" 2293 | - composer.lock 2294 | - mcmod.info 2295 | language_id: 174 2296 | JSON with Comments: 2297 | type: data 2298 | group: JSON 2299 | tm_scope: source.js 2300 | ace_mode: javascript 2301 | codemirror_mode: javascript 2302 | codemirror_mime_type: text/javascript 2303 | aliases: 2304 | - jsonc 2305 | extensions: 2306 | - ".sublime-build" 2307 | - ".sublime-commands" 2308 | - ".sublime-completions" 2309 | - ".sublime-keymap" 2310 | - ".sublime-macro" 2311 | - ".sublime-menu" 2312 | - ".sublime-mousemap" 2313 | - ".sublime-project" 2314 | - ".sublime-settings" 2315 | - ".sublime-theme" 2316 | - ".sublime-workspace" 2317 | - ".sublime_metrics" 2318 | - ".sublime_session" 2319 | filenames: 2320 | - ".babelrc" 2321 | - ".eslintrc.json" 2322 | - ".jscsrc" 2323 | - ".jshintrc" 2324 | - ".jslintrc" 2325 | - jsconfig.json 2326 | - language-configuration.json 2327 | - tsconfig.json 2328 | language_id: 423 2329 | JSON5: 2330 | type: data 2331 | extensions: 2332 | - ".json5" 2333 | tm_scope: source.js 2334 | ace_mode: javascript 2335 | codemirror_mode: javascript 2336 | codemirror_mime_type: application/json 2337 | language_id: 175 2338 | JSONLD: 2339 | type: data 2340 | extensions: 2341 | - ".jsonld" 2342 | tm_scope: source.js 2343 | ace_mode: javascript 2344 | codemirror_mode: javascript 2345 | codemirror_mime_type: application/json 2346 | language_id: 176 2347 | JSONiq: 2348 | color: "#40d47e" 2349 | type: programming 2350 | ace_mode: jsoniq 2351 | codemirror_mode: javascript 2352 | codemirror_mime_type: application/json 2353 | extensions: 2354 | - ".jq" 2355 | tm_scope: source.jq 2356 | language_id: 177 2357 | JSX: 2358 | type: programming 2359 | group: JavaScript 2360 | extensions: 2361 | - ".jsx" 2362 | tm_scope: source.js.jsx 2363 | ace_mode: javascript 2364 | codemirror_mode: jsx 2365 | codemirror_mime_type: text/jsx 2366 | language_id: 178 2367 | Jasmin: 2368 | type: programming 2369 | ace_mode: java 2370 | extensions: 2371 | - ".j" 2372 | tm_scope: source.jasmin 2373 | language_id: 180 2374 | Java: 2375 | type: programming 2376 | ace_mode: java 2377 | codemirror_mode: clike 2378 | codemirror_mime_type: text/x-java 2379 | color: "#b07219" 2380 | extensions: 2381 | - ".java" 2382 | language_id: 181 2383 | Java Properties: 2384 | type: data 2385 | extensions: 2386 | - ".properties" 2387 | tm_scope: source.java-properties 2388 | ace_mode: properties 2389 | codemirror_mode: properties 2390 | codemirror_mime_type: text/x-properties 2391 | language_id: 519377561 2392 | Java Server Pages: 2393 | type: programming 2394 | group: Java 2395 | aliases: 2396 | - jsp 2397 | extensions: 2398 | - ".jsp" 2399 | tm_scope: text.html.jsp 2400 | ace_mode: jsp 2401 | codemirror_mode: htmlembedded 2402 | codemirror_mime_type: application/x-jsp 2403 | language_id: 182 2404 | JavaScript: 2405 | type: programming 2406 | tm_scope: source.js 2407 | ace_mode: javascript 2408 | codemirror_mode: javascript 2409 | codemirror_mime_type: text/javascript 2410 | color: "#f1e05a" 2411 | aliases: 2412 | - js 2413 | - node 2414 | extensions: 2415 | - ".js" 2416 | - "._js" 2417 | - ".bones" 2418 | - ".es" 2419 | - ".es6" 2420 | - ".frag" 2421 | - ".gs" 2422 | - ".jake" 2423 | - ".jsb" 2424 | - ".jscad" 2425 | - ".jsfl" 2426 | - ".jsm" 2427 | - ".jss" 2428 | - ".mjs" 2429 | - ".njs" 2430 | - ".pac" 2431 | - ".sjs" 2432 | - ".ssjs" 2433 | - ".xsjs" 2434 | - ".xsjslib" 2435 | filenames: 2436 | - Jakefile 2437 | interpreters: 2438 | - chakra 2439 | - d8 2440 | - js 2441 | - node 2442 | - rhino 2443 | - v8 2444 | - v8-shell 2445 | language_id: 183 2446 | JavaScript+ERB: 2447 | type: programming 2448 | tm_scope: source.js 2449 | group: JavaScript 2450 | extensions: 2451 | - ".js.erb" 2452 | ace_mode: javascript 2453 | codemirror_mode: javascript 2454 | codemirror_mime_type: application/javascript 2455 | language_id: 914318960 2456 | Jison: 2457 | type: programming 2458 | group: Yacc 2459 | extensions: 2460 | - ".jison" 2461 | tm_scope: source.jison 2462 | ace_mode: text 2463 | language_id: 284531423 2464 | Jison Lex: 2465 | type: programming 2466 | group: Lex 2467 | extensions: 2468 | - ".jisonlex" 2469 | tm_scope: source.jisonlex 2470 | ace_mode: text 2471 | language_id: 406395330 2472 | Jolie: 2473 | type: programming 2474 | extensions: 2475 | - ".ol" 2476 | - ".iol" 2477 | interpreters: 2478 | - jolie 2479 | color: "#843179" 2480 | ace_mode: text 2481 | tm_scope: source.jolie 2482 | language_id: 998078858 2483 | Jsonnet: 2484 | color: "#0064bd" 2485 | type: programming 2486 | ace_mode: text 2487 | extensions: 2488 | - ".jsonnet" 2489 | - ".libsonnet" 2490 | tm_scope: source.jsonnet 2491 | language_id: 664885656 2492 | Julia: 2493 | type: programming 2494 | extensions: 2495 | - ".jl" 2496 | interpreters: 2497 | - julia 2498 | color: "#a270ba" 2499 | ace_mode: julia 2500 | codemirror_mode: julia 2501 | codemirror_mime_type: text/x-julia 2502 | language_id: 184 2503 | Jupyter Notebook: 2504 | type: markup 2505 | ace_mode: json 2506 | codemirror_mode: javascript 2507 | codemirror_mime_type: application/json 2508 | tm_scope: source.json 2509 | color: "#DA5B0B" 2510 | extensions: 2511 | - ".ipynb" 2512 | filenames: 2513 | - Notebook 2514 | aliases: 2515 | - IPython Notebook 2516 | language_id: 185 2517 | KRL: 2518 | type: programming 2519 | color: "#28430A" 2520 | extensions: 2521 | - ".krl" 2522 | tm_scope: none 2523 | ace_mode: text 2524 | language_id: 186 2525 | KiCad Layout: 2526 | type: data 2527 | aliases: 2528 | - pcbnew 2529 | extensions: 2530 | - ".kicad_pcb" 2531 | - ".kicad_mod" 2532 | - ".kicad_wks" 2533 | filenames: 2534 | - fp-lib-table 2535 | tm_scope: source.pcb.sexp 2536 | ace_mode: lisp 2537 | codemirror_mode: commonlisp 2538 | codemirror_mime_type: text/x-common-lisp 2539 | language_id: 187 2540 | KiCad Legacy Layout: 2541 | type: data 2542 | extensions: 2543 | - ".brd" 2544 | tm_scope: source.pcb.board 2545 | ace_mode: text 2546 | language_id: 140848857 2547 | KiCad Schematic: 2548 | type: data 2549 | aliases: 2550 | - eeschema schematic 2551 | extensions: 2552 | - ".sch" 2553 | tm_scope: source.pcb.schematic 2554 | ace_mode: text 2555 | language_id: 622447435 2556 | Kit: 2557 | type: markup 2558 | ace_mode: html 2559 | codemirror_mode: htmlmixed 2560 | codemirror_mime_type: text/html 2561 | extensions: 2562 | - ".kit" 2563 | tm_scope: text.html.basic 2564 | language_id: 188 2565 | Kotlin: 2566 | type: programming 2567 | color: "#F18E33" 2568 | extensions: 2569 | - ".kt" 2570 | - ".ktm" 2571 | - ".kts" 2572 | tm_scope: source.kotlin 2573 | ace_mode: text 2574 | codemirror_mode: clike 2575 | codemirror_mime_type: text/x-kotlin 2576 | language_id: 189 2577 | LFE: 2578 | type: programming 2579 | color: "#4C3023" 2580 | extensions: 2581 | - ".lfe" 2582 | tm_scope: source.lisp 2583 | ace_mode: lisp 2584 | codemirror_mode: commonlisp 2585 | codemirror_mime_type: text/x-common-lisp 2586 | language_id: 190 2587 | LLVM: 2588 | type: programming 2589 | extensions: 2590 | - ".ll" 2591 | ace_mode: text 2592 | color: "#185619" 2593 | language_id: 191 2594 | LOLCODE: 2595 | type: programming 2596 | extensions: 2597 | - ".lol" 2598 | color: "#cc9900" 2599 | tm_scope: none 2600 | ace_mode: text 2601 | language_id: 192 2602 | LSL: 2603 | type: programming 2604 | ace_mode: lsl 2605 | extensions: 2606 | - ".lsl" 2607 | - ".lslp" 2608 | interpreters: 2609 | - lsl 2610 | color: "#3d9970" 2611 | language_id: 193 2612 | LTspice Symbol: 2613 | type: data 2614 | extensions: 2615 | - ".asy" 2616 | tm_scope: source.ltspice.symbol 2617 | ace_mode: text 2618 | codemirror_mode: spreadsheet 2619 | codemirror_mime_type: text/x-spreadsheet 2620 | language_id: 1013566805 2621 | LabVIEW: 2622 | type: programming 2623 | extensions: 2624 | - ".lvproj" 2625 | tm_scope: text.xml 2626 | ace_mode: xml 2627 | codemirror_mode: xml 2628 | codemirror_mime_type: text/xml 2629 | language_id: 194 2630 | Lasso: 2631 | type: programming 2632 | color: "#999999" 2633 | extensions: 2634 | - ".lasso" 2635 | - ".las" 2636 | - ".lasso8" 2637 | - ".lasso9" 2638 | - ".ldml" 2639 | tm_scope: file.lasso 2640 | aliases: 2641 | - lassoscript 2642 | ace_mode: text 2643 | language_id: 195 2644 | Latte: 2645 | type: markup 2646 | group: HTML 2647 | extensions: 2648 | - ".latte" 2649 | tm_scope: text.html.smarty 2650 | ace_mode: smarty 2651 | codemirror_mode: smarty 2652 | codemirror_mime_type: text/x-smarty 2653 | language_id: 196 2654 | Lean: 2655 | type: programming 2656 | extensions: 2657 | - ".lean" 2658 | - ".hlean" 2659 | ace_mode: text 2660 | language_id: 197 2661 | Less: 2662 | type: markup 2663 | group: CSS 2664 | extensions: 2665 | - ".less" 2666 | tm_scope: source.css.less 2667 | ace_mode: less 2668 | codemirror_mode: css 2669 | codemirror_mime_type: text/css 2670 | language_id: 198 2671 | Lex: 2672 | type: programming 2673 | color: "#DBCA00" 2674 | aliases: 2675 | - flex 2676 | extensions: 2677 | - ".l" 2678 | - ".lex" 2679 | tm_scope: none 2680 | ace_mode: text 2681 | language_id: 199 2682 | LilyPond: 2683 | type: programming 2684 | extensions: 2685 | - ".ly" 2686 | - ".ily" 2687 | ace_mode: text 2688 | language_id: 200 2689 | Limbo: 2690 | type: programming 2691 | extensions: 2692 | - ".b" 2693 | - ".m" 2694 | tm_scope: none 2695 | ace_mode: text 2696 | language_id: 201 2697 | Linker Script: 2698 | type: data 2699 | extensions: 2700 | - ".ld" 2701 | - ".lds" 2702 | - ".x" 2703 | filenames: 2704 | - ld.script 2705 | tm_scope: none 2706 | ace_mode: text 2707 | language_id: 202 2708 | Linux Kernel Module: 2709 | type: data 2710 | extensions: 2711 | - ".mod" 2712 | tm_scope: none 2713 | ace_mode: text 2714 | language_id: 203 2715 | Liquid: 2716 | type: markup 2717 | extensions: 2718 | - ".liquid" 2719 | tm_scope: text.html.liquid 2720 | ace_mode: liquid 2721 | language_id: 204 2722 | Literate Agda: 2723 | type: programming 2724 | group: Agda 2725 | extensions: 2726 | - ".lagda" 2727 | tm_scope: none 2728 | ace_mode: text 2729 | language_id: 205 2730 | Literate CoffeeScript: 2731 | type: programming 2732 | tm_scope: source.litcoffee 2733 | group: CoffeeScript 2734 | ace_mode: text 2735 | wrap: true 2736 | aliases: 2737 | - litcoffee 2738 | extensions: 2739 | - ".litcoffee" 2740 | language_id: 206 2741 | Literate Haskell: 2742 | type: programming 2743 | group: Haskell 2744 | aliases: 2745 | - lhaskell 2746 | - lhs 2747 | extensions: 2748 | - ".lhs" 2749 | tm_scope: text.tex.latex.haskell 2750 | ace_mode: text 2751 | codemirror_mode: haskell-literate 2752 | codemirror_mime_type: text/x-literate-haskell 2753 | language_id: 207 2754 | LiveScript: 2755 | type: programming 2756 | color: "#499886" 2757 | aliases: 2758 | - live-script 2759 | - ls 2760 | extensions: 2761 | - ".ls" 2762 | - "._ls" 2763 | filenames: 2764 | - Slakefile 2765 | ace_mode: livescript 2766 | codemirror_mode: livescript 2767 | codemirror_mime_type: text/x-livescript 2768 | language_id: 208 2769 | Logos: 2770 | type: programming 2771 | extensions: 2772 | - ".xm" 2773 | - ".x" 2774 | - ".xi" 2775 | ace_mode: text 2776 | tm_scope: source.logos 2777 | language_id: 209 2778 | Logtalk: 2779 | type: programming 2780 | extensions: 2781 | - ".lgt" 2782 | - ".logtalk" 2783 | ace_mode: text 2784 | language_id: 210 2785 | LookML: 2786 | type: programming 2787 | ace_mode: yaml 2788 | codemirror_mode: yaml 2789 | codemirror_mime_type: text/x-yaml 2790 | color: "#652B81" 2791 | extensions: 2792 | - ".lookml" 2793 | - ".model.lkml" 2794 | - ".view.lkml" 2795 | tm_scope: source.yaml 2796 | language_id: 211 2797 | LoomScript: 2798 | type: programming 2799 | extensions: 2800 | - ".ls" 2801 | tm_scope: source.loomscript 2802 | ace_mode: text 2803 | language_id: 212 2804 | Lua: 2805 | type: programming 2806 | ace_mode: lua 2807 | codemirror_mode: lua 2808 | codemirror_mime_type: text/x-lua 2809 | color: "#000080" 2810 | extensions: 2811 | - ".lua" 2812 | - ".fcgi" 2813 | - ".nse" 2814 | - ".p8" 2815 | - ".pd_lua" 2816 | - ".rbxs" 2817 | - ".wlua" 2818 | interpreters: 2819 | - lua 2820 | language_id: 213 2821 | M: 2822 | type: programming 2823 | aliases: 2824 | - mumps 2825 | extensions: 2826 | - ".mumps" 2827 | - ".m" 2828 | ace_mode: text 2829 | codemirror_mode: mumps 2830 | codemirror_mime_type: text/x-mumps 2831 | language_id: 214 2832 | tm_scope: none 2833 | M4: 2834 | type: programming 2835 | extensions: 2836 | - ".m4" 2837 | tm_scope: none 2838 | ace_mode: text 2839 | language_id: 215 2840 | M4Sugar: 2841 | type: programming 2842 | group: M4 2843 | aliases: 2844 | - autoconf 2845 | extensions: 2846 | - ".m4" 2847 | filenames: 2848 | - configure.ac 2849 | tm_scope: none 2850 | ace_mode: text 2851 | language_id: 216 2852 | MATLAB: 2853 | type: programming 2854 | color: "#e16737" 2855 | aliases: 2856 | - octave 2857 | extensions: 2858 | - ".matlab" 2859 | - ".m" 2860 | ace_mode: matlab 2861 | codemirror_mode: octave 2862 | codemirror_mime_type: text/x-octave 2863 | language_id: 225 2864 | MAXScript: 2865 | type: programming 2866 | color: "#00a6a6" 2867 | extensions: 2868 | - ".ms" 2869 | - ".mcr" 2870 | tm_scope: source.maxscript 2871 | ace_mode: text 2872 | language_id: 217 2873 | MQL4: 2874 | type: programming 2875 | color: "#62A8D6" 2876 | extensions: 2877 | - ".mq4" 2878 | - ".mqh" 2879 | tm_scope: source.mql5 2880 | ace_mode: c_cpp 2881 | language_id: 426 2882 | MQL5: 2883 | type: programming 2884 | color: "#4A76B8" 2885 | extensions: 2886 | - ".mq5" 2887 | - ".mqh" 2888 | tm_scope: source.mql5 2889 | ace_mode: c_cpp 2890 | language_id: 427 2891 | MTML: 2892 | type: markup 2893 | color: "#b7e1f4" 2894 | extensions: 2895 | - ".mtml" 2896 | tm_scope: text.html.basic 2897 | ace_mode: html 2898 | codemirror_mode: htmlmixed 2899 | codemirror_mime_type: text/html 2900 | language_id: 218 2901 | MUF: 2902 | type: programming 2903 | group: Forth 2904 | extensions: 2905 | - ".muf" 2906 | - ".m" 2907 | tm_scope: none 2908 | ace_mode: forth 2909 | codemirror_mode: forth 2910 | codemirror_mime_type: text/x-forth 2911 | language_id: 219 2912 | Makefile: 2913 | type: programming 2914 | color: "#427819" 2915 | aliases: 2916 | - bsdmake 2917 | - make 2918 | - mf 2919 | extensions: 2920 | - ".mak" 2921 | - ".d" 2922 | - ".make" 2923 | - ".mk" 2924 | - ".mkfile" 2925 | filenames: 2926 | - BSDmakefile 2927 | - GNUmakefile 2928 | - Kbuild 2929 | - Makefile 2930 | - Makefile.am 2931 | - Makefile.boot 2932 | - Makefile.frag 2933 | - Makefile.in 2934 | - Makefile.inc 2935 | - Makefile.wat 2936 | - makefile 2937 | - makefile.sco 2938 | - mkfile 2939 | interpreters: 2940 | - make 2941 | ace_mode: makefile 2942 | codemirror_mode: cmake 2943 | codemirror_mime_type: text/x-cmake 2944 | language_id: 220 2945 | Mako: 2946 | type: programming 2947 | extensions: 2948 | - ".mako" 2949 | - ".mao" 2950 | tm_scope: text.html.mako 2951 | ace_mode: text 2952 | language_id: 221 2953 | Markdown: 2954 | type: prose 2955 | aliases: 2956 | - pandoc 2957 | ace_mode: markdown 2958 | codemirror_mode: gfm 2959 | codemirror_mime_type: text/x-gfm 2960 | wrap: true 2961 | extensions: 2962 | - ".md" 2963 | - ".markdown" 2964 | - ".mdown" 2965 | - ".mdwn" 2966 | - ".mdx" 2967 | - ".mkd" 2968 | - ".mkdn" 2969 | - ".mkdown" 2970 | - ".ronn" 2971 | - ".workbook" 2972 | filenames: 2973 | - contents.lr 2974 | tm_scope: source.gfm 2975 | language_id: 222 2976 | Marko: 2977 | group: HTML 2978 | type: markup 2979 | tm_scope: text.marko 2980 | extensions: 2981 | - ".marko" 2982 | aliases: 2983 | - markojs 2984 | ace_mode: text 2985 | codemirror_mode: htmlmixed 2986 | codemirror_mime_type: text/html 2987 | language_id: 932782397 2988 | Mask: 2989 | type: markup 2990 | color: "#f97732" 2991 | ace_mode: mask 2992 | extensions: 2993 | - ".mask" 2994 | tm_scope: source.mask 2995 | language_id: 223 2996 | Mathematica: 2997 | type: programming 2998 | extensions: 2999 | - ".mathematica" 3000 | - ".cdf" 3001 | - ".m" 3002 | - ".ma" 3003 | - ".mt" 3004 | - ".nb" 3005 | - ".nbp" 3006 | - ".wl" 3007 | - ".wlt" 3008 | aliases: 3009 | - mma 3010 | ace_mode: text 3011 | codemirror_mode: mathematica 3012 | codemirror_mime_type: text/x-mathematica 3013 | language_id: 224 3014 | Maven POM: 3015 | type: data 3016 | tm_scope: text.xml.pom 3017 | filenames: 3018 | - pom.xml 3019 | ace_mode: xml 3020 | codemirror_mode: xml 3021 | codemirror_mime_type: text/xml 3022 | language_id: 226 3023 | Max: 3024 | type: programming 3025 | color: "#c4a79c" 3026 | aliases: 3027 | - max/msp 3028 | - maxmsp 3029 | extensions: 3030 | - ".maxpat" 3031 | - ".maxhelp" 3032 | - ".maxproj" 3033 | - ".mxt" 3034 | - ".pat" 3035 | tm_scope: source.json 3036 | ace_mode: json 3037 | codemirror_mode: javascript 3038 | codemirror_mime_type: application/json 3039 | language_id: 227 3040 | MediaWiki: 3041 | type: prose 3042 | wrap: true 3043 | extensions: 3044 | - ".mediawiki" 3045 | - ".wiki" 3046 | tm_scope: text.html.mediawiki 3047 | ace_mode: text 3048 | language_id: 228 3049 | Mercury: 3050 | type: programming 3051 | color: "#ff2b2b" 3052 | ace_mode: prolog 3053 | interpreters: 3054 | - mmi 3055 | extensions: 3056 | - ".m" 3057 | - ".moo" 3058 | tm_scope: source.mercury 3059 | language_id: 229 3060 | Meson: 3061 | type: programming 3062 | color: "#007800" 3063 | filenames: 3064 | - meson.build 3065 | - meson_options.txt 3066 | tm_scope: source.meson 3067 | ace_mode: text 3068 | language_id: 799141244 3069 | Metal: 3070 | type: programming 3071 | color: "#8f14e9" 3072 | extensions: 3073 | - ".metal" 3074 | tm_scope: source.c++ 3075 | ace_mode: c_cpp 3076 | codemirror_mode: clike 3077 | codemirror_mime_type: text/x-c++src 3078 | language_id: 230 3079 | MiniD: 3080 | type: programming 3081 | searchable: false 3082 | extensions: 3083 | - ".minid" 3084 | tm_scope: none 3085 | ace_mode: text 3086 | language_id: 231 3087 | Mirah: 3088 | type: programming 3089 | color: "#c7a938" 3090 | extensions: 3091 | - ".druby" 3092 | - ".duby" 3093 | - ".mirah" 3094 | tm_scope: source.ruby 3095 | ace_mode: ruby 3096 | codemirror_mode: ruby 3097 | codemirror_mime_type: text/x-ruby 3098 | language_id: 232 3099 | Modelica: 3100 | type: programming 3101 | extensions: 3102 | - ".mo" 3103 | tm_scope: source.modelica 3104 | ace_mode: text 3105 | codemirror_mode: modelica 3106 | codemirror_mime_type: text/x-modelica 3107 | language_id: 233 3108 | Modula-2: 3109 | type: programming 3110 | extensions: 3111 | - ".mod" 3112 | tm_scope: source.modula2 3113 | ace_mode: text 3114 | language_id: 234 3115 | Modula-3: 3116 | type: programming 3117 | extensions: 3118 | - ".i3" 3119 | - ".ig" 3120 | - ".m3" 3121 | - ".mg" 3122 | color: "#223388" 3123 | ace_mode: text 3124 | tm_scope: source.modula-3 3125 | language_id: 564743864 3126 | Module Management System: 3127 | type: programming 3128 | extensions: 3129 | - ".mms" 3130 | - ".mmk" 3131 | filenames: 3132 | - descrip.mmk 3133 | - descrip.mms 3134 | tm_scope: none 3135 | ace_mode: text 3136 | language_id: 235 3137 | Monkey: 3138 | type: programming 3139 | extensions: 3140 | - ".monkey" 3141 | - ".monkey2" 3142 | ace_mode: text 3143 | tm_scope: source.monkey 3144 | language_id: 236 3145 | Moocode: 3146 | type: programming 3147 | extensions: 3148 | - ".moo" 3149 | tm_scope: none 3150 | ace_mode: text 3151 | language_id: 237 3152 | MoonScript: 3153 | type: programming 3154 | extensions: 3155 | - ".moon" 3156 | interpreters: 3157 | - moon 3158 | ace_mode: text 3159 | language_id: 238 3160 | Motorola 68K Assembly: 3161 | type: programming 3162 | group: Assembly 3163 | extensions: 3164 | - ".X68" 3165 | tm_scope: source.m68k 3166 | ace_mode: assembly_x86 3167 | language_id: 477582706 3168 | Myghty: 3169 | type: programming 3170 | extensions: 3171 | - ".myt" 3172 | tm_scope: none 3173 | ace_mode: text 3174 | language_id: 239 3175 | NCL: 3176 | type: programming 3177 | color: "#28431f" 3178 | extensions: 3179 | - ".ncl" 3180 | tm_scope: source.ncl 3181 | ace_mode: text 3182 | language_id: 240 3183 | NL: 3184 | type: data 3185 | extensions: 3186 | - ".nl" 3187 | tm_scope: none 3188 | ace_mode: text 3189 | language_id: 241 3190 | NSIS: 3191 | type: programming 3192 | extensions: 3193 | - ".nsi" 3194 | - ".nsh" 3195 | ace_mode: text 3196 | codemirror_mode: nsis 3197 | codemirror_mime_type: text/x-nsis 3198 | language_id: 242 3199 | Nearley: 3200 | type: programming 3201 | ace_mode: text 3202 | color: "#990000" 3203 | extensions: 3204 | - ".ne" 3205 | - ".nearley" 3206 | tm_scope: source.ne 3207 | language_id: 521429430 3208 | Nemerle: 3209 | type: programming 3210 | color: "#3d3c6e" 3211 | extensions: 3212 | - ".n" 3213 | ace_mode: text 3214 | language_id: 243 3215 | NetLinx: 3216 | type: programming 3217 | color: "#0aa0ff" 3218 | extensions: 3219 | - ".axs" 3220 | - ".axi" 3221 | tm_scope: source.netlinx 3222 | ace_mode: text 3223 | language_id: 244 3224 | NetLinx+ERB: 3225 | type: programming 3226 | color: "#747faa" 3227 | extensions: 3228 | - ".axs.erb" 3229 | - ".axi.erb" 3230 | tm_scope: source.netlinx.erb 3231 | ace_mode: text 3232 | language_id: 245 3233 | NetLogo: 3234 | type: programming 3235 | color: "#ff6375" 3236 | extensions: 3237 | - ".nlogo" 3238 | tm_scope: source.lisp 3239 | ace_mode: lisp 3240 | codemirror_mode: commonlisp 3241 | codemirror_mime_type: text/x-common-lisp 3242 | language_id: 246 3243 | NewLisp: 3244 | type: programming 3245 | color: "#87AED7" 3246 | extensions: 3247 | - ".nl" 3248 | - ".lisp" 3249 | - ".lsp" 3250 | interpreters: 3251 | - newlisp 3252 | tm_scope: source.lisp 3253 | ace_mode: lisp 3254 | codemirror_mode: commonlisp 3255 | codemirror_mime_type: text/x-common-lisp 3256 | language_id: 247 3257 | Nextflow: 3258 | type: programming 3259 | ace_mode: groovy 3260 | tm_scope: source.nextflow 3261 | color: "#3ac486" 3262 | extensions: 3263 | - ".nf" 3264 | filenames: 3265 | - nextflow.config 3266 | interpreters: 3267 | - nextflow 3268 | language_id: 506780613 3269 | Nginx: 3270 | type: data 3271 | extensions: 3272 | - ".nginxconf" 3273 | - ".vhost" 3274 | filenames: 3275 | - nginx.conf 3276 | tm_scope: source.nginx 3277 | aliases: 3278 | - nginx configuration file 3279 | ace_mode: text 3280 | codemirror_mode: nginx 3281 | codemirror_mime_type: text/x-nginx-conf 3282 | language_id: 248 3283 | Nim: 3284 | type: programming 3285 | color: "#37775b" 3286 | extensions: 3287 | - ".nim" 3288 | - ".nim.cfg" 3289 | - ".nimble" 3290 | - ".nimrod" 3291 | - ".nims" 3292 | filenames: 3293 | - nim.cfg 3294 | ace_mode: text 3295 | tm_scope: source.nim 3296 | language_id: 249 3297 | Ninja: 3298 | type: data 3299 | tm_scope: source.ninja 3300 | extensions: 3301 | - ".ninja" 3302 | ace_mode: text 3303 | language_id: 250 3304 | Nit: 3305 | type: programming 3306 | color: "#009917" 3307 | extensions: 3308 | - ".nit" 3309 | tm_scope: source.nit 3310 | ace_mode: text 3311 | language_id: 251 3312 | Nix: 3313 | type: programming 3314 | color: "#7e7eff" 3315 | extensions: 3316 | - ".nix" 3317 | aliases: 3318 | - nixos 3319 | tm_scope: source.nix 3320 | ace_mode: nix 3321 | language_id: 252 3322 | Nu: 3323 | type: programming 3324 | color: "#c9df40" 3325 | aliases: 3326 | - nush 3327 | extensions: 3328 | - ".nu" 3329 | filenames: 3330 | - Nukefile 3331 | tm_scope: source.nu 3332 | ace_mode: scheme 3333 | codemirror_mode: scheme 3334 | codemirror_mime_type: text/x-scheme 3335 | interpreters: 3336 | - nush 3337 | language_id: 253 3338 | NumPy: 3339 | type: programming 3340 | group: Python 3341 | extensions: 3342 | - ".numpy" 3343 | - ".numpyw" 3344 | - ".numsc" 3345 | tm_scope: none 3346 | ace_mode: text 3347 | codemirror_mode: python 3348 | codemirror_mime_type: text/x-python 3349 | language_id: 254 3350 | OCaml: 3351 | type: programming 3352 | ace_mode: ocaml 3353 | codemirror_mode: mllike 3354 | codemirror_mime_type: text/x-ocaml 3355 | color: "#3be133" 3356 | extensions: 3357 | - ".ml" 3358 | - ".eliom" 3359 | - ".eliomi" 3360 | - ".ml4" 3361 | - ".mli" 3362 | - ".mll" 3363 | - ".mly" 3364 | interpreters: 3365 | - ocaml 3366 | - ocamlrun 3367 | - ocamlscript 3368 | tm_scope: source.ocaml 3369 | language_id: 255 3370 | ObjDump: 3371 | type: data 3372 | extensions: 3373 | - ".objdump" 3374 | tm_scope: objdump.x86asm 3375 | ace_mode: assembly_x86 3376 | language_id: 256 3377 | ObjectScript: 3378 | type: programming 3379 | extensions: 3380 | - ".cls" 3381 | language_id: 202735509 3382 | tm_scope: source.objectscript 3383 | color: "#424893" 3384 | ace_mode: text 3385 | Objective-C: 3386 | type: programming 3387 | tm_scope: source.objc 3388 | color: "#438eff" 3389 | aliases: 3390 | - obj-c 3391 | - objc 3392 | - objectivec 3393 | extensions: 3394 | - ".m" 3395 | - ".h" 3396 | ace_mode: objectivec 3397 | codemirror_mode: clike 3398 | codemirror_mime_type: text/x-objectivec 3399 | language_id: 257 3400 | Objective-C++: 3401 | type: programming 3402 | tm_scope: source.objc++ 3403 | color: "#6866fb" 3404 | aliases: 3405 | - obj-c++ 3406 | - objc++ 3407 | - objectivec++ 3408 | extensions: 3409 | - ".mm" 3410 | ace_mode: objectivec 3411 | codemirror_mode: clike 3412 | codemirror_mime_type: text/x-objectivec 3413 | language_id: 258 3414 | Objective-J: 3415 | type: programming 3416 | color: "#ff0c5a" 3417 | aliases: 3418 | - obj-j 3419 | - objectivej 3420 | - objj 3421 | extensions: 3422 | - ".j" 3423 | - ".sj" 3424 | tm_scope: source.js.objj 3425 | ace_mode: text 3426 | language_id: 259 3427 | Omgrofl: 3428 | type: programming 3429 | extensions: 3430 | - ".omgrofl" 3431 | color: "#cabbff" 3432 | tm_scope: none 3433 | ace_mode: text 3434 | language_id: 260 3435 | Opa: 3436 | type: programming 3437 | extensions: 3438 | - ".opa" 3439 | ace_mode: text 3440 | language_id: 261 3441 | Opal: 3442 | type: programming 3443 | color: "#f7ede0" 3444 | extensions: 3445 | - ".opal" 3446 | tm_scope: source.opal 3447 | ace_mode: text 3448 | language_id: 262 3449 | OpenCL: 3450 | type: programming 3451 | group: C 3452 | extensions: 3453 | - ".cl" 3454 | - ".opencl" 3455 | tm_scope: source.c 3456 | ace_mode: c_cpp 3457 | codemirror_mode: clike 3458 | codemirror_mime_type: text/x-csrc 3459 | language_id: 263 3460 | OpenEdge ABL: 3461 | type: programming 3462 | aliases: 3463 | - progress 3464 | - openedge 3465 | - abl 3466 | extensions: 3467 | - ".p" 3468 | - ".cls" 3469 | - ".w" 3470 | tm_scope: source.abl 3471 | ace_mode: text 3472 | language_id: 264 3473 | OpenRC runscript: 3474 | type: programming 3475 | group: Shell 3476 | aliases: 3477 | - openrc 3478 | interpreters: 3479 | - openrc-run 3480 | tm_scope: source.shell 3481 | ace_mode: sh 3482 | codemirror_mode: shell 3483 | codemirror_mime_type: text/x-sh 3484 | language_id: 265 3485 | OpenSCAD: 3486 | type: programming 3487 | extensions: 3488 | - ".scad" 3489 | tm_scope: source.scad 3490 | ace_mode: scad 3491 | language_id: 266 3492 | OpenType Feature File: 3493 | type: data 3494 | aliases: 3495 | - AFDKO 3496 | extensions: 3497 | - ".fea" 3498 | tm_scope: source.opentype 3499 | ace_mode: text 3500 | language_id: 374317347 3501 | Org: 3502 | type: prose 3503 | wrap: true 3504 | extensions: 3505 | - ".org" 3506 | tm_scope: none 3507 | ace_mode: text 3508 | language_id: 267 3509 | Ox: 3510 | type: programming 3511 | extensions: 3512 | - ".ox" 3513 | - ".oxh" 3514 | - ".oxo" 3515 | tm_scope: source.ox 3516 | ace_mode: text 3517 | language_id: 268 3518 | Oxygene: 3519 | type: programming 3520 | color: "#cdd0e3" 3521 | extensions: 3522 | - ".oxygene" 3523 | tm_scope: none 3524 | ace_mode: text 3525 | language_id: 269 3526 | Oz: 3527 | type: programming 3528 | color: "#fab738" 3529 | extensions: 3530 | - ".oz" 3531 | tm_scope: source.oz 3532 | ace_mode: text 3533 | codemirror_mode: oz 3534 | codemirror_mime_type: text/x-oz 3535 | language_id: 270 3536 | P4: 3537 | type: programming 3538 | color: "#7055b5" 3539 | extensions: 3540 | - ".p4" 3541 | tm_scope: source.p4 3542 | ace_mode: text 3543 | language_id: 348895984 3544 | PHP: 3545 | type: programming 3546 | tm_scope: text.html.php 3547 | ace_mode: php 3548 | codemirror_mode: php 3549 | codemirror_mime_type: application/x-httpd-php 3550 | color: "#4F5D95" 3551 | extensions: 3552 | - ".php" 3553 | - ".aw" 3554 | - ".ctp" 3555 | - ".fcgi" 3556 | - ".inc" 3557 | - ".php3" 3558 | - ".php4" 3559 | - ".php5" 3560 | - ".phps" 3561 | - ".phpt" 3562 | filenames: 3563 | - ".php" 3564 | - ".php_cs" 3565 | - ".php_cs.dist" 3566 | - Phakefile 3567 | interpreters: 3568 | - php 3569 | aliases: 3570 | - inc 3571 | language_id: 272 3572 | PLSQL: 3573 | type: programming 3574 | ace_mode: sql 3575 | codemirror_mode: sql 3576 | codemirror_mime_type: text/x-plsql 3577 | tm_scope: none 3578 | color: "#dad8d8" 3579 | extensions: 3580 | - ".pls" 3581 | - ".bdy" 3582 | - ".ddl" 3583 | - ".fnc" 3584 | - ".pck" 3585 | - ".pkb" 3586 | - ".pks" 3587 | - ".plb" 3588 | - ".plsql" 3589 | - ".prc" 3590 | - ".spc" 3591 | - ".sql" 3592 | - ".tpb" 3593 | - ".tps" 3594 | - ".trg" 3595 | - ".vw" 3596 | language_id: 273 3597 | PLpgSQL: 3598 | type: programming 3599 | ace_mode: pgsql 3600 | codemirror_mode: sql 3601 | codemirror_mime_type: text/x-sql 3602 | tm_scope: source.sql 3603 | extensions: 3604 | - ".pgsql" 3605 | - ".sql" 3606 | language_id: 274 3607 | POV-Ray SDL: 3608 | type: programming 3609 | aliases: 3610 | - pov-ray 3611 | - povray 3612 | extensions: 3613 | - ".pov" 3614 | - ".inc" 3615 | ace_mode: text 3616 | language_id: 275 3617 | Pan: 3618 | type: programming 3619 | color: "#cc0000" 3620 | extensions: 3621 | - ".pan" 3622 | tm_scope: source.pan 3623 | ace_mode: text 3624 | language_id: 276 3625 | Papyrus: 3626 | type: programming 3627 | color: "#6600cc" 3628 | extensions: 3629 | - ".psc" 3630 | tm_scope: source.papyrus.skyrim 3631 | ace_mode: text 3632 | language_id: 277 3633 | Parrot: 3634 | type: programming 3635 | color: "#f3ca0a" 3636 | extensions: 3637 | - ".parrot" 3638 | tm_scope: none 3639 | ace_mode: text 3640 | language_id: 278 3641 | Parrot Assembly: 3642 | group: Parrot 3643 | type: programming 3644 | aliases: 3645 | - pasm 3646 | extensions: 3647 | - ".pasm" 3648 | interpreters: 3649 | - parrot 3650 | tm_scope: none 3651 | ace_mode: text 3652 | language_id: 279 3653 | Parrot Internal Representation: 3654 | group: Parrot 3655 | tm_scope: source.parrot.pir 3656 | type: programming 3657 | aliases: 3658 | - pir 3659 | extensions: 3660 | - ".pir" 3661 | interpreters: 3662 | - parrot 3663 | ace_mode: text 3664 | language_id: 280 3665 | Pascal: 3666 | type: programming 3667 | color: "#E3F171" 3668 | extensions: 3669 | - ".pas" 3670 | - ".dfm" 3671 | - ".dpr" 3672 | - ".inc" 3673 | - ".lpr" 3674 | - ".pascal" 3675 | - ".pp" 3676 | interpreters: 3677 | - instantfpc 3678 | ace_mode: pascal 3679 | codemirror_mode: pascal 3680 | codemirror_mime_type: text/x-pascal 3681 | language_id: 281 3682 | Pawn: 3683 | type: programming 3684 | color: "#dbb284" 3685 | extensions: 3686 | - ".pwn" 3687 | - ".inc" 3688 | - ".sma" 3689 | tm_scope: source.pawn 3690 | ace_mode: text 3691 | language_id: 271 3692 | Pep8: 3693 | type: programming 3694 | color: "#C76F5B" 3695 | extensions: 3696 | - ".pep" 3697 | ace_mode: text 3698 | tm_scope: source.pep8 3699 | language_id: 840372442 3700 | Perl: 3701 | type: programming 3702 | tm_scope: source.perl 3703 | ace_mode: perl 3704 | codemirror_mode: perl 3705 | codemirror_mime_type: text/x-perl 3706 | color: "#0298c3" 3707 | extensions: 3708 | - ".pl" 3709 | - ".al" 3710 | - ".cgi" 3711 | - ".fcgi" 3712 | - ".perl" 3713 | - ".ph" 3714 | - ".plx" 3715 | - ".pm" 3716 | - ".psgi" 3717 | - ".t" 3718 | filenames: 3719 | - Makefile.PL 3720 | - Rexfile 3721 | - ack 3722 | - cpanfile 3723 | interpreters: 3724 | - cperl 3725 | - perl 3726 | aliases: 3727 | - cperl 3728 | language_id: 282 3729 | Perl 6: 3730 | type: programming 3731 | color: "#0000fb" 3732 | extensions: 3733 | - ".6pl" 3734 | - ".6pm" 3735 | - ".nqp" 3736 | - ".p6" 3737 | - ".p6l" 3738 | - ".p6m" 3739 | - ".pl" 3740 | - ".pl6" 3741 | - ".pm" 3742 | - ".pm6" 3743 | - ".t" 3744 | interpreters: 3745 | - perl6 3746 | aliases: 3747 | - perl6 3748 | tm_scope: source.perl6fe 3749 | ace_mode: perl 3750 | codemirror_mode: perl 3751 | codemirror_mime_type: text/x-perl 3752 | language_id: 283 3753 | Pic: 3754 | type: markup 3755 | group: Roff 3756 | tm_scope: source.pic 3757 | extensions: 3758 | - ".pic" 3759 | - ".chem" 3760 | ace_mode: text 3761 | codemirror_mode: troff 3762 | codemirror_mime_type: text/troff 3763 | language_id: 425 3764 | Pickle: 3765 | type: data 3766 | extensions: 3767 | - ".pkl" 3768 | tm_scope: none 3769 | ace_mode: text 3770 | language_id: 284 3771 | PicoLisp: 3772 | type: programming 3773 | extensions: 3774 | - ".l" 3775 | interpreters: 3776 | - picolisp 3777 | - pil 3778 | tm_scope: source.lisp 3779 | ace_mode: lisp 3780 | language_id: 285 3781 | PigLatin: 3782 | type: programming 3783 | color: "#fcd7de" 3784 | extensions: 3785 | - ".pig" 3786 | tm_scope: source.pig_latin 3787 | ace_mode: text 3788 | language_id: 286 3789 | Pike: 3790 | type: programming 3791 | color: "#005390" 3792 | extensions: 3793 | - ".pike" 3794 | - ".pmod" 3795 | interpreters: 3796 | - pike 3797 | ace_mode: text 3798 | language_id: 287 3799 | Pod: 3800 | type: prose 3801 | ace_mode: perl 3802 | codemirror_mode: perl 3803 | codemirror_mime_type: text/x-perl 3804 | wrap: true 3805 | extensions: 3806 | - ".pod" 3807 | interpreters: 3808 | - perl 3809 | tm_scope: none 3810 | language_id: 288 3811 | Pod 6: 3812 | type: prose 3813 | ace_mode: perl 3814 | tm_scope: source.perl6fe 3815 | wrap: true 3816 | extensions: 3817 | - ".pod" 3818 | - ".pod6" 3819 | interpreters: 3820 | - perl6 3821 | language_id: 155357471 3822 | PogoScript: 3823 | type: programming 3824 | color: "#d80074" 3825 | extensions: 3826 | - ".pogo" 3827 | tm_scope: source.pogoscript 3828 | ace_mode: text 3829 | language_id: 289 3830 | Pony: 3831 | type: programming 3832 | extensions: 3833 | - ".pony" 3834 | tm_scope: source.pony 3835 | ace_mode: text 3836 | language_id: 290 3837 | PostCSS: 3838 | type: markup 3839 | tm_scope: source.postcss 3840 | group: CSS 3841 | extensions: 3842 | - ".pcss" 3843 | ace_mode: text 3844 | language_id: 262764437 3845 | PostScript: 3846 | type: markup 3847 | color: "#da291c" 3848 | extensions: 3849 | - ".ps" 3850 | - ".eps" 3851 | - ".pfa" 3852 | tm_scope: source.postscript 3853 | aliases: 3854 | - postscr 3855 | ace_mode: text 3856 | language_id: 291 3857 | PowerBuilder: 3858 | type: programming 3859 | color: "#8f0f8d" 3860 | extensions: 3861 | - ".pbt" 3862 | - ".sra" 3863 | - ".sru" 3864 | - ".srw" 3865 | tm_scope: none 3866 | ace_mode: text 3867 | language_id: 292 3868 | PowerShell: 3869 | type: programming 3870 | color: "#012456" 3871 | ace_mode: powershell 3872 | codemirror_mode: powershell 3873 | codemirror_mime_type: application/x-powershell 3874 | aliases: 3875 | - posh 3876 | - pwsh 3877 | extensions: 3878 | - ".ps1" 3879 | - ".psd1" 3880 | - ".psm1" 3881 | interpreters: 3882 | - pwsh 3883 | language_id: 293 3884 | Processing: 3885 | type: programming 3886 | color: "#0096D8" 3887 | extensions: 3888 | - ".pde" 3889 | ace_mode: text 3890 | language_id: 294 3891 | Prolog: 3892 | type: programming 3893 | color: "#74283c" 3894 | extensions: 3895 | - ".pl" 3896 | - ".pro" 3897 | - ".prolog" 3898 | - ".yap" 3899 | interpreters: 3900 | - swipl 3901 | - yap 3902 | tm_scope: source.prolog 3903 | ace_mode: prolog 3904 | language_id: 295 3905 | Propeller Spin: 3906 | type: programming 3907 | color: "#7fa2a7" 3908 | extensions: 3909 | - ".spin" 3910 | tm_scope: source.spin 3911 | ace_mode: text 3912 | language_id: 296 3913 | Protocol Buffer: 3914 | type: data 3915 | aliases: 3916 | - protobuf 3917 | - Protocol Buffers 3918 | extensions: 3919 | - ".proto" 3920 | tm_scope: source.protobuf 3921 | ace_mode: protobuf 3922 | codemirror_mode: protobuf 3923 | codemirror_mime_type: text/x-protobuf 3924 | language_id: 297 3925 | Public Key: 3926 | type: data 3927 | extensions: 3928 | - ".asc" 3929 | - ".pub" 3930 | tm_scope: none 3931 | ace_mode: text 3932 | codemirror_mode: asciiarmor 3933 | codemirror_mime_type: application/pgp 3934 | language_id: 298 3935 | Pug: 3936 | group: HTML 3937 | type: markup 3938 | extensions: 3939 | - ".jade" 3940 | - ".pug" 3941 | tm_scope: text.jade 3942 | ace_mode: jade 3943 | codemirror_mode: pug 3944 | codemirror_mime_type: text/x-pug 3945 | language_id: 179 3946 | Puppet: 3947 | type: programming 3948 | color: "#302B6D" 3949 | extensions: 3950 | - ".pp" 3951 | filenames: 3952 | - Modulefile 3953 | ace_mode: text 3954 | codemirror_mode: puppet 3955 | codemirror_mime_type: text/x-puppet 3956 | tm_scope: source.puppet 3957 | language_id: 299 3958 | Pure Data: 3959 | type: data 3960 | extensions: 3961 | - ".pd" 3962 | tm_scope: none 3963 | ace_mode: text 3964 | language_id: 300 3965 | PureBasic: 3966 | type: programming 3967 | color: "#5a6986" 3968 | extensions: 3969 | - ".pb" 3970 | - ".pbi" 3971 | tm_scope: none 3972 | ace_mode: text 3973 | language_id: 301 3974 | PureScript: 3975 | type: programming 3976 | color: "#1D222D" 3977 | extensions: 3978 | - ".purs" 3979 | tm_scope: source.purescript 3980 | ace_mode: haskell 3981 | codemirror_mode: haskell 3982 | codemirror_mime_type: text/x-haskell 3983 | language_id: 302 3984 | Python: 3985 | type: programming 3986 | ace_mode: python 3987 | codemirror_mode: python 3988 | codemirror_mime_type: text/x-python 3989 | color: "#3572A5" 3990 | extensions: 3991 | - ".py" 3992 | - ".bzl" 3993 | - ".cgi" 3994 | - ".fcgi" 3995 | - ".gyp" 3996 | - ".gypi" 3997 | - ".lmi" 3998 | - ".py3" 3999 | - ".pyde" 4000 | - ".pyi" 4001 | - ".pyp" 4002 | - ".pyt" 4003 | - ".pyw" 4004 | - ".rpy" 4005 | - ".spec" 4006 | - ".tac" 4007 | - ".wsgi" 4008 | - ".xpy" 4009 | filenames: 4010 | - ".gclient" 4011 | - BUCK 4012 | - BUILD 4013 | - BUILD.bazel 4014 | - DEPS 4015 | - SConscript 4016 | - SConstruct 4017 | - Snakefile 4018 | - WORKSPACE 4019 | - wscript 4020 | interpreters: 4021 | - python 4022 | - python2 4023 | - python3 4024 | aliases: 4025 | - rusthon 4026 | - python3 4027 | language_id: 303 4028 | Python console: 4029 | type: programming 4030 | group: Python 4031 | searchable: false 4032 | aliases: 4033 | - pycon 4034 | tm_scope: text.python.console 4035 | ace_mode: text 4036 | language_id: 428 4037 | Python traceback: 4038 | type: data 4039 | group: Python 4040 | searchable: false 4041 | extensions: 4042 | - ".pytb" 4043 | tm_scope: text.python.traceback 4044 | ace_mode: text 4045 | language_id: 304 4046 | QML: 4047 | type: programming 4048 | color: "#44a51c" 4049 | extensions: 4050 | - ".qml" 4051 | - ".qbs" 4052 | tm_scope: source.qml 4053 | ace_mode: text 4054 | language_id: 305 4055 | QMake: 4056 | type: programming 4057 | extensions: 4058 | - ".pro" 4059 | - ".pri" 4060 | interpreters: 4061 | - qmake 4062 | ace_mode: text 4063 | language_id: 306 4064 | Quake: 4065 | type: programming 4066 | filenames: 4067 | - m3makefile 4068 | - m3overrides 4069 | color: "#882233" 4070 | ace_mode: text 4071 | tm_scope: source.quake 4072 | language_id: 375265331 4073 | R: 4074 | type: programming 4075 | color: "#198CE7" 4076 | aliases: 4077 | - R 4078 | - Rscript 4079 | - splus 4080 | extensions: 4081 | - ".r" 4082 | - ".rd" 4083 | - ".rsx" 4084 | filenames: 4085 | - ".Rprofile" 4086 | - expr-dist 4087 | interpreters: 4088 | - Rscript 4089 | ace_mode: r 4090 | codemirror_mode: r 4091 | codemirror_mime_type: text/x-rsrc 4092 | language_id: 307 4093 | RAML: 4094 | type: markup 4095 | ace_mode: yaml 4096 | codemirror_mode: yaml 4097 | codemirror_mime_type: text/x-yaml 4098 | tm_scope: source.yaml 4099 | color: "#77d9fb" 4100 | extensions: 4101 | - ".raml" 4102 | language_id: 308 4103 | RDoc: 4104 | type: prose 4105 | ace_mode: rdoc 4106 | wrap: true 4107 | extensions: 4108 | - ".rdoc" 4109 | tm_scope: text.rdoc 4110 | language_id: 309 4111 | REALbasic: 4112 | type: programming 4113 | extensions: 4114 | - ".rbbas" 4115 | - ".rbfrm" 4116 | - ".rbmnu" 4117 | - ".rbres" 4118 | - ".rbtbar" 4119 | - ".rbuistate" 4120 | tm_scope: source.vbnet 4121 | ace_mode: text 4122 | language_id: 310 4123 | REXX: 4124 | type: programming 4125 | aliases: 4126 | - arexx 4127 | extensions: 4128 | - ".rexx" 4129 | - ".pprx" 4130 | - ".rex" 4131 | interpreters: 4132 | - regina 4133 | - rexx 4134 | tm_scope: source.rexx 4135 | ace_mode: text 4136 | language_id: 311 4137 | RHTML: 4138 | type: markup 4139 | group: HTML 4140 | extensions: 4141 | - ".rhtml" 4142 | tm_scope: text.html.erb 4143 | aliases: 4144 | - html+ruby 4145 | ace_mode: rhtml 4146 | codemirror_mode: htmlembedded 4147 | codemirror_mime_type: application/x-erb 4148 | language_id: 312 4149 | RMarkdown: 4150 | type: prose 4151 | wrap: true 4152 | ace_mode: markdown 4153 | codemirror_mode: gfm 4154 | codemirror_mime_type: text/x-gfm 4155 | extensions: 4156 | - ".rmd" 4157 | tm_scope: source.gfm 4158 | language_id: 313 4159 | RPC: 4160 | type: programming 4161 | aliases: 4162 | - rpcgen 4163 | - oncrpc 4164 | - xdr 4165 | ace_mode: c_cpp 4166 | extensions: 4167 | - ".x" 4168 | tm_scope: source.c 4169 | language_id: 1031374237 4170 | RPM Spec: 4171 | type: data 4172 | tm_scope: source.rpm-spec 4173 | extensions: 4174 | - ".spec" 4175 | aliases: 4176 | - specfile 4177 | ace_mode: text 4178 | codemirror_mode: rpm 4179 | codemirror_mime_type: text/x-rpm-spec 4180 | language_id: 314 4181 | RUNOFF: 4182 | type: markup 4183 | color: "#665a4e" 4184 | extensions: 4185 | - ".rnh" 4186 | - ".rno" 4187 | tm_scope: text.runoff 4188 | ace_mode: text 4189 | language_id: 315 4190 | Racket: 4191 | type: programming 4192 | color: "#3c5caa" 4193 | extensions: 4194 | - ".rkt" 4195 | - ".rktd" 4196 | - ".rktl" 4197 | - ".scrbl" 4198 | interpreters: 4199 | - racket 4200 | tm_scope: source.racket 4201 | ace_mode: lisp 4202 | language_id: 316 4203 | Ragel: 4204 | type: programming 4205 | color: "#9d5200" 4206 | extensions: 4207 | - ".rl" 4208 | aliases: 4209 | - ragel-rb 4210 | - ragel-ruby 4211 | tm_scope: none 4212 | ace_mode: text 4213 | language_id: 317 4214 | Rascal: 4215 | type: programming 4216 | color: "#fffaa0" 4217 | extensions: 4218 | - ".rsc" 4219 | tm_scope: source.rascal 4220 | ace_mode: text 4221 | language_id: 173616037 4222 | Raw token data: 4223 | type: data 4224 | aliases: 4225 | - raw 4226 | extensions: 4227 | - ".raw" 4228 | tm_scope: none 4229 | ace_mode: text 4230 | language_id: 318 4231 | Reason: 4232 | type: programming 4233 | group: OCaml 4234 | ace_mode: rust 4235 | codemirror_mode: rust 4236 | codemirror_mime_type: text/x-rustsrc 4237 | extensions: 4238 | - ".re" 4239 | - ".rei" 4240 | interpreters: 4241 | - ocaml 4242 | tm_scope: source.reason 4243 | language_id: 869538413 4244 | Rebol: 4245 | type: programming 4246 | color: "#358a5b" 4247 | extensions: 4248 | - ".reb" 4249 | - ".r" 4250 | - ".r2" 4251 | - ".r3" 4252 | - ".rebol" 4253 | ace_mode: text 4254 | tm_scope: source.rebol 4255 | language_id: 319 4256 | Red: 4257 | type: programming 4258 | color: "#f50000" 4259 | extensions: 4260 | - ".red" 4261 | - ".reds" 4262 | aliases: 4263 | - red/system 4264 | tm_scope: source.red 4265 | ace_mode: text 4266 | language_id: 320 4267 | Redcode: 4268 | type: programming 4269 | extensions: 4270 | - ".cw" 4271 | tm_scope: none 4272 | ace_mode: text 4273 | language_id: 321 4274 | Regular Expression: 4275 | type: data 4276 | extensions: 4277 | - ".regexp" 4278 | - ".regex" 4279 | aliases: 4280 | - regexp 4281 | - regex 4282 | ace_mode: text 4283 | tm_scope: source.regexp 4284 | language_id: 363378884 4285 | Ren'Py: 4286 | type: programming 4287 | aliases: 4288 | - renpy 4289 | color: "#ff7f7f" 4290 | extensions: 4291 | - ".rpy" 4292 | tm_scope: source.renpy 4293 | ace_mode: python 4294 | language_id: 322 4295 | RenderScript: 4296 | type: programming 4297 | extensions: 4298 | - ".rs" 4299 | - ".rsh" 4300 | tm_scope: none 4301 | ace_mode: text 4302 | language_id: 323 4303 | Rich Text Format: 4304 | type: markup 4305 | extensions: 4306 | - ".rtf" 4307 | tm_scope: text.rtf 4308 | ace_mode: text 4309 | language_id: 51601661 4310 | Ring: 4311 | type: programming 4312 | color: "#2D54CB" 4313 | extensions: 4314 | - ".ring" 4315 | tm_scope: source.ring 4316 | ace_mode: text 4317 | language_id: 431 4318 | RobotFramework: 4319 | type: programming 4320 | extensions: 4321 | - ".robot" 4322 | tm_scope: text.robot 4323 | ace_mode: text 4324 | language_id: 324 4325 | Roff: 4326 | type: markup 4327 | color: "#ecdebe" 4328 | extensions: 4329 | - ".roff" 4330 | - ".1" 4331 | - ".1in" 4332 | - ".1m" 4333 | - ".1x" 4334 | - ".2" 4335 | - ".3" 4336 | - ".3in" 4337 | - ".3m" 4338 | - ".3p" 4339 | - ".3pm" 4340 | - ".3qt" 4341 | - ".3x" 4342 | - ".4" 4343 | - ".5" 4344 | - ".6" 4345 | - ".7" 4346 | - ".8" 4347 | - ".9" 4348 | - ".l" 4349 | - ".man" 4350 | - ".mdoc" 4351 | - ".me" 4352 | - ".ms" 4353 | - ".n" 4354 | - ".nr" 4355 | - ".rno" 4356 | - ".tmac" 4357 | filenames: 4358 | - mmn 4359 | - mmt 4360 | tm_scope: text.roff 4361 | aliases: 4362 | - groff 4363 | - man 4364 | - manpage 4365 | - man page 4366 | - man-page 4367 | - mdoc 4368 | - nroff 4369 | - troff 4370 | ace_mode: text 4371 | codemirror_mode: troff 4372 | codemirror_mime_type: text/troff 4373 | language_id: 141 4374 | Roff Manpage: 4375 | type: markup 4376 | group: Roff 4377 | extensions: 4378 | - ".1" 4379 | - ".1in" 4380 | - ".1m" 4381 | - ".1x" 4382 | - ".2" 4383 | - ".3" 4384 | - ".3in" 4385 | - ".3m" 4386 | - ".3p" 4387 | - ".3pm" 4388 | - ".3qt" 4389 | - ".3x" 4390 | - ".4" 4391 | - ".5" 4392 | - ".6" 4393 | - ".7" 4394 | - ".8" 4395 | - ".9" 4396 | - ".man" 4397 | - ".mdoc" 4398 | tm_scope: text.roff 4399 | ace_mode: text 4400 | codemirror_mode: troff 4401 | codemirror_mime_type: text/troff 4402 | language_id: 612669833 4403 | Rouge: 4404 | type: programming 4405 | ace_mode: clojure 4406 | codemirror_mode: clojure 4407 | codemirror_mime_type: text/x-clojure 4408 | color: "#cc0088" 4409 | extensions: 4410 | - ".rg" 4411 | tm_scope: source.clojure 4412 | language_id: 325 4413 | Ruby: 4414 | type: programming 4415 | ace_mode: ruby 4416 | codemirror_mode: ruby 4417 | codemirror_mime_type: text/x-ruby 4418 | color: "#701516" 4419 | aliases: 4420 | - jruby 4421 | - macruby 4422 | - rake 4423 | - rb 4424 | - rbx 4425 | extensions: 4426 | - ".rb" 4427 | - ".builder" 4428 | - ".eye" 4429 | - ".fcgi" 4430 | - ".gemspec" 4431 | - ".god" 4432 | - ".jbuilder" 4433 | - ".mspec" 4434 | - ".pluginspec" 4435 | - ".podspec" 4436 | - ".rabl" 4437 | - ".rake" 4438 | - ".rbuild" 4439 | - ".rbw" 4440 | - ".rbx" 4441 | - ".ru" 4442 | - ".ruby" 4443 | - ".spec" 4444 | - ".thor" 4445 | - ".watchr" 4446 | interpreters: 4447 | - ruby 4448 | - macruby 4449 | - rake 4450 | - jruby 4451 | - rbx 4452 | filenames: 4453 | - ".irbrc" 4454 | - ".pryrc" 4455 | - Appraisals 4456 | - Berksfile 4457 | - Brewfile 4458 | - Buildfile 4459 | - Capfile 4460 | - Dangerfile 4461 | - Deliverfile 4462 | - Fastfile 4463 | - Gemfile 4464 | - Gemfile.lock 4465 | - Guardfile 4466 | - Jarfile 4467 | - Mavenfile 4468 | - Podfile 4469 | - Puppetfile 4470 | - Rakefile 4471 | - Snapfile 4472 | - Thorfile 4473 | - Vagrantfile 4474 | - buildfile 4475 | language_id: 326 4476 | Rust: 4477 | type: programming 4478 | color: "#dea584" 4479 | extensions: 4480 | - ".rs" 4481 | - ".rs.in" 4482 | ace_mode: rust 4483 | codemirror_mode: rust 4484 | codemirror_mime_type: text/x-rustsrc 4485 | language_id: 327 4486 | SAS: 4487 | type: programming 4488 | color: "#B34936" 4489 | extensions: 4490 | - ".sas" 4491 | tm_scope: source.sas 4492 | ace_mode: text 4493 | codemirror_mode: sas 4494 | codemirror_mime_type: text/x-sas 4495 | language_id: 328 4496 | SCSS: 4497 | type: markup 4498 | tm_scope: source.css.scss 4499 | group: CSS 4500 | ace_mode: scss 4501 | codemirror_mode: css 4502 | codemirror_mime_type: text/x-scss 4503 | extensions: 4504 | - ".scss" 4505 | language_id: 329 4506 | SMT: 4507 | type: programming 4508 | extensions: 4509 | - ".smt2" 4510 | - ".smt" 4511 | interpreters: 4512 | - boolector 4513 | - cvc4 4514 | - mathsat5 4515 | - opensmt 4516 | - smtinterpol 4517 | - smt-rat 4518 | - stp 4519 | - verit 4520 | - yices2 4521 | - z3 4522 | tm_scope: source.smt 4523 | ace_mode: text 4524 | language_id: 330 4525 | SPARQL: 4526 | type: data 4527 | tm_scope: source.sparql 4528 | ace_mode: text 4529 | codemirror_mode: sparql 4530 | codemirror_mime_type: application/sparql-query 4531 | extensions: 4532 | - ".sparql" 4533 | - ".rq" 4534 | language_id: 331 4535 | SQF: 4536 | type: programming 4537 | color: "#3F3F3F" 4538 | extensions: 4539 | - ".sqf" 4540 | - ".hqf" 4541 | tm_scope: source.sqf 4542 | ace_mode: text 4543 | language_id: 332 4544 | SQL: 4545 | type: data 4546 | tm_scope: source.sql 4547 | ace_mode: sql 4548 | codemirror_mode: sql 4549 | codemirror_mime_type: text/x-sql 4550 | extensions: 4551 | - ".sql" 4552 | - ".cql" 4553 | - ".ddl" 4554 | - ".inc" 4555 | - ".mysql" 4556 | - ".prc" 4557 | - ".tab" 4558 | - ".udf" 4559 | - ".viw" 4560 | language_id: 333 4561 | SQLPL: 4562 | type: programming 4563 | ace_mode: sql 4564 | codemirror_mode: sql 4565 | codemirror_mime_type: text/x-sql 4566 | tm_scope: source.sql 4567 | extensions: 4568 | - ".sql" 4569 | - ".db2" 4570 | language_id: 334 4571 | SRecode Template: 4572 | type: markup 4573 | color: "#348a34" 4574 | tm_scope: source.lisp 4575 | ace_mode: lisp 4576 | codemirror_mode: commonlisp 4577 | codemirror_mime_type: text/x-common-lisp 4578 | extensions: 4579 | - ".srt" 4580 | language_id: 335 4581 | SSH Config: 4582 | type: data 4583 | group: INI 4584 | filenames: 4585 | - ssh-config 4586 | - ssh_config 4587 | - sshconfig 4588 | - sshconfig.snip 4589 | - sshd-config 4590 | - sshd_config 4591 | ace_mode: text 4592 | tm_scope: source.ssh-config 4593 | language_id: 554920715 4594 | STON: 4595 | type: data 4596 | group: Smalltalk 4597 | extensions: 4598 | - ".ston" 4599 | tm_scope: source.smalltalk 4600 | ace_mode: text 4601 | language_id: 336 4602 | SVG: 4603 | type: data 4604 | extensions: 4605 | - ".svg" 4606 | tm_scope: text.xml 4607 | ace_mode: xml 4608 | codemirror_mode: xml 4609 | codemirror_mime_type: text/xml 4610 | language_id: 337 4611 | Sage: 4612 | type: programming 4613 | group: Python 4614 | extensions: 4615 | - ".sage" 4616 | - ".sagews" 4617 | tm_scope: source.python 4618 | ace_mode: python 4619 | codemirror_mode: python 4620 | codemirror_mime_type: text/x-python 4621 | language_id: 338 4622 | SaltStack: 4623 | type: programming 4624 | color: "#646464" 4625 | aliases: 4626 | - saltstate 4627 | - salt 4628 | extensions: 4629 | - ".sls" 4630 | tm_scope: source.yaml.salt 4631 | ace_mode: yaml 4632 | codemirror_mode: yaml 4633 | codemirror_mime_type: text/x-yaml 4634 | language_id: 339 4635 | Sass: 4636 | type: markup 4637 | tm_scope: source.sass 4638 | group: CSS 4639 | extensions: 4640 | - ".sass" 4641 | ace_mode: sass 4642 | codemirror_mode: sass 4643 | codemirror_mime_type: text/x-sass 4644 | language_id: 340 4645 | Scala: 4646 | type: programming 4647 | ace_mode: scala 4648 | codemirror_mode: clike 4649 | codemirror_mime_type: text/x-scala 4650 | color: "#c22d40" 4651 | extensions: 4652 | - ".scala" 4653 | - ".kojo" 4654 | - ".sbt" 4655 | - ".sc" 4656 | interpreters: 4657 | - scala 4658 | language_id: 341 4659 | Scaml: 4660 | group: HTML 4661 | type: markup 4662 | extensions: 4663 | - ".scaml" 4664 | tm_scope: source.scaml 4665 | ace_mode: text 4666 | language_id: 342 4667 | Scheme: 4668 | type: programming 4669 | color: "#1e4aec" 4670 | extensions: 4671 | - ".scm" 4672 | - ".sch" 4673 | - ".sld" 4674 | - ".sls" 4675 | - ".sps" 4676 | - ".ss" 4677 | interpreters: 4678 | - scheme 4679 | - guile 4680 | - bigloo 4681 | - chicken 4682 | - csi 4683 | - gosh 4684 | - r6rs 4685 | ace_mode: scheme 4686 | codemirror_mode: scheme 4687 | codemirror_mime_type: text/x-scheme 4688 | language_id: 343 4689 | Scilab: 4690 | type: programming 4691 | extensions: 4692 | - ".sci" 4693 | - ".sce" 4694 | - ".tst" 4695 | ace_mode: text 4696 | language_id: 344 4697 | Self: 4698 | type: programming 4699 | color: "#0579aa" 4700 | extensions: 4701 | - ".self" 4702 | tm_scope: none 4703 | ace_mode: text 4704 | language_id: 345 4705 | ShaderLab: 4706 | type: programming 4707 | extensions: 4708 | - ".shader" 4709 | ace_mode: text 4710 | tm_scope: source.shaderlab 4711 | language_id: 664257356 4712 | Shell: 4713 | type: programming 4714 | color: "#89e051" 4715 | aliases: 4716 | - sh 4717 | - shell-script 4718 | - bash 4719 | - zsh 4720 | extensions: 4721 | - ".sh" 4722 | - ".bash" 4723 | - ".bats" 4724 | - ".cgi" 4725 | - ".command" 4726 | - ".fcgi" 4727 | - ".ksh" 4728 | - ".sh.in" 4729 | - ".tmux" 4730 | - ".tool" 4731 | - ".zsh" 4732 | filenames: 4733 | - ".bash_aliases" 4734 | - ".bash_history" 4735 | - ".bash_logout" 4736 | - ".bash_profile" 4737 | - ".bashrc" 4738 | - ".cshrc" 4739 | - ".login" 4740 | - ".profile" 4741 | - ".zlogin" 4742 | - ".zlogout" 4743 | - ".zprofile" 4744 | - ".zshenv" 4745 | - ".zshrc" 4746 | - 9fs 4747 | - PKGBUILD 4748 | - bash_aliases 4749 | - bash_logout 4750 | - bash_profile 4751 | - bashrc 4752 | - cshrc 4753 | - gradlew 4754 | - login 4755 | - man 4756 | - profile 4757 | - zlogin 4758 | - zlogout 4759 | - zprofile 4760 | - zshenv 4761 | - zshrc 4762 | interpreters: 4763 | - ash 4764 | - bash 4765 | - dash 4766 | - ksh 4767 | - mksh 4768 | - pdksh 4769 | - rc 4770 | - sh 4771 | - zsh 4772 | ace_mode: sh 4773 | codemirror_mode: shell 4774 | codemirror_mime_type: text/x-sh 4775 | language_id: 346 4776 | ShellSession: 4777 | type: programming 4778 | extensions: 4779 | - ".sh-session" 4780 | aliases: 4781 | - bash session 4782 | - console 4783 | tm_scope: text.shell-session 4784 | ace_mode: sh 4785 | codemirror_mode: shell 4786 | codemirror_mime_type: text/x-sh 4787 | language_id: 347 4788 | Shen: 4789 | type: programming 4790 | color: "#120F14" 4791 | extensions: 4792 | - ".shen" 4793 | tm_scope: source.shen 4794 | ace_mode: text 4795 | language_id: 348 4796 | Slash: 4797 | type: programming 4798 | color: "#007eff" 4799 | extensions: 4800 | - ".sl" 4801 | tm_scope: text.html.slash 4802 | ace_mode: text 4803 | language_id: 349 4804 | Slice: 4805 | type: programming 4806 | color: "#003fa2" 4807 | tm_scope: source.slice 4808 | ace_mode: text 4809 | extensions: 4810 | - ".ice" 4811 | language_id: 894641667 4812 | Slim: 4813 | group: HTML 4814 | type: markup 4815 | extensions: 4816 | - ".slim" 4817 | tm_scope: text.slim 4818 | ace_mode: text 4819 | codemirror_mode: slim 4820 | codemirror_mime_type: text/x-slim 4821 | language_id: 350 4822 | Smali: 4823 | type: programming 4824 | extensions: 4825 | - ".smali" 4826 | ace_mode: text 4827 | tm_scope: source.smali 4828 | language_id: 351 4829 | Smalltalk: 4830 | type: programming 4831 | color: "#596706" 4832 | extensions: 4833 | - ".st" 4834 | - ".cs" 4835 | aliases: 4836 | - squeak 4837 | ace_mode: text 4838 | codemirror_mode: smalltalk 4839 | codemirror_mime_type: text/x-stsrc 4840 | language_id: 352 4841 | Smarty: 4842 | type: programming 4843 | extensions: 4844 | - ".tpl" 4845 | ace_mode: smarty 4846 | codemirror_mode: smarty 4847 | codemirror_mime_type: text/x-smarty 4848 | tm_scope: text.html.smarty 4849 | language_id: 353 4850 | Solidity: 4851 | type: programming 4852 | color: "#AA6746" 4853 | ace_mode: text 4854 | tm_scope: source.solidity 4855 | language_id: 237469032 4856 | SourcePawn: 4857 | type: programming 4858 | color: "#5c7611" 4859 | aliases: 4860 | - sourcemod 4861 | extensions: 4862 | - ".sp" 4863 | - ".inc" 4864 | tm_scope: source.sp 4865 | ace_mode: text 4866 | language_id: 354 4867 | Spline Font Database: 4868 | type: data 4869 | extensions: 4870 | - ".sfd" 4871 | tm_scope: text.sfd 4872 | ace_mode: yaml 4873 | language_id: 767169629 4874 | Squirrel: 4875 | type: programming 4876 | color: "#800000" 4877 | extensions: 4878 | - ".nut" 4879 | tm_scope: source.c++ 4880 | ace_mode: c_cpp 4881 | codemirror_mode: clike 4882 | codemirror_mime_type: text/x-c++src 4883 | language_id: 355 4884 | Stan: 4885 | type: programming 4886 | color: "#b2011d" 4887 | extensions: 4888 | - ".stan" 4889 | ace_mode: text 4890 | tm_scope: source.stan 4891 | language_id: 356 4892 | Standard ML: 4893 | type: programming 4894 | color: "#dc566d" 4895 | aliases: 4896 | - sml 4897 | extensions: 4898 | - ".ML" 4899 | - ".fun" 4900 | - ".sig" 4901 | - ".sml" 4902 | tm_scope: source.ml 4903 | ace_mode: text 4904 | codemirror_mode: mllike 4905 | codemirror_mime_type: text/x-ocaml 4906 | language_id: 357 4907 | Stata: 4908 | type: programming 4909 | extensions: 4910 | - ".do" 4911 | - ".ado" 4912 | - ".doh" 4913 | - ".ihlp" 4914 | - ".mata" 4915 | - ".matah" 4916 | - ".sthlp" 4917 | ace_mode: text 4918 | language_id: 358 4919 | Stylus: 4920 | type: markup 4921 | group: CSS 4922 | extensions: 4923 | - ".styl" 4924 | tm_scope: source.stylus 4925 | ace_mode: stylus 4926 | language_id: 359 4927 | SubRip Text: 4928 | type: data 4929 | extensions: 4930 | - ".srt" 4931 | ace_mode: text 4932 | tm_scope: text.srt 4933 | language_id: 360 4934 | SugarSS: 4935 | type: markup 4936 | tm_scope: source.css.postcss.sugarss 4937 | group: CSS 4938 | extensions: 4939 | - ".sss" 4940 | ace_mode: text 4941 | language_id: 826404698 4942 | SuperCollider: 4943 | type: programming 4944 | color: "#46390b" 4945 | extensions: 4946 | - ".sc" 4947 | - ".scd" 4948 | interpreters: 4949 | - sclang 4950 | - scsynth 4951 | tm_scope: source.supercollider 4952 | ace_mode: text 4953 | language_id: 361 4954 | Svelte: 4955 | type: markup 4956 | tm_scope: source.svelte 4957 | group: HTML 4958 | ace_mode: html 4959 | codemirror_mode: htmlmixed 4960 | codemirror_mime_type: text/html 4961 | extensions: 4962 | - ".svelte" 4963 | language_id: 928734530 4964 | Swift: 4965 | type: programming 4966 | color: "#ffac45" 4967 | extensions: 4968 | - ".swift" 4969 | ace_mode: text 4970 | codemirror_mode: swift 4971 | codemirror_mime_type: text/x-swift 4972 | language_id: 362 4973 | SystemVerilog: 4974 | type: programming 4975 | color: "#DAE1C2" 4976 | extensions: 4977 | - ".sv" 4978 | - ".svh" 4979 | - ".vh" 4980 | ace_mode: verilog 4981 | codemirror_mode: verilog 4982 | codemirror_mime_type: text/x-systemverilog 4983 | language_id: 363 4984 | TI Program: 4985 | type: programming 4986 | ace_mode: text 4987 | color: "#A0AA87" 4988 | extensions: 4989 | - ".8xp" 4990 | - ".8xk" 4991 | - ".8xk.txt" 4992 | - ".8xp.txt" 4993 | language_id: 422 4994 | tm_scope: none 4995 | TLA: 4996 | type: programming 4997 | extensions: 4998 | - ".tla" 4999 | tm_scope: source.tla 5000 | ace_mode: text 5001 | language_id: 364 5002 | TOML: 5003 | type: data 5004 | extensions: 5005 | - ".toml" 5006 | filenames: 5007 | - Cargo.lock 5008 | - Gopkg.lock 5009 | tm_scope: source.toml 5010 | ace_mode: toml 5011 | codemirror_mode: toml 5012 | codemirror_mime_type: text/x-toml 5013 | language_id: 365 5014 | TSQL: 5015 | type: programming 5016 | extensions: 5017 | - ".sql" 5018 | ace_mode: sql 5019 | tm_scope: source.tsql 5020 | language_id: 918334941 5021 | TSX: 5022 | type: programming 5023 | group: TypeScript 5024 | extensions: 5025 | - ".tsx" 5026 | tm_scope: source.tsx 5027 | ace_mode: javascript 5028 | codemirror_mode: jsx 5029 | codemirror_mime_type: text/jsx 5030 | language_id: 94901924 5031 | TXL: 5032 | type: programming 5033 | extensions: 5034 | - ".txl" 5035 | tm_scope: source.txl 5036 | ace_mode: text 5037 | language_id: 366 5038 | Tcl: 5039 | type: programming 5040 | color: "#e4cc98" 5041 | extensions: 5042 | - ".tcl" 5043 | - ".adp" 5044 | - ".tm" 5045 | filenames: 5046 | - owh 5047 | - starfield 5048 | interpreters: 5049 | - tclsh 5050 | - wish 5051 | ace_mode: tcl 5052 | codemirror_mode: tcl 5053 | codemirror_mime_type: text/x-tcl 5054 | language_id: 367 5055 | Tcsh: 5056 | type: programming 5057 | group: Shell 5058 | extensions: 5059 | - ".tcsh" 5060 | - ".csh" 5061 | tm_scope: source.shell 5062 | ace_mode: sh 5063 | codemirror_mode: shell 5064 | codemirror_mime_type: text/x-sh 5065 | language_id: 368 5066 | TeX: 5067 | type: markup 5068 | color: "#3D6117" 5069 | ace_mode: tex 5070 | codemirror_mode: stex 5071 | codemirror_mime_type: text/x-stex 5072 | tm_scope: text.tex.latex 5073 | wrap: true 5074 | aliases: 5075 | - latex 5076 | extensions: 5077 | - ".tex" 5078 | - ".aux" 5079 | - ".bbx" 5080 | - ".cbx" 5081 | - ".cls" 5082 | - ".dtx" 5083 | - ".ins" 5084 | - ".lbx" 5085 | - ".ltx" 5086 | - ".mkii" 5087 | - ".mkiv" 5088 | - ".mkvi" 5089 | - ".sty" 5090 | - ".toc" 5091 | language_id: 369 5092 | Tea: 5093 | type: markup 5094 | extensions: 5095 | - ".tea" 5096 | tm_scope: source.tea 5097 | ace_mode: text 5098 | language_id: 370 5099 | Terra: 5100 | type: programming 5101 | extensions: 5102 | - ".t" 5103 | color: "#00004c" 5104 | ace_mode: lua 5105 | codemirror_mode: lua 5106 | codemirror_mime_type: text/x-lua 5107 | interpreters: 5108 | - lua 5109 | language_id: 371 5110 | Text: 5111 | type: prose 5112 | wrap: true 5113 | aliases: 5114 | - fundamental 5115 | extensions: 5116 | - ".txt" 5117 | - ".fr" 5118 | - ".nb" 5119 | - ".ncl" 5120 | - ".no" 5121 | filenames: 5122 | - COPYING 5123 | - COPYING.regex 5124 | - COPYRIGHT.regex 5125 | - FONTLOG 5126 | - INSTALL 5127 | - INSTALL.mysql 5128 | - LICENSE 5129 | - LICENSE.mysql 5130 | - NEWS 5131 | - README.1ST 5132 | - README.me 5133 | - README.mysql 5134 | - click.me 5135 | - delete.me 5136 | - go.mod 5137 | - go.sum 5138 | - keep.me 5139 | - read.me 5140 | - readme.1st 5141 | - test.me 5142 | tm_scope: none 5143 | ace_mode: text 5144 | language_id: 372 5145 | Textile: 5146 | type: prose 5147 | ace_mode: textile 5148 | codemirror_mode: textile 5149 | codemirror_mime_type: text/x-textile 5150 | wrap: true 5151 | extensions: 5152 | - ".textile" 5153 | tm_scope: none 5154 | language_id: 373 5155 | Thrift: 5156 | type: programming 5157 | tm_scope: source.thrift 5158 | extensions: 5159 | - ".thrift" 5160 | ace_mode: text 5161 | language_id: 374 5162 | Turing: 5163 | type: programming 5164 | color: "#cf142b" 5165 | extensions: 5166 | - ".t" 5167 | - ".tu" 5168 | tm_scope: source.turing 5169 | ace_mode: text 5170 | language_id: 375 5171 | Turtle: 5172 | type: data 5173 | extensions: 5174 | - ".ttl" 5175 | tm_scope: source.turtle 5176 | ace_mode: text 5177 | codemirror_mode: turtle 5178 | codemirror_mime_type: text/turtle 5179 | language_id: 376 5180 | Twig: 5181 | type: markup 5182 | group: HTML 5183 | extensions: 5184 | - ".twig" 5185 | tm_scope: text.html.twig 5186 | ace_mode: twig 5187 | codemirror_mode: twig 5188 | codemirror_mime_type: text/x-twig 5189 | language_id: 377 5190 | Type Language: 5191 | type: data 5192 | aliases: 5193 | - tl 5194 | extensions: 5195 | - ".tl" 5196 | tm_scope: source.tl 5197 | ace_mode: text 5198 | language_id: 632765617 5199 | TypeScript: 5200 | type: programming 5201 | color: "#2b7489" 5202 | aliases: 5203 | - ts 5204 | interpreters: 5205 | - deno 5206 | - ts-node 5207 | extensions: 5208 | - ".ts" 5209 | tm_scope: source.ts 5210 | ace_mode: typescript 5211 | codemirror_mode: javascript 5212 | codemirror_mime_type: application/typescript 5213 | language_id: 378 5214 | Unified Parallel C: 5215 | type: programming 5216 | group: C 5217 | ace_mode: c_cpp 5218 | codemirror_mode: clike 5219 | codemirror_mime_type: text/x-csrc 5220 | extensions: 5221 | - ".upc" 5222 | tm_scope: source.c 5223 | language_id: 379 5224 | Unity3D Asset: 5225 | type: data 5226 | ace_mode: yaml 5227 | codemirror_mode: yaml 5228 | codemirror_mime_type: text/x-yaml 5229 | extensions: 5230 | - ".anim" 5231 | - ".asset" 5232 | - ".mat" 5233 | - ".meta" 5234 | - ".prefab" 5235 | - ".unity" 5236 | tm_scope: source.yaml 5237 | language_id: 380 5238 | Unix Assembly: 5239 | type: programming 5240 | group: Assembly 5241 | extensions: 5242 | - ".s" 5243 | - ".ms" 5244 | tm_scope: source.x86 5245 | ace_mode: assembly_x86 5246 | language_id: 120 5247 | Uno: 5248 | type: programming 5249 | extensions: 5250 | - ".uno" 5251 | ace_mode: csharp 5252 | codemirror_mode: clike 5253 | codemirror_mime_type: text/x-csharp 5254 | tm_scope: source.cs 5255 | language_id: 381 5256 | UnrealScript: 5257 | type: programming 5258 | color: "#a54c4d" 5259 | extensions: 5260 | - ".uc" 5261 | tm_scope: source.java 5262 | ace_mode: java 5263 | codemirror_mode: clike 5264 | codemirror_mime_type: text/x-java 5265 | language_id: 382 5266 | UrWeb: 5267 | type: programming 5268 | aliases: 5269 | - Ur/Web 5270 | - Ur 5271 | extensions: 5272 | - ".ur" 5273 | - ".urs" 5274 | tm_scope: source.ur 5275 | ace_mode: text 5276 | language_id: 383 5277 | VCL: 5278 | type: programming 5279 | color: "#148AA8" 5280 | extensions: 5281 | - ".vcl" 5282 | tm_scope: source.varnish.vcl 5283 | ace_mode: text 5284 | language_id: 384 5285 | VHDL: 5286 | type: programming 5287 | color: "#adb2cb" 5288 | extensions: 5289 | - ".vhdl" 5290 | - ".vhd" 5291 | - ".vhf" 5292 | - ".vhi" 5293 | - ".vho" 5294 | - ".vhs" 5295 | - ".vht" 5296 | - ".vhw" 5297 | ace_mode: vhdl 5298 | codemirror_mode: vhdl 5299 | codemirror_mime_type: text/x-vhdl 5300 | language_id: 385 5301 | Vala: 5302 | type: programming 5303 | color: "#fbe5cd" 5304 | extensions: 5305 | - ".vala" 5306 | - ".vapi" 5307 | ace_mode: vala 5308 | language_id: 386 5309 | Verilog: 5310 | type: programming 5311 | color: "#b2b7f8" 5312 | extensions: 5313 | - ".v" 5314 | - ".veo" 5315 | ace_mode: verilog 5316 | codemirror_mode: verilog 5317 | codemirror_mime_type: text/x-verilog 5318 | language_id: 387 5319 | Vim script: 5320 | type: programming 5321 | color: "#199f4b" 5322 | tm_scope: source.viml 5323 | aliases: 5324 | - vim 5325 | - viml 5326 | - nvim 5327 | extensions: 5328 | - ".vim" 5329 | - ".vba" 5330 | - ".vmb" 5331 | filenames: 5332 | - ".gvimrc" 5333 | - ".nvimrc" 5334 | - ".vimrc" 5335 | - _vimrc 5336 | - gvimrc 5337 | - nvimrc 5338 | - vimrc 5339 | ace_mode: text 5340 | language_id: 388 5341 | Visual Basic: 5342 | type: programming 5343 | color: "#945db7" 5344 | extensions: 5345 | - ".vb" 5346 | - ".bas" 5347 | - ".cls" 5348 | - ".frm" 5349 | - ".frx" 5350 | - ".vba" 5351 | - ".vbhtml" 5352 | - ".vbs" 5353 | tm_scope: source.vbnet 5354 | aliases: 5355 | - vb.net 5356 | - vbnet 5357 | ace_mode: text 5358 | codemirror_mode: vb 5359 | codemirror_mime_type: text/x-vb 5360 | language_id: 389 5361 | Volt: 5362 | type: programming 5363 | color: "#1F1F1F" 5364 | extensions: 5365 | - ".volt" 5366 | tm_scope: source.d 5367 | ace_mode: d 5368 | codemirror_mode: d 5369 | codemirror_mime_type: text/x-d 5370 | language_id: 390 5371 | Vue: 5372 | type: markup 5373 | color: "#2c3e50" 5374 | extensions: 5375 | - ".vue" 5376 | tm_scope: text.html.vue 5377 | ace_mode: html 5378 | language_id: 391 5379 | Wavefront Material: 5380 | type: data 5381 | extensions: 5382 | - ".mtl" 5383 | tm_scope: source.wavefront.mtl 5384 | ace_mode: text 5385 | language_id: 392 5386 | Wavefront Object: 5387 | type: data 5388 | extensions: 5389 | - ".obj" 5390 | tm_scope: source.wavefront.obj 5391 | ace_mode: text 5392 | language_id: 393 5393 | Web Ontology Language: 5394 | type: data 5395 | extensions: 5396 | - ".owl" 5397 | tm_scope: text.xml 5398 | ace_mode: xml 5399 | language_id: 394 5400 | WebAssembly: 5401 | type: programming 5402 | color: "#04133b" 5403 | extensions: 5404 | - ".wast" 5405 | - ".wat" 5406 | aliases: 5407 | - wast 5408 | - wasm 5409 | tm_scope: source.webassembly 5410 | ace_mode: lisp 5411 | codemirror_mode: commonlisp 5412 | codemirror_mime_type: text/x-common-lisp 5413 | language_id: 956556503 5414 | WebIDL: 5415 | type: programming 5416 | extensions: 5417 | - ".webidl" 5418 | tm_scope: source.webidl 5419 | ace_mode: text 5420 | codemirror_mode: webidl 5421 | codemirror_mime_type: text/x-webidl 5422 | language_id: 395 5423 | WebVTT: 5424 | type: data 5425 | wrap: true 5426 | extensions: 5427 | - ".vtt" 5428 | tm_scope: source.vtt 5429 | ace_mode: text 5430 | language_id: 658679714 5431 | Windows Registry Entries: 5432 | type: data 5433 | extensions: 5434 | - ".reg" 5435 | tm_scope: source.reg 5436 | ace_mode: ini 5437 | codemirror_mode: properties 5438 | codemirror_mime_type: text/x-properties 5439 | language_id: 969674868 5440 | Wollok: 5441 | type: programming 5442 | color: "#a23738" 5443 | extensions: 5444 | - ".wlk" 5445 | ace_mode: text 5446 | tm_scope: source.wollok 5447 | language_id: 632745969 5448 | World of Warcraft Addon Data: 5449 | type: data 5450 | extensions: 5451 | - ".toc" 5452 | tm_scope: source.toc 5453 | ace_mode: text 5454 | language_id: 396 5455 | X BitMap: 5456 | type: data 5457 | group: C 5458 | aliases: 5459 | - xbm 5460 | extensions: 5461 | - ".xbm" 5462 | ace_mode: c_cpp 5463 | tm_scope: source.c 5464 | codemirror_mode: clike 5465 | codemirror_mime_type: text/x-csrc 5466 | language_id: 782911107 5467 | X Font Directory Index: 5468 | type: data 5469 | filenames: 5470 | - encodings.dir 5471 | - fonts.alias 5472 | - fonts.dir 5473 | - fonts.scale 5474 | tm_scope: source.fontdir 5475 | ace_mode: text 5476 | language_id: 208700028 5477 | X PixMap: 5478 | type: data 5479 | group: C 5480 | aliases: 5481 | - xpm 5482 | extensions: 5483 | - ".xpm" 5484 | - ".pm" 5485 | ace_mode: c_cpp 5486 | tm_scope: source.c 5487 | codemirror_mode: clike 5488 | codemirror_mime_type: text/x-csrc 5489 | language_id: 781846279 5490 | X10: 5491 | type: programming 5492 | aliases: 5493 | - xten 5494 | ace_mode: text 5495 | extensions: 5496 | - ".x10" 5497 | color: "#4B6BEF" 5498 | tm_scope: source.x10 5499 | language_id: 397 5500 | XC: 5501 | type: programming 5502 | color: "#99DA07" 5503 | extensions: 5504 | - ".xc" 5505 | tm_scope: source.xc 5506 | ace_mode: c_cpp 5507 | codemirror_mode: clike 5508 | codemirror_mime_type: text/x-csrc 5509 | language_id: 398 5510 | XCompose: 5511 | type: data 5512 | filenames: 5513 | - ".XCompose" 5514 | - XCompose 5515 | - xcompose 5516 | tm_scope: config.xcompose 5517 | ace_mode: text 5518 | language_id: 225167241 5519 | XML: 5520 | type: data 5521 | ace_mode: xml 5522 | codemirror_mode: xml 5523 | codemirror_mime_type: text/xml 5524 | aliases: 5525 | - rss 5526 | - xsd 5527 | - wsdl 5528 | extensions: 5529 | - ".xml" 5530 | - ".adml" 5531 | - ".admx" 5532 | - ".ant" 5533 | - ".axml" 5534 | - ".builds" 5535 | - ".ccproj" 5536 | - ".ccxml" 5537 | - ".clixml" 5538 | - ".cproject" 5539 | - ".cscfg" 5540 | - ".csdef" 5541 | - ".csl" 5542 | - ".csproj" 5543 | - ".ct" 5544 | - ".depproj" 5545 | - ".dita" 5546 | - ".ditamap" 5547 | - ".ditaval" 5548 | - ".dll.config" 5549 | - ".dotsettings" 5550 | - ".filters" 5551 | - ".fsproj" 5552 | - ".fxml" 5553 | - ".glade" 5554 | - ".gml" 5555 | - ".gmx" 5556 | - ".grxml" 5557 | - ".iml" 5558 | - ".ivy" 5559 | - ".jelly" 5560 | - ".jsproj" 5561 | - ".kml" 5562 | - ".launch" 5563 | - ".mdpolicy" 5564 | - ".mjml" 5565 | - ".mm" 5566 | - ".mod" 5567 | - ".mxml" 5568 | - ".natvis" 5569 | - ".ncl" 5570 | - ".ndproj" 5571 | - ".nproj" 5572 | - ".nuspec" 5573 | - ".odd" 5574 | - ".osm" 5575 | - ".pkgproj" 5576 | - ".plist" 5577 | - ".pluginspec" 5578 | - ".proj" 5579 | - ".props" 5580 | - ".ps1xml" 5581 | - ".psc1" 5582 | - ".pt" 5583 | - ".rdf" 5584 | - ".resx" 5585 | - ".rss" 5586 | - ".sch" 5587 | - ".scxml" 5588 | - ".sfproj" 5589 | - ".shproj" 5590 | - ".srdf" 5591 | - ".storyboard" 5592 | - ".stTheme" 5593 | - ".sublime-snippet" 5594 | - ".targets" 5595 | - ".tmCommand" 5596 | - ".tml" 5597 | - ".tmLanguage" 5598 | - ".tmPreferences" 5599 | - ".tmSnippet" 5600 | - ".tmTheme" 5601 | - ".ts" 5602 | - ".tsx" 5603 | - ".ui" 5604 | - ".urdf" 5605 | - ".ux" 5606 | - ".vbproj" 5607 | - ".vcxproj" 5608 | - ".vsixmanifest" 5609 | - ".vssettings" 5610 | - ".vstemplate" 5611 | - ".vxml" 5612 | - ".wixproj" 5613 | - ".workflow" 5614 | - ".wsdl" 5615 | - ".wsf" 5616 | - ".wxi" 5617 | - ".wxl" 5618 | - ".wxs" 5619 | - ".x3d" 5620 | - ".xacro" 5621 | - ".xaml" 5622 | - ".xib" 5623 | - ".xlf" 5624 | - ".xliff" 5625 | - ".xmi" 5626 | - ".xml.dist" 5627 | - ".xproj" 5628 | - ".xsd" 5629 | - ".xspec" 5630 | - ".xul" 5631 | - ".zcml" 5632 | filenames: 5633 | - ".classpath" 5634 | - ".cproject" 5635 | - ".project" 5636 | - App.config 5637 | - NuGet.config 5638 | - Settings.StyleCop 5639 | - Web.Debug.config 5640 | - Web.Release.config 5641 | - Web.config 5642 | - packages.config 5643 | language_id: 399 5644 | XPages: 5645 | type: data 5646 | extensions: 5647 | - ".xsp-config" 5648 | - ".xsp.metadata" 5649 | tm_scope: text.xml 5650 | ace_mode: xml 5651 | codemirror_mode: xml 5652 | codemirror_mime_type: text/xml 5653 | language_id: 400 5654 | XProc: 5655 | type: programming 5656 | extensions: 5657 | - ".xpl" 5658 | - ".xproc" 5659 | tm_scope: text.xml 5660 | ace_mode: xml 5661 | codemirror_mode: xml 5662 | codemirror_mime_type: text/xml 5663 | language_id: 401 5664 | XQuery: 5665 | type: programming 5666 | color: "#5232e7" 5667 | extensions: 5668 | - ".xquery" 5669 | - ".xq" 5670 | - ".xql" 5671 | - ".xqm" 5672 | - ".xqy" 5673 | ace_mode: xquery 5674 | codemirror_mode: xquery 5675 | codemirror_mime_type: application/xquery 5676 | tm_scope: source.xq 5677 | language_id: 402 5678 | XS: 5679 | type: programming 5680 | extensions: 5681 | - ".xs" 5682 | tm_scope: source.c 5683 | ace_mode: c_cpp 5684 | codemirror_mode: clike 5685 | codemirror_mime_type: text/x-csrc 5686 | language_id: 403 5687 | XSLT: 5688 | type: programming 5689 | aliases: 5690 | - xsl 5691 | extensions: 5692 | - ".xslt" 5693 | - ".xsl" 5694 | tm_scope: text.xml.xsl 5695 | ace_mode: xml 5696 | codemirror_mode: xml 5697 | codemirror_mime_type: text/xml 5698 | color: "#EB8CEB" 5699 | language_id: 404 5700 | Xojo: 5701 | type: programming 5702 | extensions: 5703 | - ".xojo_code" 5704 | - ".xojo_menu" 5705 | - ".xojo_report" 5706 | - ".xojo_script" 5707 | - ".xojo_toolbar" 5708 | - ".xojo_window" 5709 | tm_scope: source.xojo 5710 | ace_mode: text 5711 | language_id: 405 5712 | Xtend: 5713 | type: programming 5714 | extensions: 5715 | - ".xtend" 5716 | ace_mode: text 5717 | language_id: 406 5718 | YAML: 5719 | type: data 5720 | tm_scope: source.yaml 5721 | aliases: 5722 | - yml 5723 | extensions: 5724 | - ".yml" 5725 | - ".mir" 5726 | - ".reek" 5727 | - ".rviz" 5728 | - ".sublime-syntax" 5729 | - ".syntax" 5730 | - ".yaml" 5731 | - ".yaml-tmlanguage" 5732 | - ".yml.mysql" 5733 | filenames: 5734 | - ".clang-format" 5735 | - ".clang-tidy" 5736 | - ".gemrc" 5737 | - glide.lock 5738 | ace_mode: yaml 5739 | codemirror_mode: yaml 5740 | codemirror_mime_type: text/x-yaml 5741 | language_id: 407 5742 | YANG: 5743 | type: data 5744 | extensions: 5745 | - ".yang" 5746 | tm_scope: source.yang 5747 | ace_mode: text 5748 | language_id: 408 5749 | YARA: 5750 | type: programming 5751 | color: "#220000" 5752 | ace_mode: text 5753 | extensions: 5754 | - ".yar" 5755 | - ".yara" 5756 | tm_scope: source.yara 5757 | language_id: 805122868 5758 | YASnippet: 5759 | type: markup 5760 | aliases: 5761 | - snippet 5762 | - yas 5763 | color: "#32AB90" 5764 | extensions: 5765 | - ".yasnippet" 5766 | tm_scope: source.yasnippet 5767 | ace_mode: text 5768 | language_id: 378760102 5769 | Yacc: 5770 | type: programming 5771 | extensions: 5772 | - ".y" 5773 | - ".yacc" 5774 | - ".yy" 5775 | tm_scope: source.bison 5776 | ace_mode: text 5777 | color: "#4B6C4B" 5778 | language_id: 409 5779 | ZAP: 5780 | type: programming 5781 | color: "#0d665e" 5782 | extensions: 5783 | - ".zap" 5784 | - ".xzap" 5785 | tm_scope: source.zap 5786 | ace_mode: text 5787 | language_id: 952972794 5788 | ZIL: 5789 | type: programming 5790 | color: "#dc75e5" 5791 | extensions: 5792 | - ".zil" 5793 | - ".mud" 5794 | tm_scope: source.zil 5795 | ace_mode: text 5796 | language_id: 973483626 5797 | Zeek: 5798 | type: programming 5799 | aliases: 5800 | - bro 5801 | extensions: 5802 | - ".zeek" 5803 | - ".bro" 5804 | tm_scope: source.zeek 5805 | ace_mode: text 5806 | language_id: 40 5807 | ZenScript: 5808 | type: programming 5809 | color: "#00BCD1" 5810 | extensions: 5811 | - ".zs" 5812 | tm_scope: source.zenscript 5813 | ace_mode: text 5814 | language_id: 494938890 5815 | Zephir: 5816 | type: programming 5817 | color: "#118f9e" 5818 | extensions: 5819 | - ".zep" 5820 | tm_scope: source.php.zephir 5821 | ace_mode: php 5822 | language_id: 410 5823 | Zig: 5824 | type: programming 5825 | color: "#ec915c" 5826 | extensions: 5827 | - ".zig" 5828 | tm_scope: source.zig 5829 | ace_mode: text 5830 | language_id: 646424281 5831 | Zimpl: 5832 | type: programming 5833 | extensions: 5834 | - ".zimpl" 5835 | - ".zmpl" 5836 | - ".zpl" 5837 | tm_scope: none 5838 | ace_mode: text 5839 | language_id: 411 5840 | desktop: 5841 | type: data 5842 | extensions: 5843 | - ".desktop" 5844 | - ".desktop.in" 5845 | tm_scope: source.desktop 5846 | ace_mode: text 5847 | language_id: 412 5848 | eC: 5849 | type: programming 5850 | color: "#913960" 5851 | extensions: 5852 | - ".ec" 5853 | - ".eh" 5854 | tm_scope: source.c.ec 5855 | ace_mode: text 5856 | language_id: 413 5857 | edn: 5858 | type: data 5859 | ace_mode: clojure 5860 | codemirror_mode: clojure 5861 | codemirror_mime_type: text/x-clojure 5862 | extensions: 5863 | - ".edn" 5864 | tm_scope: source.clojure 5865 | language_id: 414 5866 | fish: 5867 | type: programming 5868 | group: Shell 5869 | interpreters: 5870 | - fish 5871 | extensions: 5872 | - ".fish" 5873 | tm_scope: source.fish 5874 | ace_mode: text 5875 | language_id: 415 5876 | mcfunction: 5877 | type: programming 5878 | color: "#E22837" 5879 | extensions: 5880 | - ".mcfunction" 5881 | tm_scope: source.mcfunction 5882 | ace_mode: text 5883 | language_id: 462488745 5884 | mupad: 5885 | type: programming 5886 | extensions: 5887 | - ".mu" 5888 | ace_mode: text 5889 | language_id: 416 5890 | nanorc: 5891 | type: data 5892 | group: INI 5893 | extensions: 5894 | - ".nanorc" 5895 | filenames: 5896 | - ".nanorc" 5897 | - nanorc 5898 | tm_scope: source.nanorc 5899 | ace_mode: text 5900 | language_id: 775996197 5901 | nesC: 5902 | type: programming 5903 | color: "#94B0C7" 5904 | extensions: 5905 | - ".nc" 5906 | ace_mode: text 5907 | tm_scope: source.nesc 5908 | language_id: 417 5909 | ooc: 5910 | type: programming 5911 | color: "#b0b77e" 5912 | extensions: 5913 | - ".ooc" 5914 | ace_mode: text 5915 | language_id: 418 5916 | q: 5917 | type: programming 5918 | extensions: 5919 | - ".q" 5920 | tm_scope: source.q 5921 | ace_mode: text 5922 | color: "#0040cd" 5923 | language_id: 970539067 5924 | reStructuredText: 5925 | type: prose 5926 | wrap: true 5927 | aliases: 5928 | - rst 5929 | extensions: 5930 | - ".rst" 5931 | - ".rest" 5932 | - ".rest.txt" 5933 | - ".rst.txt" 5934 | ace_mode: text 5935 | codemirror_mode: rst 5936 | codemirror_mime_type: text/x-rst 5937 | language_id: 419 5938 | sed: 5939 | type: programming 5940 | color: "#64b970" 5941 | extensions: 5942 | - ".sed" 5943 | interpreters: 5944 | - gsed 5945 | - minised 5946 | - sed 5947 | - ssed 5948 | ace_mode: text 5949 | tm_scope: source.sed 5950 | language_id: 847830017 5951 | wdl: 5952 | type: programming 5953 | color: "#42f1f4" 5954 | extensions: 5955 | - ".wdl" 5956 | tm_scope: source.wdl 5957 | ace_mode: text 5958 | language_id: 374521672 5959 | wisp: 5960 | type: programming 5961 | ace_mode: clojure 5962 | codemirror_mode: clojure 5963 | codemirror_mime_type: text/x-clojure 5964 | color: "#7582D1" 5965 | extensions: 5966 | - ".wisp" 5967 | tm_scope: source.clojure 5968 | language_id: 420 5969 | xBase: 5970 | type: programming 5971 | color: "#403a40" 5972 | aliases: 5973 | - advpl 5974 | - clipper 5975 | - foxpro 5976 | extensions: 5977 | - ".prg" 5978 | - ".ch" 5979 | - ".prw" 5980 | tm_scope: source.harbour 5981 | ace_mode: text 5982 | language_id: 421 5983 | -------------------------------------------------------------------------------- /src/config/messages.mjs: -------------------------------------------------------------------------------- 1 | import fs from 'graceful-fs' 2 | import path from 'path' 3 | import highlight from 'highlight.js' // eslint-disable-line import/extensions 4 | 5 | import { getThemeSlug } from './methods.mjs' 6 | 7 | const { BOT_USER } = process.env 8 | const cols = 2 9 | const maxWidth = 16 10 | 11 | const getThemeName = (slug) => slug 12 | .split('-') 13 | .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) 14 | .join(' ') 15 | 16 | const getThemeCssFilePath = (theme) => path 17 | .resolve(`node_modules/highlight.js/styles/${getThemeSlug(theme)}.css`) 18 | 19 | const readCss = (theme) => fs.readFileSync(getThemeCssFilePath(theme)) 20 | 21 | const htmlhighlight = (body, lang) => lang 22 | ? highlight.highlight(lang, body).value 23 | : highlight.highlightAuto(body).value 24 | 25 | const makeCols = (lang, idx) => (idx + 1) % cols 26 | ? lang.replace(/,/g, '') + (new Array(maxWidth - lang.length)).fill(' ').join('') 27 | : `${lang}\n` 28 | 29 | export const themes = fs 30 | .readdirSync(path.resolve('node_modules/highlight.js/styles')) 31 | .filter((file) => file.endsWith('.css')) 32 | .map((file) => file.replace('.css', '')) 33 | 34 | export const langs = fs 35 | .readdirSync(path.resolve('node_modules/highlight.js/lib/languages')) 36 | .filter((file) => file.endsWith('.js')) 37 | .map((file) => file.replace('.js', '')) 38 | 39 | export const messages = { 40 | langsList: () => `*Supported languages list:*\n 41 | \`\`\` 42 | ${langs.map(makeCols).join('')}\`\`\` 43 | *Usage:*\n 44 | \\\`\\\`\\\`[language] 45 | code 46 | \\\`\\\`\\\``, 47 | 48 | themeChanged: ({ firstName, theme }) => `Congratulations *${firstName || 'stranger'}*, your default theme was changed to *${theme}*!`, 49 | 50 | themeChoose: (theme) => `Your selected theme is *${theme}*.\n 51 | Select the new one theme for all your codes, even those that you send in groups:`, 52 | 53 | themeGroup: `To configure the theme of your code send me the command in private: @${BOT_USER.replace(/_/g, '\\_')}`, 54 | 55 | welcomeGroup: () => `Hello!\n 56 | If you send pieces of programming code with \`fixed-width code\` format in this group, I'll send a picture with syntax highlighting for easy reading.\n 57 | You can also send me in private any code without the need of the \`fixed-width code\` format, try it: @${BOT_USER.replace(/_/g, '\\_')}.\n 58 | _If I am not working, try it privately, I don't like sending error messages in groups._`, 59 | 60 | welcomeUser: ({ firstName }) => `Welcome, ${firstName || 'stranger'}!\n 61 | *This bot is WIP now!!!* The sources you could find [there](https://github.com/Piterden/syntax-highlighter-bot)\n 62 | You can send to me chunks of a programming code formatted with three backticks, then you will receive an image with highlighted code.\n 63 | *Features:*\n 64 | - *Groups:* Add me to a group, I'll help everyone to understand those pieces of code.\n 65 | - *Languages:* I detect the language automatically, but if it does not work for some code, you can always specify the language. Do it now: /langs\n 66 | - *Themes:* To each his own. Select your preferred theme, the one you select will be used when you generate codes here, in groups and in inline mode. Start now: /theme\n 67 | - *Inline mode:* just type my username in any chat to check your recent codes or keep typing code to create a new one quickly (similar to the use of @gif etc.)\n 68 | _Any questions or bugs you can write to _@piterden_ (ru,en,code) or _@CristianOspina_ (es,en,idea)._`, 69 | 70 | getHtml: (code, theme, lang) => ` 71 | 72 | 83 | 84 | 85 |
 86 |     ${htmlhighlight(code, lang)}
 87 |   
88 | 89 | `, 90 | 91 | demoCode: (theme) => `function syntaxHighlightBot(block, cls) { 92 | /** 93 | * Preview theme: ${theme} 94 | * http://t.me/SyntaxHighlightBot 95 | */ 96 | try { 97 | if (cls.search(/\\bno\\-highlight\\b/) != -1) 98 | return process(block, true, 0x0F) + \` class="\\$\\{cls\\}"\`; 99 | } catch (e) { 100 | /* handle exception */ 101 | } 102 | 103 | for (var i = 0 / 2; i < classes.length; i++) { 104 | if (checkCondition(classes[i]) === undefined) { 105 | console.log('undefined'); // log 106 | } 107 | } 108 | } 109 | export syntaxHighlightBot;`, 110 | 111 | themesKeyboard: (themesArray, cache = '') => themesArray 112 | .map((theme, idx) => { 113 | if ((idx + 1) % cols) { 114 | cache = `🎨 ${getThemeName(theme)}` // eslint-disable-line no-param-reassign 115 | return idx - 1 < themesArray.length ? false : cache 116 | } 117 | return [cache, `🎨 ${getThemeName(theme)}`] 118 | }) 119 | .filter(Boolean), 120 | } 121 | -------------------------------------------------------------------------------- /src/config/methods.mjs: -------------------------------------------------------------------------------- 1 | import fs from 'graceful-fs' 2 | import path from 'path' 3 | import crypto from 'crypto' 4 | import Telegraf from 'telegraf' 5 | 6 | import { url } from './config.mjs' 7 | 8 | const cols = 2 9 | const { IMAGES_DIR } = process.env 10 | const { Markup } = Telegraf 11 | 12 | export const md5 = (string) => crypto 13 | .createHash('md5') 14 | .update(string) 15 | .digest('hex') 16 | 17 | export const getPath = (file) => path.resolve(`${IMAGES_DIR}/${file}`) 18 | 19 | export const getUserPath = ({ state, from }, file) => path 20 | .resolve(`${IMAGES_DIR}/${state && state.user && state.user.id || from.id}/${file}`) 21 | 22 | export const getThemeSlug = (name) => name 23 | .split(' ') 24 | .map((word) => word.toLowerCase()) 25 | .join('-') 26 | 27 | export const getThemeName = (slug) => slug 28 | .split('-') 29 | .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) 30 | .join(' ') 31 | 32 | export const getImageFileName = (body, theme) => `${md5(body)}_${getThemeSlug(theme)}.jpg` 33 | 34 | export const isExisted = (file) => fs.existsSync(file) 35 | 36 | export const filenameFix = (file = '') => { 37 | const match = file.match(new RegExp(`(${IMAGES_DIR}/.+)$`)) 38 | 39 | return match ? match[1] : file 40 | } 41 | 42 | export const getFileURL = (file) => `${url}${filenameFix(file)}` 43 | 44 | export const getInlineFileURL = (file) => `${url}images/${filenameFix(file)}` 45 | 46 | export const isPrivateChat = ({ chat }) => chat.type === 'private' 47 | 48 | // const escapeUser = (user = {}) => Object.keys(user).reduce((acc, key) => { 49 | // acc[key] = escape(user[key]) 50 | // return acc 51 | // }, {}) 52 | 53 | export const chatUser = (ctx) => ctx.state.user || ctx.from 54 | 55 | export const themesKeyboard = (themes, cache = '') => themes 56 | .map((theme, idx) => { 57 | if ((idx + 1) % cols) { 58 | cache = `🎨 ${getThemeName(theme)}` // eslint-disable-line no-param-reassign 59 | return idx - 1 < themes.length ? false : cache 60 | } 61 | return [cache, `🎨 ${getThemeName(theme)}`] 62 | }) 63 | .filter(Boolean) 64 | 65 | export const replyWithPhoto = (ctx, image) => { 66 | ctx.replyWithChatAction('upload_photo') 67 | return ctx.replyWithPhoto( 68 | { 69 | source: image, 70 | }, 71 | { 72 | ...Markup.inlineKeyboard([[{ 73 | text: `Remove (only ${ctx.from.first_name} can)`, 74 | callback_data: `remove::${ctx.from.id}`, 75 | }]]).removeKeyboard().extra(), 76 | reply_to_message_id: ctx.message.message_id, 77 | } 78 | ) 79 | } 80 | 81 | export const replyWithMediaGroup = async (ctx, images) => { 82 | ctx.replyWithChatAction('upload_photo') 83 | const messages = await ctx.replyWithMediaGroup( 84 | images.map((image) => ({ 85 | type: 'photo', 86 | media: { 87 | source: image, 88 | }, 89 | })), 90 | { 91 | reply_to_message_id: ctx.message.message_id, 92 | } 93 | ) 94 | const ids = messages.map(({ message_id: messageId }) => messageId).join('|') 95 | 96 | ctx.replyWithMarkdown( 97 | '`====================================================`', 98 | Markup.inlineKeyboard([[{ 99 | text: `Remove (only ${ctx.from.first_name} can)`, 100 | callback_data: `remove::${ctx.from.id}::${ids}`, 101 | }]]).removeKeyboard().extra() 102 | ) 103 | } 104 | 105 | export const replyWithDocument = (ctx, image) => { 106 | ctx.replyWithChatAction('upload_document') 107 | return ctx.replyWithDocument( 108 | { 109 | url: getFileURL(image), 110 | }, 111 | { 112 | ...Markup.removeKeyboard().extra(), 113 | reply_to_message_id: ctx.message.message_id, 114 | } 115 | ) 116 | } 117 | 118 | export const makeUserFolder = (user) => { 119 | const filepath = path.resolve(`images/${user.id}`) 120 | 121 | if (!isExisted(filepath)) { 122 | fs.mkdirSync(filepath) 123 | } 124 | } 125 | 126 | // eslint-disable-next-line no-console 127 | export const onError = (err) => console.log(err) 128 | 129 | export const clearFolder = ({ id }) => { 130 | const filePath = path.resolve(`${IMAGES_DIR}/${id}`) 131 | 132 | fs.readdir(filePath, (err, files) => { 133 | if (err) { 134 | throw new Error(err) 135 | } 136 | if (files && files.length > 0) { 137 | files.forEach((file) => { 138 | fs.unlinkSync(`${filePath}/${file}`) 139 | }) 140 | } 141 | }) 142 | } 143 | -------------------------------------------------------------------------------- /src/model/Chat/chat-model.mjs: -------------------------------------------------------------------------------- 1 | import Objection from 'objection' 2 | 3 | const { Model, snakeCaseMappers } = Objection 4 | 5 | class ChatModel extends Model { 6 | static get tableName () { 7 | return 'chats' 8 | } 9 | 10 | static get columnNameMappers () { 11 | return snakeCaseMappers() 12 | } 13 | 14 | static get defaultEagerAlgorithm () { 15 | return Model.JoinEagerAlgorithm 16 | } 17 | 18 | static get jsonSchema () { 19 | return { 20 | type: 'object', 21 | required: ['id', 'title', 'type'], 22 | properties: { 23 | id: { type: 'integer' }, 24 | title: { type: 'string', minLength: 1, maxLength: 255 }, 25 | type: { type: 'string', minLength: 1, maxLength: 40 }, 26 | active: { type: 'boolean' }, 27 | createdAt: { type: 'datetime' }, 28 | }, 29 | } 30 | } 31 | 32 | $beforeInsert () { 33 | this.createdAt = new Date() 34 | } 35 | 36 | $beforeUpdate () { 37 | this.updatedAt = new Date() 38 | } 39 | } 40 | 41 | export default ChatModel 42 | -------------------------------------------------------------------------------- /src/model/Chunk/chunk-model.mjs: -------------------------------------------------------------------------------- 1 | import Objection from 'objection' 2 | import UserModel from '../User/user-model' 3 | import ChatModel from '../Chat/chat-model' 4 | 5 | const { Model, snakeCaseMappers } = Objection 6 | 7 | class ChunkModel extends Model { 8 | /** 9 | * The DB table name 10 | * 11 | * @static 12 | * @returns {string} 13 | */ 14 | static get tableName () { 15 | return 'chunks' 16 | } 17 | 18 | /** 19 | * Columns names mapper rules 20 | * 21 | * @static 22 | */ 23 | static get columnNameMappers () { 24 | return snakeCaseMappers() 25 | } 26 | 27 | /** 28 | * Default eager behavior 29 | * 30 | * @static 31 | * @returns {EagerAlgorithm} 32 | */ 33 | static get defaultEagerAlgorithm () { 34 | return Model.JoinEagerAlgorithm 35 | } 36 | 37 | /** 38 | * JSON schema getter 39 | * 40 | * @static 41 | * @returns {Object} 42 | */ 43 | static get jsonSchema () { 44 | return { 45 | type: 'object', 46 | required: ['filename', 'userId', 'chatId'], 47 | properties: { 48 | filename: { type: 'string' }, 49 | userId: { type: 'integer' }, 50 | chatId: { type: 'integer' }, 51 | lang: { type: 'string' }, 52 | source: { type: 'string' }, 53 | createdAt: { type: 'datetime' }, 54 | }, 55 | } 56 | } 57 | 58 | /** 59 | * Relation mappings getter 60 | * 61 | * @static 62 | * @returns {Object} 63 | */ 64 | static get relationMappings () { 65 | return { 66 | user: { 67 | relation: Model.BelongsToOneRelation, 68 | modelClass: UserModel, 69 | join: { 70 | from: 'chunks.userId', 71 | to: 'users.id', 72 | }, 73 | }, 74 | 75 | chat: { 76 | relation: Model.BelongsToOneRelation, 77 | modelClass: ChatModel, 78 | join: { 79 | from: 'chunks.chatId', 80 | to: 'chats.id', 81 | }, 82 | }, 83 | } 84 | } 85 | 86 | /** 87 | * Store the chunk of a code 88 | * 89 | * @static 90 | * @param {{userId,chatId,filename,lang,source}} data The chunk data 91 | * @param {Function} cb The callback function 92 | */ 93 | static store (data) { 94 | return new Promise((resolve, reject) => { 95 | this.query() 96 | .where('filename', data.filename) 97 | .then((chunk) => { 98 | if (!chunk || chunk.length === 0) { 99 | this.query().insert(data).then(resolve).catch(reject) 100 | } 101 | }) 102 | .catch(reject) 103 | }) 104 | } 105 | 106 | /** 107 | * Fires before insert in the DB 108 | */ 109 | $beforeInsert () { 110 | this.createdAt = new Date() 111 | } 112 | } 113 | 114 | export default ChunkModel 115 | -------------------------------------------------------------------------------- /src/model/User/user-model.mjs: -------------------------------------------------------------------------------- 1 | import Objection from 'objection' 2 | import { chatUser, makeUserFolder, onError } from '../../config/methods' 3 | 4 | const { Model, snakeCaseMappers } = Objection 5 | 6 | const unescapeUser = (user) => Object.keys(user).reduce((acc, key) => { 7 | let value 8 | 9 | switch (key) { 10 | case 'id': value = Number(user[key]) 11 | break 12 | case 'is_bot': 13 | console.log(user[key]) 14 | value = Boolean(user[key]) 15 | break 16 | default: value = user[key] 17 | } 18 | acc[key] = value 19 | return acc 20 | }, {}) 21 | 22 | class UserModel extends Model { 23 | /** 24 | * The DB table name 25 | * 26 | * @static 27 | * @return {string} 28 | */ 29 | static get tableName () { 30 | return 'users' 31 | } 32 | 33 | /** 34 | * Columns names mapper rules 35 | * 36 | * @static 37 | */ 38 | static get columnNameMappers () { 39 | return snakeCaseMappers() 40 | } 41 | 42 | /** 43 | * Default eager behavior 44 | * 45 | * @static 46 | * @return {EagerAlgorithm} 47 | */ 48 | static get defaultEagerAlgorithm () { 49 | return Model.JoinEagerAlgorithm 50 | } 51 | 52 | /** 53 | * JSON schema getter 54 | * 55 | * @static 56 | * @return {Object} 57 | */ 58 | static get jsonSchema () { 59 | return { 60 | type: 'object', 61 | required: ['id'], 62 | properties: { 63 | id: { type: 'integer' }, 64 | firstName: { type: 'string', maxLength: 255 }, 65 | lastName: { type: 'string', maxLength: 255 }, 66 | username: { type: 'string', maxLength: 255 }, 67 | languageCode: { type: 'string', maxLength: 2, default: 'en' }, 68 | isBot: { type: 'boolean' }, 69 | theme: { type: 'string', maxLength: 40, default: 'github' }, 70 | createdAt: { type: 'datetime' }, 71 | updatedAt: { type: 'datetime' }, 72 | }, 73 | } 74 | } 75 | 76 | /** 77 | * Stores the user 78 | * 79 | * @param ctx 80 | * @param next 81 | */ 82 | static store (ctx, next) { 83 | const chatUserData = chatUser(ctx) 84 | 85 | this.query() 86 | .findById(+chatUserData.id) 87 | .then((user) => { 88 | if (user) { 89 | ctx.state.user = user 90 | return next(ctx) 91 | } 92 | const { id, is_bot: isBot, ...data } = chatUserData 93 | 94 | return ( 95 | this.query() 96 | .insert({ id: +id, is_bot: isBot ? 1 : 0, ...data, theme: 'github' }) 97 | // eslint-disable-next-line no-shadow 98 | .then((user) => { 99 | ctx.state.user = user 100 | makeUserFolder(user) 101 | next(ctx) 102 | }) 103 | .catch(onError) 104 | ) 105 | }) 106 | .catch(onError) 107 | } 108 | 109 | static applyTheme ({ id }, theme, callback) { 110 | this.query() 111 | .patchAndFetchById(+id, { theme }) 112 | .then(callback) 113 | .catch(onError) 114 | } 115 | 116 | $beforeInsert () { 117 | this.createdAt = new Date() 118 | } 119 | 120 | $beforeUpdate () { 121 | this.updatedAt = new Date() 122 | } 123 | } 124 | 125 | export default UserModel 126 | -------------------------------------------------------------------------------- /src/server.mjs: -------------------------------------------------------------------------------- 1 | // import https from 'https' 2 | // import express from 'express' 3 | 4 | // import { tlsOptions, url, ENV } from './config/config' 5 | 6 | // const { WEBHOOK_DOMAIN, WEBHOOK_PATH, WEBHOOK_PORT, IMAGES_DIR } = ENV 7 | 8 | // export default class Server { 9 | // constructor (bot) { 10 | // const server = express() 11 | 12 | // server.use(bot.webhookCallback(`/${WEBHOOK_PATH}`)) 13 | // server.use(`/${IMAGES_DIR}`, express.static(IMAGES_DIR)) 14 | 15 | // // server.post(`/${WEBHOOK_PATH}`, (req, res) => bot.handleUpdate(req.body, res)) 16 | 17 | // bot.telegram.setWebhook(`${url}${WEBHOOK_PATH}`, tlsOptions.cert) 18 | // https.createServer(tlsOptions, server).listen(WEBHOOK_PORT, WEBHOOK_DOMAIN) 19 | 20 | // this.express = server 21 | // this.https = https 22 | // this.bot = bot 23 | // } 24 | // } 25 | --------------------------------------------------------------------------------