├── .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 |
2 |
3 |
66 |
69 |
77 |
78 |
79 |
![]()
80 |
81 |
82 |
83 |
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 |
--------------------------------------------------------------------------------