├── .editorconfig ├── .gitignore ├── README.md ├── index.html ├── package.json ├── src ├── app.js ├── components │ └── App.vue ├── css │ ├── form-control.css │ ├── main.css │ ├── reset.css │ └── responsive.css └── index.js ├── static ├── CNAME └── favicon.ico ├── vbuild.config.js └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.log 3 | .DS_Store 4 | 5 | # output by vbuild(webpack) 6 | /dist 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # texy 2 | 3 | https://texy.js.org 4 | 5 | ## Todo 6 | 7 | - [ ] Word wrap 8 | - [ ] Highlight programming languages 9 | - [ ] Insert images 10 | 11 | ## Development 12 | 13 | ```bash 14 | yarn global add vbuild 15 | 16 | # develop 17 | npm run dev 18 | 19 | # production 20 | npm run build 21 | ``` 22 | 23 | ## License 24 | 25 | MIT © [EGOIST](https://github.com/egoist) 26 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | <%= htmlWebpackPlugin.options.title %> 8 | 9 | 10 |
11 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "name": "texy", 4 | "scripts": { 5 | "dev": "vbuild -dc", 6 | "build": "vbuild -c", 7 | "gh": "npm run build && gh-pages -d dist" 8 | }, 9 | "dependencies": { 10 | "clipboard": "^1.5.15", 11 | "lodash.throttle": "^4.1.1", 12 | "native-toast": "^0.2.0", 13 | "query-string": "^4.2.3", 14 | "taboverride": "^4.0.3" 15 | }, 16 | "devDependencies": { 17 | "gh-pages": "^0.12.0", 18 | "postcss-nested": "^1.0.0" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/app.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import App from 'components/App.vue' 3 | 4 | export default new Vue({ 5 | ...App 6 | }) 7 | -------------------------------------------------------------------------------- /src/components/App.vue: -------------------------------------------------------------------------------- 1 | 84 | 85 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | -------------------------------------------------------------------------------- /src/css/form-control.css: -------------------------------------------------------------------------------- 1 | .button { 2 | border: 1px solid #e2e2e2; 3 | border-radius: 4px; 4 | display: block; 5 | outline: none; 6 | background-color: white; 7 | width: 100%; 8 | padding: 8px 12px; 9 | font-size: 16px; 10 | cursor: pointer; 11 | &:hover { 12 | background-color: #f0f0f0; 13 | border-color: #ccc; 14 | } 15 | } 16 | .form-control[type="text"] { 17 | width: 100%; 18 | padding: 5px 8px; 19 | outline: none; 20 | border: 1px solid #e2e2e2; 21 | border-radius: 4px; 22 | &:focus { 23 | border-color: #ccc; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/css/main.css: -------------------------------------------------------------------------------- 1 | #app { 2 | display: flex; 3 | height: 100%; 4 | } 5 | .sidebar { 6 | margin: 0; 7 | width: 280px; 8 | border-right: 1px solid #e2e2e2; 9 | height: 100%; 10 | padding: 10px; 11 | overflow: auto; 12 | .site-title { 13 | margin: 0 0 10px 0; 14 | a { 15 | color: #333; 16 | &:hover { 17 | text-decoration: none; 18 | } 19 | } 20 | } 21 | .description { 22 | color: #999; 23 | margin-bottom: 20px; 24 | } 25 | } 26 | .main { 27 | width: calc(100% - 280px); 28 | height: 100%; 29 | display: flex; 30 | flex-direction: column; 31 | &.left-to-right { 32 | flex-direction: row; 33 | .input, .preview { 34 | width: 50%; 35 | height: 100%; 36 | } 37 | } 38 | } 39 | .input { 40 | height: 50%; 41 | width: 100%; 42 | border: none; 43 | outline: none; 44 | background-color: #f0f0f0; 45 | resize: none; 46 | padding: 10px; 47 | font-size: 18px; 48 | } 49 | .preview { 50 | height: 50%; 51 | overflow: auto; 52 | position: relative; 53 | } 54 | .settings { 55 | label { 56 | display: block; 57 | user-select: none; 58 | } 59 | .form-control { 60 | display: block; 61 | margin-top: 5px; 62 | } 63 | .form-group { 64 | margin-bottom: 20px; 65 | } 66 | } 67 | .tip { 68 | padding: 10px; 69 | background-color: #f9f9f9; 70 | margin-bottom: 20px; 71 | color: #666; 72 | font-size: 13px; 73 | p { 74 | margin: 0; 75 | } 76 | } 77 | #link { 78 | color: #999; 79 | &:focus { 80 | color: #333; 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /src/css/reset.css: -------------------------------------------------------------------------------- 1 | html, body { 2 | height: 100%; 3 | } 4 | body { 5 | margin: 0; 6 | font-size: 16px; 7 | line-height: 1.4; 8 | font-family: Helvetica, sans-serif; 9 | } 10 | * { 11 | box-sizing: border-box; 12 | } 13 | a { 14 | text-decoration: none; 15 | color: #4fc08d; 16 | &:hover { 17 | text-decoration: underline; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/css/responsive.css: -------------------------------------------------------------------------------- 1 | @media screen and (max-width: 768px) { 2 | .sidebar { 3 | display: none; 4 | } 5 | .main { 6 | width: 100%; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import app from './app' 2 | 3 | app.$mount('#app') 4 | -------------------------------------------------------------------------------- /static/CNAME: -------------------------------------------------------------------------------- 1 | texy.js.org 2 | -------------------------------------------------------------------------------- /static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/egoist/texy/ff32e9bad4a5e575fbc0e091ee9f11223375dba6/static/favicon.ico -------------------------------------------------------------------------------- /vbuild.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | 3 | module.exports = (options, req) => ({ 4 | entry: 'src/index.js', 5 | html: { 6 | title: 'Texy', 7 | template: 'index.html', 8 | }, 9 | webpack: { 10 | resolve: { 11 | modules: [path.resolve('./src')] 12 | } 13 | }, 14 | postcss: [ 15 | req('autoprefixer')({ 16 | browsers: ['last 4 versions', 'ie > 8'] 17 | }), 18 | require('postcss-nested') 19 | ] 20 | }) 21 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | ansi-regex@^2.0.0: 6 | version "2.1.1" 7 | resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 8 | 9 | ansi-styles@^2.2.1: 10 | version "2.2.1" 11 | resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 12 | 13 | array-union@^1.0.1: 14 | version "1.0.2" 15 | resolved "http://registry.npm.taobao.org/array-union/download/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 16 | dependencies: 17 | array-uniq "^1.0.1" 18 | 19 | array-uniq@^1.0.1: 20 | version "1.0.3" 21 | resolved "http://registry.npm.taobao.org/array-uniq/download/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 22 | 23 | async@2.1.2: 24 | version "2.1.2" 25 | resolved "http://registry.npm.taobao.org/async/download/async-2.1.2.tgz#612a4ab45ef42a70cde806bad86ee6db047e8385" 26 | dependencies: 27 | lodash "^4.14.0" 28 | 29 | balanced-match@^0.4.1: 30 | version "0.4.2" 31 | resolved "http://registry.npm.taobao.org/balanced-match/download/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" 32 | 33 | brace-expansion@^1.0.0: 34 | version "1.1.6" 35 | resolved "http://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" 36 | dependencies: 37 | balanced-match "^0.4.1" 38 | concat-map "0.0.1" 39 | 40 | chalk@^1.1.3: 41 | version "1.1.3" 42 | resolved "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 43 | dependencies: 44 | ansi-styles "^2.2.1" 45 | escape-string-regexp "^1.0.2" 46 | has-ansi "^2.0.0" 47 | strip-ansi "^3.0.0" 48 | supports-color "^2.0.0" 49 | 50 | clipboard: 51 | version "1.5.15" 52 | resolved "http://registry.npm.taobao.org/clipboard/download/clipboard-1.5.15.tgz#6f24bf58a89b5a3fc1070dabdeaeaebb68382cee" 53 | dependencies: 54 | good-listener "^1.2.0" 55 | select "^1.0.6" 56 | tiny-emitter "^1.0.0" 57 | 58 | collections@^0.2.0: 59 | version "0.2.2" 60 | resolved "http://registry.npm.taobao.org/collections/download/collections-0.2.2.tgz#1f23026b2ef36f927eecc901e99c5f0d48fa334e" 61 | dependencies: 62 | weak-map "1.0.0" 63 | 64 | commander@2.9.0: 65 | version "2.9.0" 66 | resolved "http://registry.npm.taobao.org/commander/download/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" 67 | dependencies: 68 | graceful-readlink ">= 1.0.0" 69 | 70 | concat-map@0.0.1: 71 | version "0.0.1" 72 | resolved "http://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 73 | 74 | delegate@^3.1.0: 75 | version "3.1.0" 76 | resolved "http://registry.npm.taobao.org/delegate/download/delegate-3.1.0.tgz#30c5c9ddbab0547e527dbbbb89d1495ab4cddc93" 77 | 78 | escape-string-regexp@^1.0.2: 79 | version "1.0.5" 80 | resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 81 | 82 | fs.realpath@^1.0.0: 83 | version "1.0.0" 84 | resolved "http://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 85 | 86 | gh-pages: 87 | version "0.12.0" 88 | resolved "http://registry.npm.taobao.org/gh-pages/download/gh-pages-0.12.0.tgz#d951e3ed98b85699d4b0418eb1a15b1a04988dc1" 89 | dependencies: 90 | async "2.1.2" 91 | commander "2.9.0" 92 | globby "^6.1.0" 93 | graceful-fs "4.1.10" 94 | q "1.4.1" 95 | q-io "1.13.2" 96 | rimraf "^2.5.4" 97 | 98 | glob@^7.0.3, glob@^7.0.5: 99 | version "7.1.1" 100 | resolved "http://registry.npm.taobao.org/glob/download/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" 101 | dependencies: 102 | fs.realpath "^1.0.0" 103 | inflight "^1.0.4" 104 | inherits "2" 105 | minimatch "^3.0.2" 106 | once "^1.3.0" 107 | path-is-absolute "^1.0.0" 108 | 109 | globby@^6.1.0: 110 | version "6.1.0" 111 | resolved "http://registry.npm.taobao.org/globby/download/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" 112 | dependencies: 113 | array-union "^1.0.1" 114 | glob "^7.0.3" 115 | object-assign "^4.0.1" 116 | pify "^2.0.0" 117 | pinkie-promise "^2.0.0" 118 | 119 | good-listener@^1.2.0: 120 | version "1.2.0" 121 | resolved "http://registry.npm.taobao.org/good-listener/download/good-listener-1.2.0.tgz#c473e31ba8c12cf82b6137cd867565beab5ba053" 122 | dependencies: 123 | delegate "^3.1.0" 124 | 125 | graceful-fs@4.1.10: 126 | version "4.1.10" 127 | resolved "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.1.10.tgz#f2d720c22092f743228775c75e3612632501f131" 128 | 129 | "graceful-readlink@>= 1.0.0": 130 | version "1.0.1" 131 | resolved "http://registry.npm.taobao.org/graceful-readlink/download/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" 132 | 133 | has-ansi@^2.0.0: 134 | version "2.0.0" 135 | resolved "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 136 | dependencies: 137 | ansi-regex "^2.0.0" 138 | 139 | has-flag@^1.0.0: 140 | version "1.0.0" 141 | resolved "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" 142 | 143 | inflight@^1.0.4: 144 | version "1.0.6" 145 | resolved "http://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 146 | dependencies: 147 | once "^1.3.0" 148 | wrappy "1" 149 | 150 | inherits@2: 151 | version "2.0.3" 152 | resolved "http://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 153 | 154 | js-base64@^2.1.9: 155 | version "2.1.9" 156 | resolved "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz#f0e80ae039a4bd654b5f281fc93f04a914a7fcce" 157 | 158 | lodash.throttle: 159 | version "4.1.1" 160 | resolved "http://registry.npm.taobao.org/lodash.throttle/download/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" 161 | 162 | lodash@^4.14.0: 163 | version "4.17.2" 164 | resolved "http://registry.npm.taobao.org/lodash/download/lodash-4.17.2.tgz#34a3055babe04ce42467b607d700072c7ff6bf42" 165 | 166 | mime@^1.2.11: 167 | version "1.3.4" 168 | resolved "http://registry.npm.taobao.org/mime/download/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" 169 | 170 | mimeparse@^0.1.4: 171 | version "0.1.4" 172 | resolved "http://registry.npm.taobao.org/mimeparse/download/mimeparse-0.1.4.tgz#dafb02752370fd226093ae3152c271af01ac254a" 173 | 174 | minimatch@^3.0.2: 175 | version "3.0.3" 176 | resolved "http://registry.npm.taobao.org/minimatch/download/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" 177 | dependencies: 178 | brace-expansion "^1.0.0" 179 | 180 | native-toast: 181 | version "0.2.0" 182 | resolved "http://registry.npm.taobao.org/native-toast/download/native-toast-0.2.0.tgz#0314a9df082c20310613342d8043557c795d9dfb" 183 | 184 | object-assign@^4.0.1, object-assign@^4.1.0: 185 | version "4.1.0" 186 | resolved "http://registry.npm.taobao.org/object-assign/download/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" 187 | 188 | once@^1.3.0: 189 | version "1.4.0" 190 | resolved "http://registry.npm.taobao.org/once/download/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 191 | dependencies: 192 | wrappy "1" 193 | 194 | path-is-absolute@^1.0.0: 195 | version "1.0.1" 196 | resolved "http://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 197 | 198 | pify@^2.0.0: 199 | version "2.3.0" 200 | resolved "http://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 201 | 202 | pinkie-promise@^2.0.0: 203 | version "2.0.1" 204 | resolved "http://registry.npm.taobao.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 205 | dependencies: 206 | pinkie "^2.0.0" 207 | 208 | pinkie@^2.0.0: 209 | version "2.0.4" 210 | resolved "http://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 211 | 212 | postcss-nested@^1.0.0: 213 | version "1.0.0" 214 | resolved "https://registry.npmjs.org/postcss-nested/-/postcss-nested-1.0.0.tgz#d136bd4b576bd5632df142c12b2198a9ccf794df" 215 | dependencies: 216 | postcss "^5.0.2" 217 | 218 | postcss@^5.0.2: 219 | version "5.2.13" 220 | resolved "https://registry.npmjs.org/postcss/-/postcss-5.2.13.tgz#1be52a32cf2ef58c0d75f1aedb3beabcf257cef3" 221 | dependencies: 222 | chalk "^1.1.3" 223 | js-base64 "^2.1.9" 224 | source-map "^0.5.6" 225 | supports-color "^3.2.3" 226 | 227 | q-io@1.13.2: 228 | version "1.13.2" 229 | resolved "http://registry.npm.taobao.org/q-io/download/q-io-1.13.2.tgz#eea130d481ddb5e1aa1bc5a66855f7391d06f003" 230 | dependencies: 231 | collections "^0.2.0" 232 | mime "^1.2.11" 233 | mimeparse "^0.1.4" 234 | q "^1.0.1" 235 | qs "^1.2.1" 236 | url2 "^0.0.0" 237 | 238 | q@1.4.1, q@^1.0.1: 239 | version "1.4.1" 240 | resolved "http://registry.npm.taobao.org/q/download/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" 241 | 242 | qs@^1.2.1: 243 | version "1.2.2" 244 | resolved "http://registry.npm.taobao.org/qs/download/qs-1.2.2.tgz#19b57ff24dc2a99ce1f8bdf6afcda59f8ef61f88" 245 | 246 | query-string: 247 | version "4.2.3" 248 | resolved "http://registry.npm.taobao.org/query-string/download/query-string-4.2.3.tgz#9f27273d207a25a8ee4c7b8c74dcd45d556db822" 249 | dependencies: 250 | object-assign "^4.1.0" 251 | strict-uri-encode "^1.0.0" 252 | 253 | rimraf@^2.5.4: 254 | version "2.5.4" 255 | resolved "http://registry.npm.taobao.org/rimraf/download/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" 256 | dependencies: 257 | glob "^7.0.5" 258 | 259 | select@^1.0.6: 260 | version "1.1.0" 261 | resolved "http://registry.npm.taobao.org/select/download/select-1.1.0.tgz#a6c520cd9ab919ad81c7d1a273e0452f504dd7a2" 262 | 263 | source-map@^0.5.6: 264 | version "0.5.6" 265 | resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" 266 | 267 | strict-uri-encode@^1.0.0: 268 | version "1.1.0" 269 | resolved "http://registry.npm.taobao.org/strict-uri-encode/download/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" 270 | 271 | strip-ansi@^3.0.0: 272 | version "3.0.1" 273 | resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 274 | dependencies: 275 | ansi-regex "^2.0.0" 276 | 277 | supports-color@^2.0.0: 278 | version "2.0.0" 279 | resolved "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 280 | 281 | supports-color@^3.2.3: 282 | version "3.2.3" 283 | resolved "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" 284 | dependencies: 285 | has-flag "^1.0.0" 286 | 287 | taboverride: 288 | version "4.0.3" 289 | resolved "http://registry.npm.taobao.org/taboverride/download/taboverride-4.0.3.tgz#33924012a2f3af5ee609c5f30e1bd26a75fbe6a9" 290 | 291 | tiny-emitter@^1.0.0: 292 | version "1.1.0" 293 | resolved "http://registry.npm.taobao.org/tiny-emitter/download/tiny-emitter-1.1.0.tgz#ab405a21ffed814a76c19739648093d70654fecb" 294 | 295 | url2@^0.0.0: 296 | version "0.0.0" 297 | resolved "http://registry.npm.taobao.org/url2/download/url2-0.0.0.tgz#4eaabd1d5c3ac90d62ab4485c998422865a04b1a" 298 | 299 | weak-map@1.0.0: 300 | version "1.0.0" 301 | resolved "http://registry.npm.taobao.org/weak-map/download/weak-map-1.0.0.tgz#b66e56a9df0bd25a76bbf1b514db129080614a37" 302 | 303 | wrappy@1: 304 | version "1.0.2" 305 | resolved "http://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 306 | --------------------------------------------------------------------------------