manifest generator working, now on to the app

This commit is contained in:
Jeffrey Paul 2020-03-06 15:22:25 -08:00
parent e62f93d5e6
commit 959fb89553
5 changed files with 151 additions and 124 deletions

View File

@ -1,104 +1,134 @@
#!/usr/bin/env node #!/usr/bin/env node
'use strict'; "use strict";
const figlet = require('figlet'); const figlet = require("figlet");
const chalk = require('chalk'); const chalk = require("chalk");
const fs = require('fs'); const fs = require("fs");
const find = require("find");
const pkg = require("../package.json");
const warnSymbol = "⚠️";
const headExplode = "🤯";
const rightArrow = "➡️";
function recFindByExt(base, ext, files, result) { function recFindByExt(base, ext, files, result) {
files = files || fs.readdirSync(base) files = files || fs.readdirSync(base);
result = result || [] result = result || [];
files.forEach( files.forEach(function(file) {
function (file) { var newbase = path.join(base, file);
var newbase = path.join(base,file) if (fs.statSync(newbase).isDirectory()) {
if ( fs.statSync(newbase).isDirectory() ) { result = recFindByExt(
result = recFindByExt(newbase,ext,fs.readdirSync(newbase),result) newbase,
} else { ext,
if ( file.substr(-1*(ext.length+1)) == '.' + ext ) { fs.readdirSync(newbase),
result.push(newbase) result
} );
} else {
if (file.substr(-1 * (ext.length + 1)) == "." + ext) {
result.push(newbase);
} }
} }
) });
return result return result;
} }
function pprint(obj) { function pprint(obj) {
console.log("%o", obj) console.log("%o", obj);
} }
function outputManifest (path, fileList) { function outputManifest(path, fileList) {
if(!fileList) { if (!fileList) {
l = [] l = [];
} }
const output = { const output = {
version: 1, $id: "berlin.sneak.ns.webstatus.manifest-v1",
'$id': 'berlin.sneak.ns.webstatus.manifest-v1',
manifest: fileList manifest: fileList
} };
fs.writeFileSync(path + ".tmp", JSON.stringify(output)) fs.writeFileSync(path + ".tmp", JSON.stringify(output));
fs.renameSync(path + ".tmp", path) fs.renameSync(path + ".tmp", path);
} }
function main() { function main() {
const commander = require('commander'); const commander = require("commander");
const program = new commander.Command(); const program = new commander.Command();
program.version('0.0.1', '-v --version', 'output current version'); program.version(pkg.version, "-v --version", "output current version");
program program
.option('-s --source <directory>', 'directory to scan/write', '.') .option("-s --source <directory>", "directory to scan/write", ".")
.option('-v --verbose', 'verbose output', false) .option("-v --verbose", "verbose output", false)
.option('-q --quiet', 'no output', false) .option("-q --quiet", "no output", false);
program.parse(process.argv); program.parse(process.argv);
const print = (x) => { const print = x => {
if(program.quiet) { if (program.quiet) {
return return;
} }
console.log(x) console.log(x);
} };
const log = {} const log = {};
log.info = (x) => { log.info = x => {
print(chalk.blue(x)) print(rightArrow + chalk.blue(" " + x));
} };
log.die = (x) => { log.die = x => {
print(chalk.bold.red('error: ' + x)) print(warnSymbol + chalk.bold.red(" " + x));
print(chalk.bold.red('exiting.')) print(headExplode);
process.exit(-1) process.exit(-1);
} };
log.huge = (x) => { log.huge = x => {
var f = figlet.textSync(x, { var f = figlet.textSync(x, {
font: 'Red Phoenix', font: "Red Phoenix",
horizontalLayout: 'default', horizontalLayout: "default",
verticalLayout: 'default' verticalLayout: "default"
}) });
print(chalk.red(f)) print(chalk.red(f));
} };
log.huge('webstatus') log.huge("webstatus");
//const dir = program.source //const dir = program.source
//pprint(program) //pprint(program)
if(!fs.lstatSync(program.source).isDirectory()) { if (!fs.lstatSync(program.source).isDirectory()) {
log.die(`${program.source} is not a directory`) log.die(`${program.source} is not a directory`);
} else { } else {
log.info(`scanning ${program.source} for images...`) process.chdir(program.source);
program.source = process.cwd();
log.info(`scanning ${program.source} for images...`);
} }
var fileList = [] var fileList = [];
var manifestFilename = program.source + '/webstatus.manifest.json' var manifestFilename = program.source + "/webstatus.manifest.json";
//FIXME scan for files const matchRE = /\.(png|gif|jpg|jpeg|webp)$/i;
//
log.info(`writing ${fileList.length} entries to manifest ${manifestFilename}`)
outputManifest(manifestFilename, fileList)
log.die("unimplemented") var candidateList = find.fileSync(matchRE, program.source);
candidateList.forEach(fn => {
var stat = fs.statSync(fn);
var prefix = new RegExp("^" + program.source + "/");
fn = fn.replace(prefix, "");
fileList.push({
// FIXME read image size from files so that
// renderer can scale them more intelligently
$id: "berlin.sneak.ns.webstatus.fileitem-v1",
path: fn,
mtime: stat.mtime
});
});
log.info(
`writing ${fileList.length} entries to manifest ${manifestFilename}`
);
try {
outputManifest(manifestFilename, fileList);
} catch (err) {
program.quiet = false;
log.die(`unable to write manifest: ${err}`);
}
log.info("success");
} }
main(); main();

