1
0
mirror of https://github.com/pdemian/human2regex.git synced 2025-05-15 20:10:19 -07:00

Next push

This commit is contained in:
Patrick Demian 2020-10-04 06:12:27 -04:00
parent ea0244c103
commit c1ba3a6c69
18 changed files with 275 additions and 112 deletions

5
.gitignore vendored
View File

@ -1,6 +1,3 @@
# Node build artifacts
node_modules/
npm-debug.log
src/build.js
src/config.js
src/script.js
npm-debug.log

129
build.ts Normal file
View File

@ -0,0 +1,129 @@
/*! Copyright (c) 2020 Patrick Demian; Licensed under MIT */
import { render } from 'mustache';
import { readFileSync, copyFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
import { emptyDirSync } from 'fs-extra';
import { minify } from 'html-minifier';
import { basename } from 'path';
import { minify as uglify } from 'uglify-js';
import clean_css from 'clean-css';
import { glob } from 'glob';
import { config } from './config';
function join(...args: string[]): string {
if(arguments.length == 0) return "";
let result = args[0];
for(let i = 1; i < args.length; i++) {
const has_end_slash = result.endsWith('/');
const has_start_slash = args[i].startsWith('/');
if(has_end_slash && has_start_slash) {
result += args[i].slice(1);
}
else if(has_end_slash || has_start_slash) {
result += args[i];
}
else {
result += '/' + args[i];
}
}
return result;
}
function read_file(filename: string): string {
return readFileSync(filename, 'utf8');
}
function read_json_file(filename: string): any {
return JSON.parse(read_file(filename));
}
function compress_html(input: string): string {
return config.prod ? minify(input, config.compression_config.html) : input;
}
function compress_js(input: string): string {
return config.prod ? uglify(input, config.compression_config.js).code : input;
}
function compress_css(input: string): string {
return config.prod ? (new clean_css(config.compression_config.css)).minify(input).styles : input;
}
function clean() {
emptyDirSync(config.dst);
}
function build() {
if(!existsSync(config.dst)) {
mkdirSync(config.dst);
}
clean();
// get build files
const copy_files = glob.sync(join(config.src, "!(*.js|*.css|*.mustache|*.ts)"), {nodir: true });
const css_files = glob.sync(join(config.src, "*.css"));
const js_files = glob.sync(join(config.src, "*.js"));
const main_files = glob.sync(join(config.src, 'main', '*.json'));
const error_files = glob.sync(join(config.src, 'error', '*.json'));
// get partials
let partials = {
header: read_file(join(config.src, '/header.mustache')),
footer: read_file(join(config.src, '/footer.mustache'))
};
// copy inconsequential files
for(const item of copy_files) {
const filename = basename(item);
const from = join(config.src, filename);
const to = join(config.dst, filename);
copyFileSync(from, to);
}
// compress & copy css files
for(const item of css_files) {
const filename = basename(item, '.css');
const from = join(config.src, filename + '.css');
const to = join(config.dst, filename + '.min.css');
writeFileSync(to, compress_css(read_file(from)));
}
// compress & copy js files
for(const item of js_files) {
const filename = basename(item, '.js');
const from = join(config.src, filename + '.js');
const to = join(config.dst, filename + '.min.js');
writeFileSync(to, compress_js(read_file(from)));
}
// build main mustache files
for(const item of main_files) {
const filename = basename(item, '.json');
const view = read_json_file(item);
const to = join(config.dst, filename + '.html');
const template = read_file(join(config.src, filename + '.mustache'));
writeFileSync(to, compress_html(render(template, view, partials)));
}
// build error mustache files
for(const item of error_files) {
const filename = basename(item, '.json');
const view = read_json_file(item);
const to = join(config.dst, filename + '.html');
const template = read_file(join(config.src, '/error.mustache'));
writeFileSync(to, compress_html(render(template, view, partials)));
}
}
build();

1
build/400.html Normal file
View File

@ -0,0 +1 @@
<!DOCTYPE html><html lang="en" dir="ltr"><head><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name="description" content="Bad Request"><meta name="keywords" content="Human2Regex, Human, Regex, Natural, Language, Natural Language"><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Error 400 - Bad Request</title><link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet" type="text/css"><link href="/style.css" rel="stylesheet" type="text/css"><meta name="theme-color" content="#212529"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="default"><link rel="icon" type="image/x-icon" href="/favicon.ico"></head><body><a class="skip skip-top" href="#maincontent">Skip to main content</a><div class="wrapper"><nav class="navbar navbar-expand-lg navbar-light fixed-top" id="mainNav"><div class="container"><a class="navbar-brand" href="/"><img src="/favicon.png" width="30" height="30" class="d-inline-block align-top" alt="logo">&nbsp;Human2Regex</a></div></nav><header class="masthead"><div class="overlay"></div><div class="container"><div class="row"><div class="col-lg-12 col-md-12 mx-auto"><div class="site-heading"><h1>400</h1><span class="subheading">Bad Request</span></div></div></div></div></header><div class="container" id="maincontent" role="main"><br><br><br><div class="row"><div class="col-12 mx-auto"><h3 class="align_header">The server cannot process the request.</h3></div></div></div><footer><div class="container"><div class="row"><div class="col-lg-8 col-md-10 mx-auto"><p class="copyright">Copyright &copy; 2020 Patrick Demian. This page's source code is available at <a rel="noopener noreferrer" href="https://github.com/pdemian/">github.com/pdemian/</a></p></div></div></div></footer></div><script defer="defer" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script><script defer="defer" src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/js/bootstrap.bundle.min.js"></script><script defer="defer" src="/script.min.js"></script></body></html>

1
build/401.html Normal file
View File

@ -0,0 +1 @@
<!DOCTYPE html><html lang="en" dir="ltr"><head><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name="description" content="Unauthorized"><meta name="keywords" content="Human2Regex, Human, Regex, Natural, Language, Natural Language"><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Error 401 - Unauthorized</title><link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet" type="text/css"><link href="/style.css" rel="stylesheet" type="text/css"><meta name="theme-color" content="#212529"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="default"><link rel="icon" type="image/x-icon" href="/favicon.ico"></head><body><a class="skip skip-top" href="#maincontent">Skip to main content</a><div class="wrapper"><nav class="navbar navbar-expand-lg navbar-light fixed-top" id="mainNav"><div class="container"><a class="navbar-brand" href="/"><img src="/favicon.png" width="30" height="30" class="d-inline-block align-top" alt="logo">&nbsp;Human2Regex</a></div></nav><header class="masthead"><div class="overlay"></div><div class="container"><div class="row"><div class="col-lg-12 col-md-12 mx-auto"><div class="site-heading"><h1>401</h1><span class="subheading">Unauthorized</span></div></div></div></div></header><div class="container" id="maincontent" role="main"><br><br><br><div class="row"><div class="col-12 mx-auto"><h3 class="align_header">Authentication required.</h3></div></div></div><footer><div class="container"><div class="row"><div class="col-lg-8 col-md-10 mx-auto"><p class="copyright">Copyright &copy; 2020 Patrick Demian. This page's source code is available at <a rel="noopener noreferrer" href="https://github.com/pdemian/">github.com/pdemian/</a></p></div></div></div></footer></div><script defer="defer" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script><script defer="defer" src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/js/bootstrap.bundle.min.js"></script><script defer="defer" src="/script.min.js"></script></body></html>

1
build/404.html Normal file
View File

@ -0,0 +1 @@
<!DOCTYPE html><html lang="en" dir="ltr"><head><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name="description" content="Not Found"><meta name="keywords" content="Human2Regex, Human, Regex, Natural, Language, Natural Language"><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Error 404 - Not Found</title><link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet" type="text/css"><link href="/style.css" rel="stylesheet" type="text/css"><meta name="theme-color" content="#212529"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="default"><link rel="icon" type="image/x-icon" href="/favicon.ico"></head><body><a class="skip skip-top" href="#maincontent">Skip to main content</a><div class="wrapper"><nav class="navbar navbar-expand-lg navbar-light fixed-top" id="mainNav"><div class="container"><a class="navbar-brand" href="/"><img src="/favicon.png" width="30" height="30" class="d-inline-block align-top" alt="logo">&nbsp;Human2Regex</a></div></nav><header class="masthead"><div class="overlay"></div><div class="container"><div class="row"><div class="col-lg-12 col-md-12 mx-auto"><div class="site-heading"><h1>404</h1><span class="subheading">Not Found</span></div></div></div></div></header><div class="container" id="maincontent" role="main"><br><br><br><div class="row"><div class="col-12 mx-auto"><h3 class="align_header">The resource could not be found.</h3></div></div></div><footer><div class="container"><div class="row"><div class="col-lg-8 col-md-10 mx-auto"><p class="copyright">Copyright &copy; 2020 Patrick Demian. This page's source code is available at <a rel="noopener noreferrer" href="https://github.com/pdemian/">github.com/pdemian/</a></p></div></div></div></footer></div><script defer="defer" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script><script defer="defer" src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/js/bootstrap.bundle.min.js"></script><script defer="defer" src="/script.min.js"></script></body></html>

1
build/501.html Normal file
View File

@ -0,0 +1 @@
<!DOCTYPE html><html lang="en" dir="ltr"><head><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name="description" content="Not Implemented"><meta name="keywords" content="Human2Regex, Human, Regex, Natural, Language, Natural Language"><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Error 501 - Not Implemented</title><link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet" type="text/css"><link href="/style.css" rel="stylesheet" type="text/css"><meta name="theme-color" content="#212529"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="default"><link rel="icon" type="image/x-icon" href="/favicon.ico"></head><body><a class="skip skip-top" href="#maincontent">Skip to main content</a><div class="wrapper"><nav class="navbar navbar-expand-lg navbar-light fixed-top" id="mainNav"><div class="container"><a class="navbar-brand" href="/"><img src="/favicon.png" width="30" height="30" class="d-inline-block align-top" alt="logo">&nbsp;Human2Regex</a></div></nav><header class="masthead"><div class="overlay"></div><div class="container"><div class="row"><div class="col-lg-12 col-md-12 mx-auto"><div class="site-heading"><h1>501</h1><span class="subheading">Not Implemented</span></div></div></div></div></header><div class="container" id="maincontent" role="main"><br><br><br><div class="row"><div class="col-12 mx-auto"><h3 class="align_header">Unrecognized request method.</h3></div></div></div><footer><div class="container"><div class="row"><div class="col-lg-8 col-md-10 mx-auto"><p class="copyright">Copyright &copy; 2020 Patrick Demian. This page's source code is available at <a rel="noopener noreferrer" href="https://github.com/pdemian/">github.com/pdemian/</a></p></div></div></div></footer></div><script defer="defer" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script><script defer="defer" src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/js/bootstrap.bundle.min.js"></script><script defer="defer" src="/script.min.js"></script></body></html>

BIN
build/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
build/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

1
build/index.html Normal file
View File

@ -0,0 +1 @@
<!DOCTYPE html><html lang="en" dir="ltr"><head><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name="description" content="Create regular expressions with natural, human language"><meta name="keywords" content="Human2Regex, Human, Regex, Natural, Language, Natural Language"><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Human2Regex</title><link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet" type="text/css"><link href="/style.css" rel="stylesheet" type="text/css"><meta name="theme-color" content="#212529"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="default"><link rel="icon" type="image/x-icon" href="/favicon.ico"></head><body><a class="skip skip-top" href="#maincontent">Skip to main content</a><div class="wrapper"><nav class="navbar navbar-expand-lg navbar-light fixed-top" id="mainNav"><div class="container"><a class="navbar-brand" href="/"><img src="/favicon.png" width="30" height="30" class="d-inline-block align-top" alt="logo">&nbsp;Human2Regex</a></div></nav><div class="container" id="maincontent" role="main"><br><br><br><div class="row"><div class="col-12 mx-auto"><h3 class="align_header">Stuff here</h3></div></div></div><footer><div class="container"><div class="row"><div class="col-lg-8 col-md-10 mx-auto"><p class="copyright">Copyright &copy; 2020 Patrick Demian. This page's source code is available at <a rel="noopener noreferrer" href="https://github.com/pdemian/">github.com/pdemian/</a></p></div></div></div></footer></div><script defer="defer" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script><script defer="defer" src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/js/bootstrap.bundle.min.js"></script><script defer="defer" src="/script.min.js"></script></body></html>

2
build/script.min.js vendored Normal file
View File

@ -0,0 +1,2 @@
/*! Copyright (c) 2020 Patrick Demian; Licensed under MIT */
"use strict";$(function(){});

5
build/style.min.css vendored Normal file
View File

@ -0,0 +1,5 @@
/*!
* Start Bootstrap - Clean Blog v5.0.8 (https://startbootstrap.com/template-overviews/clean-blog)
* Copyright 2013-2019 Start Bootstrap
* Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap-clean-blog/blob/master/LICENSE)
*/body{font-size:20px;color:#212529}p{line-height:1.5}p a{text-decoration:underline}@media (max-width:575px){.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}}h1,h2,h3,h4,h5,h6{font-weight:800;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif}::-moz-selection{color:#fff;background:#0085a1;text-shadow:none}::selection{color:#fff;background:#0085a1;text-shadow:none}#mainNav{position:absolute;border-bottom:1px solid #e9ecef;background-color:#fff;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif}#mainNav .navbar-brand{font-weight:800;color:#343a40}#mainNav .navbar-toggler{font-size:16px;font-weight:800;padding:13px;text-transform:uppercase;color:#343a40}#mainNav .navbar-nav>li.nav-item>a{font-size:12px;font-weight:800;letter-spacing:1px;text-transform:uppercase}@media only screen and (max-width:991px){#mainNav{position:fixed}}@media only screen and (min-width:992px){#mainNav{border-bottom:1px solid transparent;background:0 0}#mainNav .navbar-brand{padding:10px 20px;color:#fff}#mainNav .navbar-brand:focus,#mainNav .navbar-brand:hover{color:rgba(255,255,255,.8)}#mainNav .navbar-nav>li.nav-item>a{padding:10px 20px;color:#fff}#mainNav .navbar-nav>li.nav-item>a:focus,#mainNav .navbar-nav>li.nav-item>a:hover{color:rgba(255,255,255,.8)}}header.masthead{background:no-repeat center center;background-color:#868e96;background-attachment:scroll;position:relative;background-size:cover}header.masthead .overlay{position:absolute;top:0;left:0;height:100%;width:100%;background-color:#212529;opacity:.5}header.masthead .site-heading{padding:60px 0 20px;color:#fff}@media only screen and (min-width:768px){header.masthead .site-heading{padding:60px 0 20px}}header.masthead .site-heading{text-align:center}header.masthead .site-heading h1{font-size:50px;margin-top:0}header.masthead .site-heading .subheading{font-size:24px;font-weight:300;line-height:1.1;display:block;margin:10px 0 0;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif}@media only screen and (min-width:768px){header.masthead .site-heading h1{font-size:60px}}.wrapper{display:flex;flex-direction:column;height:100vh}#maincontent{flex:1 0 auto}header{flex-shrink:0}footer{flex-shrink:0;width:100%;right:0;left:0;padding:20px 0 20px;background-color:#54595e;color:#fff}.copyright{font-size:14px;margin-bottom:0;text-align:center}.btn{font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif}.btn-primary{background-color:#00748c;border-color:#00748c}.btn-primary:active,.btn-primary:focus,.btn-primary:hover{color:#fff;background-color:#004b5c!important;border-color:#004b5c!important}.btn-lg{font-size:16px;padding:25px 35px}/*! Copyright (c) 2020 Patrick Demian; Licensed under MIT */.align_header{text-align:center;margin-bottom:20px}.skip-top{top:10px;margin:10px 40%!important}.skip{background:#335075!important;color:#fff!important;position:absolute!important;clip:rect(1px,1px,1px,1px);float:left;margin-left:20%}.skip:active,.skip:focus{font-weight:700;box-shadow:0 0 2px 2px rgba(0,0,0,.6);clip:auto!important;display:block;text-decoration:underline;padding:5px;text-align:center;top:auto;min-width:20%;text-align:center;z-index:10000}.mid-margin{margin-left:20px;margin-right:20px}a{color:#00497a}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.54)}

View File

@ -3,8 +3,8 @@
export const config = {
prod: true,
deploy: false,
dst: "../build/",
src: "../src/",
dst: "./build/",
src: "./src/",
compression_config: {
html: {
collapseWhitespace: true,

104
package-lock.json generated
View File

@ -22,6 +22,16 @@
"@types/node": "*"
}
},
"@types/glob": {
"version": "7.1.3",
"resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz",
"integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==",
"dev": true,
"requires": {
"@types/minimatch": "*",
"@types/node": "*"
}
},
"@types/html-minifier": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/@types/html-minifier/-/html-minifier-3.5.3.tgz",
@ -41,6 +51,12 @@
"@types/sizzle": "*"
}
},
"@types/minimatch": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
"integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
"dev": true
},
"@types/mustache": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/@types/mustache/-/mustache-4.0.1.tgz",
@ -79,6 +95,22 @@
"integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
"dev": true
},
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
"dev": true
},
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
"camel-case": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
@ -104,6 +136,12 @@
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true
},
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true
},
"fs-extra": {
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz",
@ -116,6 +154,26 @@
"universalify": "^1.0.0"
}
},
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true
},
"glob": {
"version": "7.1.6",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
"integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
"dev": true,
"requires": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.0.4",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
}
},
"graceful-fs": {
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
@ -143,6 +201,22 @@
"uglify-js": "^3.5.1"
}
},
"inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"dev": true,
"requires": {
"once": "^1.3.0",
"wrappy": "1"
}
},
"inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true
},
"jsonfile": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz",
@ -159,6 +233,15 @@
"integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=",
"dev": true
},
"minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"dev": true,
"requires": {
"brace-expansion": "^1.1.7"
}
},
"mustache": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/mustache/-/mustache-4.0.1.tgz",
@ -174,6 +257,15 @@
"lower-case": "^1.1.1"
}
},
"once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": true,
"requires": {
"wrappy": "1"
}
},
"param-case": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
@ -183,6 +275,12 @@
"no-case": "^2.2.0"
}
},
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
"dev": true
},
"relateurl": {
"version": "0.2.7",
"resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
@ -212,6 +310,12 @@
"resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
"integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=",
"dev": true
},
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
}
}
}

View File

@ -6,15 +6,17 @@
"devDependencies": {
"@types/clean-css": "^4.2.1",
"@types/fs-extra": "^9.0.1",
"@types/glob": "^7.1.3",
"@types/html-minifier": "^3.5.3",
"@types/mustache": "^4.0.1",
"@types/uglify-js": "^3.9.2",
"fs-extra": "^9.0.0",
"glob": "^7.1.6",
"html-minifier": "^4.0.0",
"mustache": "^4.0.1"
},
"scripts": {
"build": "tsc && node build.js",
"build": "tsc && node build.js && rm build.js && rm config.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [

View File

@ -1,102 +0,0 @@
/*! Copyright (c) 2020 Patrick Demian; Licensed under MIT */
import { render } from 'mustache';
import { readFileSync, copyFileSync, writeFileSync } from 'fs';
import { emptyDirSync } from 'fs-extra';
import { minify } from 'html-minifier';
import { minify as uglify } from 'uglify-js';
import clean_css from 'clean-css';
import { config } from './config';
function join(...args: string[]): string {
if(arguments.length == 0) return "";
let result = args[0];
for(let i = 1; i < args.length; i++) {
const has_end_slash = result.endsWith('/');
const has_start_slash = args[i].startsWith('/');
if(has_end_slash && has_start_slash) {
result += args[i].slice(1);
}
else if(has_end_slash || has_start_slash) {
result += args[i];
}
else {
result += '/' + args[i];
}
}
return result;
}
function read_file(filename: string): string {
return readFileSync(filename, 'utf8');
}
function read_json_file(filename: string): any {
return JSON.parse(read_file(filename));
}
function compress_html(input: string): string {
return config.prod ? minify(input, config.compression_config.html) : input;
}
function compress_js(input: string): string {
return config.prod ? uglify(input, config.compression_config.js).code : input;
}
function compress_css(input: string): string {
return config.prod ? (new clean_css(config.compression_config.css)).minify(input).styles : input;
}
function clean() {
emptyDirSync(config.dst);
}
function build() {
clean();
// copy inconsequential files
const copy_files = [ '/robots.txt', '/favicon.png', '/favicon.ico' ];
for(const item of copy_files) {
const from = join(config.src, item);
const to = join(config.dst, item);
copyFileSync(from, to);
}
// compress & copy files
writeFileSync(join(config.dst, '/script.min.js'), compress_js(read_file(join(config.src, '/script.js'))));
writeFileSync(join(config.dst, '/style.min.css'), compress_css(read_file(join(config.src, '/style.css'))));
// get partials
let partials = {
header: read_file(join(config.src, '/header.mustache')),
footer: read_file(join(config.src, '/footer.mustache'))
};
// build mustache files
writeFileSync(
join(config.dst, 'index.html'),
compress_html(
render(
join(config.src, '/index.mustache'),
read_json_file(join(config.src, '/main/index.json')))));
const error_files = [ '400', '401', '404', '501' ];
for(const item of error_files) {
writeFileSync(
join(config.dst, item + '.html'),
compress_html(
render(
join(config.src, '/error.mustache'),
read_json_file(join(config.src, '/error/' + item + '.json')))));
}
}
build();

View File

@ -1,6 +1,6 @@
{
"page": {
"title": "Human2Regex",
"description": "Create regular expressions with natural, human language",
"description": "Create regular expressions with natural, human language"
}
}

View File

@ -1,2 +0,0 @@
User-Agent: *
Disallow: /error/

23
src/script.js Normal file
View File

@ -0,0 +1,23 @@
/*! Copyright (c) 2020 Patrick Demian; Licensed under MIT */
"use strict";
/*
String.prototype.escape = function() {
var tagsToReplace = {
'&': '&amp;',
'<': '&lt;',
'>': '&gt;'
};
return this.replace(/[&<>]/g, function(tag) {
return tagsToReplace[tag] || tag;
});
};
String.prototype.norm = function() {
if(String.prototype.normalize != undefined) {
return this.normalize("NFD").replace(/[\u0300-\u036F]/g,"");
}
return this;
};
*/
$(function () {
});