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
'use strict';
"use strict";
const figlet = require('figlet');
const chalk = require('chalk');
const fs = require('fs');
const figlet = require("figlet");
const chalk = require("chalk");
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) {
files = files || fs.readdirSync(base)
result = result || []
files = files || fs.readdirSync(base);
result = result || [];
files.forEach(
function (file) {
var newbase = path.join(base,file)
if ( fs.statSync(newbase).isDirectory() ) {
result = recFindByExt(newbase,ext,fs.readdirSync(newbase),result)
} else {
if ( file.substr(-1*(ext.length+1)) == '.' + ext ) {
result.push(newbase)
}
files.forEach(function(file) {
var newbase = path.join(base, file);
if (fs.statSync(newbase).isDirectory()) {
result = recFindByExt(
newbase,
ext,
fs.readdirSync(newbase),
result
);
} else {
if (file.substr(-1 * (ext.length + 1)) == "." + ext) {
result.push(newbase);
}
}
)
return result
});
return result;
}
function pprint(obj) {
console.log("%o", obj)
console.log("%o", obj);
}
function outputManifest (path, fileList) {
if(!fileList) {
l = []
function outputManifest(path, fileList) {
if (!fileList) {
l = [];
}
const output = {
version: 1,
'$id': 'berlin.sneak.ns.webstatus.manifest-v1',
$id: "berlin.sneak.ns.webstatus.manifest-v1",
manifest: fileList
}
fs.writeFileSync(path + ".tmp", JSON.stringify(output))
fs.renameSync(path + ".tmp", path)
};
fs.writeFileSync(path + ".tmp", JSON.stringify(output));
fs.renameSync(path + ".tmp", path);
}
function main() {
const commander = require('commander');
const commander = require("commander");
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
.option('-s --source <directory>', 'directory to scan/write', '.')
.option('-v --verbose', 'verbose output', false)
.option('-q --quiet', 'no output', false)
.option("-s --source <directory>", "directory to scan/write", ".")
.option("-v --verbose", "verbose output", false)
.option("-q --quiet", "no output", false);
program.parse(process.argv);
const print = (x) => {
if(program.quiet) {
return
const print = x => {
if (program.quiet) {
return;
}
console.log(x)
}
console.log(x);
};
const log = {}
const log = {};
log.info = (x) => {
print(chalk.blue(x))
}
log.info = x => {
print(rightArrow + chalk.blue(" " + x));
};
log.die = (x) => {
print(chalk.bold.red('error: ' + x))
print(chalk.bold.red('exiting.'))
process.exit(-1)
}
log.die = x => {
print(warnSymbol + chalk.bold.red(" " + x));
print(headExplode);
process.exit(-1);
};
log.huge = (x) => {
log.huge = x => {
var f = figlet.textSync(x, {
font: 'Red Phoenix',
horizontalLayout: 'default',
verticalLayout: 'default'
})
print(chalk.red(f))
}
font: "Red Phoenix",
horizontalLayout: "default",
verticalLayout: "default"
});
print(chalk.red(f));
};
log.huge('webstatus')
log.huge("webstatus");
//const dir = program.source
//pprint(program)
if(!fs.lstatSync(program.source).isDirectory()) {
log.die(`${program.source} is not a directory`)
if (!fs.lstatSync(program.source).isDirectory()) {
log.die(`${program.source} is not a directory`);
} 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 manifestFilename = program.source + '/webstatus.manifest.json'
var fileList = [];
var manifestFilename = program.source + "/webstatus.manifest.json";
//FIXME scan for files
//
log.info(`writing ${fileList.length} entries to manifest ${manifestFilename}`)
outputManifest(manifestFilename, fileList)
const matchRE = /\.(png|gif|jpg|jpeg|webp)$/i;
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();

View File

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

View File

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

View File

@ -1,6 +1,6 @@
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import WebStatus from './WebStatus';
import React from "react";
import ReactDOM from "react-dom";
import "./index.css";
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:
// expect(element).toHaveTextContent(/react/i)
// learn more: https://github.com/testing-library/jest-dom
import '@testing-library/jest-dom/extend-expect';
import "@testing-library/jest-dom/extend-expect";