View File

@ -1,49 +1,49 @@
{ {
"name": "@sneak.berlin/webstatus", "name": "@sneak.berlin/webstatus",
"version": "1.0.0", "version": "1.0.0",
"description": "webstatus app for displaying a directory of images", "description": "webstatus app for displaying a directory of images",
"main": "index.js", "main": "index.js",
"bin": { "bin": {
"webstatus-manifest-generator": "./bin/webstatus-manifest-generator.js" "webstatus-manifest-generator": "./bin/webstatus-manifest-generator.js"
}, },
"dependencies": { "dependencies": {
"@testing-library/jest-dom": "^4.2.4", "@testing-library/jest-dom": "^4.2.4",
"@testing-library/react": "^9.3.2", "@testing-library/react": "^9.3.2",
"@testing-library/user-event": "^7.1.2", "@testing-library/user-event": "^7.1.2",
"chalk": "^3.0.0", "chalk": "^3.0.0",
"figlet": "^1.3.0", "figlet": "^1.3.0",
"find": "^0.3.0", "find": "^0.3.0",
"prettier": "^1.19.1", "prettier": "^1.19.1",
"react": "^16.13.0", "react": "^16.13.0",
"react-dom": "^16.13.0", "react-dom": "^16.13.0",
"react-scripts": "3.4.0" "react-scripts": "3.4.0"
}, },
"scripts": { "scripts": {
"start": "react-scripts start", "start": "react-scripts start",
"build": "react-scripts build", "build": "react-scripts build",
"test": "react-scripts test", "test": "react-scripts test",
"eject": "react-scripts eject", "eject": "react-scripts eject",
"fmt": "prettier -- --write bin/**/*.js src/**/*.js package.json" "fmt": "prettier --write --tab-width 4 -- bin/**/*.js src/**/*.js package.json"
}, },
"eslintConfig": { "eslintConfig": {
"extends": "react-app" "extends": "react-app"
}, },
"browserslist": { "browserslist": {
"production": [ "production": [
">0.2%", ">0.2%",
"not dead", "not dead",
"not op_mini all" "not op_mini all"
], ],
"development": [ "development": [
"last 1 chrome version", "last 1 chrome version",
"last 1 firefox version", "last 1 firefox version",
"last 1 safari version" "last 1 safari version"
] ]
}, },
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://git.eeqj.de/sneak/webstatus.git" "url": "https://git.eeqj.de/sneak/webstatus.git"
}, },
"author": "sneak <sneak@sneak.berlin>", "author": "sneak <sneak@sneak.berlin>",
"license": "WTFPL" "license": "WTFPL"
} }

View File

@ -1,25 +1,22 @@
import React from 'react'; import React from "react";
//import logo from './logo.svg'; //import logo from './logo.svg';
import './WebStatus.css'; import "./WebStatus.css";
class WebStatusImage extends React.Component { class WebStatusImage extends React.Component {
render() { render() {
return ( return <img className="webstatusimage" src={this.props.url} />;
<img className="webstatusimage" src={this.props.url} />
)
} }
} }
class WebStatus extends React.Component { class WebStatus extends React.Component {
render() { render() {
const currentImageUrl = "http://placekitten.com/3840/2160";
const currentImageUrl = "http://placekitten.com/3840/2160"
return ( return (
<div className="webstatus"> <div className="webstatus">
<WebStatusImage url={currentImageUrl} /> <WebStatusImage url={currentImageUrl} />
</div> </div>
) );
} }
} }

View File

@ -1,6 +1,6 @@
import React from 'react'; import React from "react";
import ReactDOM from 'react-dom'; import ReactDOM from "react-dom";
import './index.css'; import "./index.css";
import WebStatus from './WebStatus'; import WebStatus from "./WebStatus";
ReactDOM.render(<WebStatus />, document.getElementById('root')); ReactDOM.render(<WebStatus />, document.getElementById("root"));

View File

@ -2,4 +2,4 @@
// allows you to do things like: // allows you to do things like:
// expect(element).toHaveTextContent(/react/i) // expect(element).toHaveTextContent(/react/i)
// learn more: https://github.com/testing-library/jest-dom // learn more: https://github.com/testing-library/jest-dom
import '@testing-library/jest-dom/extend-expect'; import "@testing-library/jest-dom/extend-expect";