This commit is contained in:
		
							parent
							
								
									8b273e215f
								
							
						
					
					
						commit
						520299c2b4
					
				
					 169 changed files with 14582 additions and 14865 deletions
				
			
		
							
								
								
									
										323
									
								
								gulpfile.ts
									
										
									
									
									
								
							
							
						
						
									
										323
									
								
								gulpfile.ts
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -189,231 +189,6 @@ gulp.task('build:client:scripts', done => {
 | 
			
		|||
					.transform(ls)
 | 
			
		||||
					.transform(aliasify, aliasifyConfig)
 | 
			
		||||
 | 
			
		||||
					.transform(transformify((source, file) => {
 | 
			
		||||
						if (file.substr(-4) !== '.tag') return source;
 | 
			
		||||
						gutil.log('Build Tag: ' + file);
 | 
			
		||||
						return source;
 | 
			
		||||
					}))
 | 
			
		||||
 | 
			
		||||
					// tagの{}の''を不要にする (その代わりスタイルの記法は使えなくなるけど)
 | 
			
		||||
					.transform(transformify((source, file) => {
 | 
			
		||||
						if (file.substr(-4) !== '.tag') return source;
 | 
			
		||||
 | 
			
		||||
						const tag = new Tag(source);
 | 
			
		||||
						const html = tag.sections.filter(s => s.name == 'html')[0];
 | 
			
		||||
 | 
			
		||||
						html.lines = html.lines.map(line => {
 | 
			
		||||
							if (line.replace(/\t/g, '')[0] === '|') {
 | 
			
		||||
								return line;
 | 
			
		||||
							} else {
 | 
			
		||||
								return line.replace(/([+=])\s?\{(.+?)\}/g, '$1"{$2}"');
 | 
			
		||||
							}
 | 
			
		||||
						});
 | 
			
		||||
 | 
			
		||||
						const styles = tag.sections.filter(s => s.name == 'style');
 | 
			
		||||
 | 
			
		||||
						if (styles.length == 0) {
 | 
			
		||||
							return tag.compile();
 | 
			
		||||
						}
 | 
			
		||||
 | 
			
		||||
						styles.forEach(style => {
 | 
			
		||||
							let head = style.lines.shift();
 | 
			
		||||
							head = head.replace(/([+=])\s?\{(.+?)\}/g, '$1"{$2}"');
 | 
			
		||||
							style.lines.unshift(head);
 | 
			
		||||
						});
 | 
			
		||||
 | 
			
		||||
						return tag.compile();
 | 
			
		||||
					}))
 | 
			
		||||
 | 
			
		||||
					// tagの@hogeをref='hoge'にする
 | 
			
		||||
					.transform(transformify((source, file) => {
 | 
			
		||||
						if (file.substr(-4) !== '.tag') return source;
 | 
			
		||||
 | 
			
		||||
						const tag = new Tag(source);
 | 
			
		||||
						const html = tag.sections.filter(s => s.name == 'html')[0];
 | 
			
		||||
 | 
			
		||||
						html.lines = html.lines.map(line => {
 | 
			
		||||
							if (line.indexOf('@') === -1) {
 | 
			
		||||
								return line;
 | 
			
		||||
							} else if (line.replace(/\t/g, '')[0] === '|') {
 | 
			
		||||
								return line;
 | 
			
		||||
							} else {
 | 
			
		||||
								while (line.match(/[^\s']@[a-z-]+/) !== null) {
 | 
			
		||||
									const match = line.match(/@[a-z-]+/);
 | 
			
		||||
									let name = match[0];
 | 
			
		||||
									if (line[line.indexOf(name) + name.length] === '(') {
 | 
			
		||||
										line = line.replace(name + '(', '(ref=\'' + camelCase(name.substr(1)) + '\',');
 | 
			
		||||
									} else {
 | 
			
		||||
										line = line.replace(name, '(ref=\'' + camelCase(name.substr(1)) + '\')');
 | 
			
		||||
									}
 | 
			
		||||
								}
 | 
			
		||||
								return line;
 | 
			
		||||
							}
 | 
			
		||||
						});
 | 
			
		||||
 | 
			
		||||
						return tag.compile();
 | 
			
		||||
 | 
			
		||||
						function camelCase(str): string {
 | 
			
		||||
							return str.replace(/-([^\s])/g, (match, group1) => {
 | 
			
		||||
								return group1.toUpperCase();
 | 
			
		||||
							});
 | 
			
		||||
						}
 | 
			
		||||
					}))
 | 
			
		||||
 | 
			
		||||
					// tagのchain-caseをcamelCaseにする
 | 
			
		||||
					.transform(transformify((source, file) => {
 | 
			
		||||
						if (file.substr(-4) !== '.tag') return source;
 | 
			
		||||
 | 
			
		||||
						const tag = new Tag(source);
 | 
			
		||||
						const html = tag.sections.filter(s => s.name == 'html')[0];
 | 
			
		||||
 | 
			
		||||
						html.lines = html.lines.map(line => {
 | 
			
		||||
							(line.match(/\{.+?\}/g) || []).forEach(x => {
 | 
			
		||||
								line = line.replace(x, camelCase(x));
 | 
			
		||||
							});
 | 
			
		||||
							return line;
 | 
			
		||||
						});
 | 
			
		||||
 | 
			
		||||
						return tag.compile();
 | 
			
		||||
 | 
			
		||||
						function camelCase(str): string {
 | 
			
		||||
							str = str.replace(/([a-z\-]+):/g, (match, group1) => {
 | 
			
		||||
								return group1.replace(/\-/g, '###') + ':';
 | 
			
		||||
							});
 | 
			
		||||
							str = str.replace(/'(.+?)'/g, (match, group1) => {
 | 
			
		||||
								return "'" + group1.replace(/\-/g, '###') + "'";
 | 
			
		||||
							});
 | 
			
		||||
							str = str.replace(/-([^\s0-9])/g, (match, group1) => {
 | 
			
		||||
								return group1.toUpperCase();
 | 
			
		||||
							});
 | 
			
		||||
							str = str.replace(/###/g, '-');
 | 
			
		||||
 | 
			
		||||
							return str;
 | 
			
		||||
						}
 | 
			
		||||
					}))
 | 
			
		||||
 | 
			
		||||
					// tagのstyleの属性
 | 
			
		||||
					.transform(transformify((source, file) => {
 | 
			
		||||
						if (file.substr(-4) !== '.tag') return source;
 | 
			
		||||
 | 
			
		||||
						const tag = new Tag(source);
 | 
			
		||||
 | 
			
		||||
						const styles = tag.sections.filter(s => s.name == 'style');
 | 
			
		||||
 | 
			
		||||
						if (styles.length == 0) {
 | 
			
		||||
							return tag.compile();
 | 
			
		||||
						}
 | 
			
		||||
 | 
			
		||||
						styles.forEach(style => {
 | 
			
		||||
							let head = style.lines.shift();
 | 
			
		||||
							if (style.attr) {
 | 
			
		||||
								style.attr = style.attr + ', type=\'stylus\', scoped';
 | 
			
		||||
							} else {
 | 
			
		||||
								style.attr = 'type=\'stylus\', scoped';
 | 
			
		||||
							}
 | 
			
		||||
							style.lines.unshift(head);
 | 
			
		||||
						});
 | 
			
		||||
 | 
			
		||||
						return tag.compile();
 | 
			
		||||
					}))
 | 
			
		||||
 | 
			
		||||
					// tagのstyleの定数
 | 
			
		||||
					.transform(transformify((source, file) => {
 | 
			
		||||
						if (file.substr(-4) !== '.tag') return source;
 | 
			
		||||
 | 
			
		||||
						const tag = new Tag(source);
 | 
			
		||||
 | 
			
		||||
						const styles = tag.sections.filter(s => s.name == 'style');
 | 
			
		||||
 | 
			
		||||
						if (styles.length == 0) {
 | 
			
		||||
							return tag.compile();
 | 
			
		||||
						}
 | 
			
		||||
 | 
			
		||||
						styles.forEach(style => {
 | 
			
		||||
							const head = style.lines.shift();
 | 
			
		||||
							style.lines.unshift('$theme-color = ' + config.themeColor);
 | 
			
		||||
							style.lines.unshift('$theme-color-foreground = #fff');
 | 
			
		||||
							style.lines.unshift(head);
 | 
			
		||||
						});
 | 
			
		||||
 | 
			
		||||
						return tag.compile();
 | 
			
		||||
					}))
 | 
			
		||||
 | 
			
		||||
					// tagのstyleを暗黙的に:scopeにする
 | 
			
		||||
					.transform(transformify((source, file) => {
 | 
			
		||||
						if (file.substr(-4) !== '.tag') return source;
 | 
			
		||||
 | 
			
		||||
						const tag = new Tag(source);
 | 
			
		||||
 | 
			
		||||
						const styles = tag.sections.filter(s => s.name == 'style');
 | 
			
		||||
 | 
			
		||||
						if (styles.length == 0) {
 | 
			
		||||
							return tag.compile();
 | 
			
		||||
						}
 | 
			
		||||
 | 
			
		||||
						styles.forEach((style, i) => {
 | 
			
		||||
							if (i != 0) {
 | 
			
		||||
								return;
 | 
			
		||||
							}
 | 
			
		||||
							const head = style.lines.shift();
 | 
			
		||||
							style.lines = style.lines.map(line => {
 | 
			
		||||
								return '\t' + line;
 | 
			
		||||
							});
 | 
			
		||||
							style.lines.unshift(':scope');
 | 
			
		||||
							style.lines.unshift(head);
 | 
			
		||||
						});
 | 
			
		||||
 | 
			
		||||
						return tag.compile();
 | 
			
		||||
					}))
 | 
			
		||||
 | 
			
		||||
					// tagのtheme styleのパース
 | 
			
		||||
					.transform(transformify((source, file) => {
 | 
			
		||||
						if (file.substr(-4) !== '.tag') return source;
 | 
			
		||||
 | 
			
		||||
						const tag = new Tag(source);
 | 
			
		||||
 | 
			
		||||
						const styles = tag.sections.filter(s => s.name == 'style');
 | 
			
		||||
 | 
			
		||||
						if (styles.length == 0) {
 | 
			
		||||
							return tag.compile();
 | 
			
		||||
						}
 | 
			
		||||
 | 
			
		||||
						styles.forEach((style, i) => {
 | 
			
		||||
							if (i == 0) {
 | 
			
		||||
								return;
 | 
			
		||||
							} else if (style.attr.substr(0, 6) != 'theme=') {
 | 
			
		||||
								return;
 | 
			
		||||
							}
 | 
			
		||||
							const head = style.lines.shift();
 | 
			
		||||
							style.lines = style.lines.map(line => {
 | 
			
		||||
								return '\t' + line;
 | 
			
		||||
							});
 | 
			
		||||
							style.lines.unshift(':scope');
 | 
			
		||||
							style.lines = style.lines.map(line => {
 | 
			
		||||
								return '\t' + line;
 | 
			
		||||
							});
 | 
			
		||||
							style.lines.unshift('html[data-' + style.attr.match(/theme='(.+?)'/)[0] + ']');
 | 
			
		||||
							style.lines.unshift(head);
 | 
			
		||||
						});
 | 
			
		||||
 | 
			
		||||
						return tag.compile();
 | 
			
		||||
					}))
 | 
			
		||||
 | 
			
		||||
					// tagのstyleおよびscriptのインデントを不要にする
 | 
			
		||||
					.transform(transformify((source, file) => {
 | 
			
		||||
						if (file.substr(-4) !== '.tag') return source;
 | 
			
		||||
						const tag = new Tag(source);
 | 
			
		||||
 | 
			
		||||
						tag.sections = tag.sections.map(section => {
 | 
			
		||||
							if (section.name != 'html') {
 | 
			
		||||
								section.indent++;
 | 
			
		||||
							}
 | 
			
		||||
							return section;
 | 
			
		||||
						});
 | 
			
		||||
 | 
			
		||||
						return tag.compile();
 | 
			
		||||
					}))
 | 
			
		||||
 | 
			
		||||
					// スペースでインデントされてないとエラーが出る
 | 
			
		||||
					.transform(transformify((source, file) => {
 | 
			
		||||
						if (file.substr(-4) !== '.tag') return source;
 | 
			
		||||
| 
						 | 
				
			
			@ -423,6 +198,8 @@ gulp.task('build:client:scripts', done => {
 | 
			
		|||
					.transform(transformify((source, file) => {
 | 
			
		||||
						return source
 | 
			
		||||
							.replace(/VERSION/g, `'${commit ? commit.hash : 'null'}'`)
 | 
			
		||||
							.replace(/\$theme\-color\-foreground/g, '#fff')
 | 
			
		||||
							.replace(/\$theme\-color/g, config.themeColor)
 | 
			
		||||
							.replace(/CONFIG\.theme-color/g, `'${config.themeColor}'`)
 | 
			
		||||
							.replace(/CONFIG\.themeColor/g, `'${config.themeColor}'`)
 | 
			
		||||
							.replace(/CONFIG\.api\.url/g, `'${config.scheme}://api.${config.host}'`)
 | 
			
		||||
| 
						 | 
				
			
			@ -435,7 +212,6 @@ gulp.task('build:client:scripts', done => {
 | 
			
		|||
					}))
 | 
			
		||||
 | 
			
		||||
					.transform(riotify, {
 | 
			
		||||
						template: 'pug',
 | 
			
		||||
						type: 'livescript',
 | 
			
		||||
						expr: false,
 | 
			
		||||
						compact: true,
 | 
			
		||||
| 
						 | 
				
			
			@ -446,17 +222,6 @@ gulp.task('build:client:scripts', done => {
 | 
			
		|||
							}
 | 
			
		||||
						}
 | 
			
		||||
					})
 | 
			
		||||
					// Riotが謎の空白を挿入する
 | 
			
		||||
					.transform(transformify((source, file) => {
 | 
			
		||||
						if (file.substr(-4) !== '.tag') return source;
 | 
			
		||||
						return source.replace(/\s<mk\-ellipsis>/g, '<mk-ellipsis>');
 | 
			
		||||
					}))
 | 
			
		||||
					/*
 | 
			
		||||
					// LiveScruptがHTMLクラスのショートカットを変な風に生成するのでそれを修正
 | 
			
		||||
					.transform(transformify((source, file) => {
 | 
			
		||||
						if (file.substr(-4) !== '.tag') return source;
 | 
			
		||||
						return source.replace(/class="\{\(\{(.+?)\}\)\}"/g, 'class="{$1}"');
 | 
			
		||||
					}))*/
 | 
			
		||||
					.bundle()
 | 
			
		||||
					.pipe(source(entry.replace('./src/web/app/', './').replace('.ls', '.js')));
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -531,87 +296,3 @@ gulp.task('build:client:pug', [
 | 
			
		|||
		}))
 | 
			
		||||
		.pipe(gulp.dest('./built/web/app/'));
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
class Tag {
 | 
			
		||||
	sections: {
 | 
			
		||||
		name: string;
 | 
			
		||||
		attr?: string;
 | 
			
		||||
		indent: number;
 | 
			
		||||
		lines: string[];
 | 
			
		||||
	}[];
 | 
			
		||||
 | 
			
		||||
	constructor(source) {
 | 
			
		||||
		this.sections = [];
 | 
			
		||||
 | 
			
		||||
		source = source
 | 
			
		||||
			.replace(/\r\n/g, '\n')
 | 
			
		||||
			.replace(/\n(\t+?)\n/g, '\n')
 | 
			
		||||
			.replace(/\n+/g, '\n');
 | 
			
		||||
 | 
			
		||||
		const html = {
 | 
			
		||||
			name: 'html',
 | 
			
		||||
			indent: 0,
 | 
			
		||||
			lines: []
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
		let flag = false;
 | 
			
		||||
		source.split('\n').forEach((line, i) => {
 | 
			
		||||
			const indent = line.lastIndexOf('\t') + 1;
 | 
			
		||||
			if (i != 0 && indent == 0) {
 | 
			
		||||
				flag = true;
 | 
			
		||||
			}
 | 
			
		||||
			if (!flag) {
 | 
			
		||||
				source = source.replace(/^.*?\n/, '');
 | 
			
		||||
				html.lines.push(i == 0 ? line : line.substr(1));
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
		this.sections.push(html);
 | 
			
		||||
 | 
			
		||||
		while (source != '') {
 | 
			
		||||
			const line = source.substr(0, source.indexOf('\n'));
 | 
			
		||||
			const root = line.match(/^\t*([a-z]+)(\.|\()?/)[1];
 | 
			
		||||
			const beginIndent = line.lastIndexOf('\t') + 1;
 | 
			
		||||
			flag = false;
 | 
			
		||||
			const section = {
 | 
			
		||||
				name: root,
 | 
			
		||||
				attr: (line.match(/\((.+?)\)/) || [null, null])[1],
 | 
			
		||||
				indent: beginIndent,
 | 
			
		||||
				lines: []
 | 
			
		||||
			};
 | 
			
		||||
			source.split('\n').forEach((line, i) => {
 | 
			
		||||
				const currentIndent = line.lastIndexOf('\t') + 1;
 | 
			
		||||
				if (i != 0 && (currentIndent == beginIndent || currentIndent == 0)) {
 | 
			
		||||
					flag = true;
 | 
			
		||||
				}
 | 
			
		||||
				if (!flag) {
 | 
			
		||||
					if (i == 0 && line[line.length - 1] == '.') {
 | 
			
		||||
						line = line.substr(0, line.length - 1);
 | 
			
		||||
					}
 | 
			
		||||
					if (i == 0 && line.indexOf('(') != -1) {
 | 
			
		||||
						line = line.substr(0, line.indexOf('('));
 | 
			
		||||
					}
 | 
			
		||||
					source = source.replace(/^.*?\n/, '');
 | 
			
		||||
					section.lines.push(i == 0 ? line.substr(beginIndent) : line.substr(beginIndent + 1));
 | 
			
		||||
				}
 | 
			
		||||
			});
 | 
			
		||||
			this.sections.push(section);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	compile(): string {
 | 
			
		||||
		let dist = '';
 | 
			
		||||
		this.sections.forEach((section, j) => {
 | 
			
		||||
			dist += section.lines.map((line, i) => {
 | 
			
		||||
				if (i == 0) {
 | 
			
		||||
					const attr = section.attr != null ? '(' + section.attr + ')' : '';
 | 
			
		||||
					const tail = j != 0 ? '.' : '';
 | 
			
		||||
					return '\t'.repeat(section.indent) + line + attr + tail;
 | 
			
		||||
				} else {
 | 
			
		||||
					return '\t'.repeat(section.indent + 1) + line;
 | 
			
		||||
				}
 | 
			
		||||
			}).join('\n') + '\n';
 | 
			
		||||
		});
 | 
			
		||||
		return dist;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue