You've already forked joplin
mirror of
https://github.com/laurent22/joplin.git
synced 2025-11-06 09:19:22 +02:00
Cleaned up build tools
This commit is contained in:
@@ -1,168 +0,0 @@
|
||||
"use strict"
|
||||
|
||||
require('app-module-path').addPath(__dirname);
|
||||
|
||||
const processArgs = process.argv.splice(2, process.argv.length);
|
||||
|
||||
const silentLog = processArgs.indexOf('--silent') >= 0;
|
||||
|
||||
const { basename, dirname, filename, fileExtension } = require('lib/path-utils.js');
|
||||
const fs = require('fs-extra');
|
||||
const gettextParser = require('gettext-parser');
|
||||
|
||||
const rootDir = dirname(dirname(__dirname));
|
||||
const cliDir = rootDir + '/CliClient';
|
||||
const cliLocalesDir = cliDir + '/locales';
|
||||
const rnDir = rootDir + '/ReactNativeClient';
|
||||
const electronDir = rootDir + '/ElectronClient/app';
|
||||
|
||||
function execCommand(command) {
|
||||
if (!silentLog) console.info('Running: ' + command);
|
||||
|
||||
const exec = require('child_process').exec
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
let childProcess = exec(command, (error, stdout, stderr) => {
|
||||
if (error) {
|
||||
if (error.signal == 'SIGTERM') {
|
||||
resolve('Process was killed');
|
||||
} else {
|
||||
reject(error);
|
||||
}
|
||||
} else {
|
||||
resolve(stdout.trim());
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function parsePoFile(filePath) {
|
||||
const content = fs.readFileSync(filePath);
|
||||
return gettextParser.po.parse(content);
|
||||
}
|
||||
|
||||
function serializeTranslation(translation) {
|
||||
let output = {};
|
||||
const translations = translation.translations[''];
|
||||
for (let n in translations) {
|
||||
if (!translations.hasOwnProperty(n)) continue;
|
||||
if (n == '') continue;
|
||||
const t = translations[n];
|
||||
if (t.comments && t.comments.flag && t.comments.flag.indexOf('fuzzy') >= 0) {
|
||||
output[n] = t['msgid'];
|
||||
} else {
|
||||
output[n] = t['msgstr'][0];
|
||||
}
|
||||
}
|
||||
return JSON.stringify(output);
|
||||
}
|
||||
|
||||
function saveToFile(filePath, data) {
|
||||
fs.writeFileSync(filePath, data);
|
||||
}
|
||||
|
||||
function buildLocale(inputFile, outputFile) {
|
||||
const r = parsePoFile(inputFile);
|
||||
const translation = serializeTranslation(r);
|
||||
saveToFile(outputFile, translation);
|
||||
}
|
||||
|
||||
async function removePoHeaderDate(filePath) {
|
||||
// Note: on macOS this will fail because it needs to be 'sed -i ""'
|
||||
// Solution would be to install gsed, detect it here, and use it in place of sed in macOS
|
||||
// https://stackoverflow.com/questions/30003570/how-to-use-gnu-sed-on-mac-os-x#34815955
|
||||
await execCommand('sed -i -e\'/POT-Creation-Date:/d\' "' + filePath + '"');
|
||||
await execCommand('sed -i -e\'/PO-Revision-Date:/d\' "' + filePath + '"');
|
||||
}
|
||||
|
||||
async function createPotFile(potFilePath, sources) {
|
||||
let baseArgs = [];
|
||||
baseArgs.push('--from-code=utf-8');
|
||||
baseArgs.push('--output="' + potFilePath + '"');
|
||||
baseArgs.push('--language=JavaScript');
|
||||
baseArgs.push('--copyright-holder="Laurent Cozic"');
|
||||
baseArgs.push('--package-name=Joplin-CLI');
|
||||
baseArgs.push('--package-version=1.0.0');
|
||||
baseArgs.push('--no-location');
|
||||
|
||||
for (let i = 0; i < sources.length; i++) {
|
||||
let args = baseArgs.slice();
|
||||
if (i > 0) args.push('--join-existing');
|
||||
args.push(sources[i]);
|
||||
const result = await execCommand('xgettext ' + args.join(' '));
|
||||
if (result) console.error(result);
|
||||
await removePoHeaderDate(potFilePath);
|
||||
}
|
||||
}
|
||||
|
||||
async function mergePotToPo(potFilePath, poFilePath) {
|
||||
const command = 'msgmerge -U "' + poFilePath + '" "' + potFilePath + '"';
|
||||
const result = await execCommand(command);
|
||||
if (result) console.error(result);
|
||||
await removePoHeaderDate(poFilePath);
|
||||
}
|
||||
|
||||
function buildIndex(locales) {
|
||||
let output = [];
|
||||
output.push('var locales = {};');
|
||||
for (let i = 0; i < locales.length; i++) {
|
||||
const locale = locales[i];
|
||||
output.push("locales['" + locale + "'] = require('./" + locale + ".json');");
|
||||
}
|
||||
output.push('module.exports = { locales: locales };');
|
||||
return output.join("\n");
|
||||
}
|
||||
|
||||
function availableLocales(defaultLocale) {
|
||||
const output = [defaultLocale];
|
||||
fs.readdirSync(cliLocalesDir).forEach((path) => {
|
||||
if (fileExtension(path) !== 'po') return;
|
||||
const locale = filename(path);
|
||||
if (locale === defaultLocale) return;
|
||||
output.push(locale);
|
||||
});
|
||||
return output;
|
||||
}
|
||||
|
||||
async function main() {
|
||||
let potFilePath = cliLocalesDir + '/joplin.pot';
|
||||
let jsonLocalesDir = cliDir + '/build/locales';
|
||||
const defaultLocale = 'en_GB';
|
||||
|
||||
await createPotFile(potFilePath, [
|
||||
cliDir + '/app/*.js',
|
||||
cliDir + '/app/gui/*.js',
|
||||
electronDir + '/*.js',
|
||||
electronDir + '/gui/*.js',
|
||||
rnDir + '/lib/*.js',
|
||||
rnDir + '/lib/models/*.js',
|
||||
rnDir + '/lib/services/*.js',
|
||||
rnDir + '/lib/components/*.js',
|
||||
rnDir + '/lib/components/screens/*.js',
|
||||
]);
|
||||
|
||||
await execCommand('cp "' + potFilePath + '" ' + '"' + cliLocalesDir + '/' + defaultLocale + '.po"');
|
||||
|
||||
fs.mkdirpSync(jsonLocalesDir, 0o755);
|
||||
|
||||
let locales = availableLocales(defaultLocale);
|
||||
for (let i = 0; i < locales.length; i++) {
|
||||
const locale = locales[i];
|
||||
const poFilePäth = cliLocalesDir + '/' + locale + '.po';
|
||||
const jsonFilePath = jsonLocalesDir + '/' + locale + '.json';
|
||||
if (locale != defaultLocale) await mergePotToPo(potFilePath, poFilePäth);
|
||||
buildLocale(poFilePäth, jsonFilePath);
|
||||
}
|
||||
|
||||
saveToFile(jsonLocalesDir + '/index.js', buildIndex(locales));
|
||||
|
||||
const rnJsonLocaleDir = rnDir + '/locales';
|
||||
await execCommand('rsync -a "' + jsonLocalesDir + '/" "' + rnJsonLocaleDir + '"');
|
||||
|
||||
const electronJsonLocaleDir = electronDir + '/locales';
|
||||
await execCommand('rsync -a "' + jsonLocalesDir + '/" "' + electronJsonLocaleDir + '"');
|
||||
}
|
||||
|
||||
main().catch((error) => {
|
||||
console.error(error);
|
||||
});
|
||||
@@ -1,320 +0,0 @@
|
||||
const fs = require('fs-extra');
|
||||
const { fileExtension, basename, dirname } = require('lib/path-utils.js');
|
||||
const { _, setLocale, languageCode } = require('lib/locale.js');
|
||||
const marked = require('marked');
|
||||
const Mustache = require('mustache');
|
||||
|
||||
const headerHtml = `<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Joplin - an open source note taking and to-do application with synchronisation capabilities</title>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
|
||||
<link rel="shortcut icon" type="image/x-icon" href="favicon.ico">
|
||||
<link rel="stylesheet" href="https://opensource.keycdn.com/fontawesome/4.7.0/font-awesome.min.css" integrity="sha384-dNpIIXE8U05kAbPhy3G1cz+yZmTzA6CY8Vg/u2L9xRnHjJiAK76m2BIEaSEV+/aU" crossorigin="anonymous">
|
||||
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha256-k2WSCIexGzOj3Euiig+TlR8gA0EmPjuc79OEeY5L45g=" crossorigin="anonymous"></script>
|
||||
<style>
|
||||
body {
|
||||
background-color: #F1F1F1;
|
||||
color: #333333;
|
||||
}
|
||||
table {
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
td, th {
|
||||
padding: .8em;
|
||||
border: 1px solid #ccc;
|
||||
}
|
||||
h1, h2 {
|
||||
border-bottom: 1px solid #eaecef;
|
||||
padding-bottom: 0.3em;
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
||||
font-weight: 600;
|
||||
font-size: 2em;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
h2 {
|
||||
font-size: 1.6em;
|
||||
}
|
||||
h3 {
|
||||
font-size: 1.3em;
|
||||
}
|
||||
code {
|
||||
color: black;
|
||||
background-color: #eee;
|
||||
border: 1px solid #ccc;
|
||||
}
|
||||
pre code {
|
||||
border: none;
|
||||
}
|
||||
.title-icon {
|
||||
height: 2em;
|
||||
}
|
||||
.sub-title {
|
||||
font-weight: bold;
|
||||
font-size: 1.5em;
|
||||
}
|
||||
.container {
|
||||
background-color: white;
|
||||
padding: 0;
|
||||
box-shadow: 0 10px 20px #888888;
|
||||
}
|
||||
table.screenshots {
|
||||
margin-top: 2em;
|
||||
margin-bottom: 2em;
|
||||
}
|
||||
table.screenshots th {
|
||||
height: 3em;
|
||||
text-align: center;
|
||||
}
|
||||
table.screenshots th,
|
||||
table.screenshots td {
|
||||
border: 1px solid #C2C2C2;
|
||||
}
|
||||
.mobile-screenshot {
|
||||
height: 40em;
|
||||
padding: 1em;
|
||||
}
|
||||
.cli-screenshot-wrapper {
|
||||
background-color: black;
|
||||
vertical-align: top;
|
||||
padding: 1em 2em 1em 1em;
|
||||
}
|
||||
.cli-screenshot {
|
||||
font-family: "Monaco", "Inconsolata", "CONSOLAS", "Deja Vu Sans Mono", "Droid Sans Mono", "Andale Mono", monospace;
|
||||
background-color: black;
|
||||
color: white;
|
||||
border: none;
|
||||
}
|
||||
.cli-screenshot .prompt {
|
||||
color: #48C2F0;
|
||||
}
|
||||
.top-screenshot {
|
||||
margin-top: 2em;
|
||||
text-align: center;
|
||||
}
|
||||
.header {
|
||||
position: relative;
|
||||
padding-left: 2em;
|
||||
padding-right: 2em;
|
||||
padding-top: 1em;
|
||||
padding-bottom: 1em;
|
||||
color: white;
|
||||
background-color: #2B2B3D;
|
||||
}
|
||||
.content {
|
||||
padding-left: 2em;
|
||||
padding-right: 2em;
|
||||
padding-bottom: 2em;
|
||||
padding-top: 2em;
|
||||
}
|
||||
.forkme {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top:0;
|
||||
}
|
||||
.nav-wrapper {
|
||||
position: relative;
|
||||
width: inherit;
|
||||
}
|
||||
.nav {
|
||||
background-color: black;
|
||||
display: table;
|
||||
width: inherit;
|
||||
}
|
||||
.nav.sticky {
|
||||
position:fixed;
|
||||
top: 0;
|
||||
width: inherit;
|
||||
box-shadow: 0 0 10px #000000;
|
||||
}
|
||||
.nav a {
|
||||
color: white;
|
||||
display: inline-block;
|
||||
padding: .6em .9em .6em .9em;
|
||||
}
|
||||
.nav ul {
|
||||
padding-left: 2em;
|
||||
margin-bottom: 0;
|
||||
display: table-cell;
|
||||
min-width: 165px;
|
||||
}
|
||||
.nav ul li {
|
||||
display: inline-block;
|
||||
padding: 0;
|
||||
}
|
||||
.nav li.selected {
|
||||
background-color: #222;
|
||||
font-weight: bold;
|
||||
}
|
||||
.nav-right {
|
||||
display: table-cell;
|
||||
width: 100%;
|
||||
text-align: right;
|
||||
vertical-align: middle;
|
||||
line-height: 0;
|
||||
}
|
||||
.nav-right .share-btn {
|
||||
display: none;
|
||||
}
|
||||
.share-btn-github {
|
||||
display: inline-block;
|
||||
}
|
||||
.nav-right .small-share-btn {
|
||||
display: none;
|
||||
}
|
||||
.nav-right .share-btn-github {
|
||||
display: inline-block;
|
||||
}
|
||||
@media all and (min-width: 400px) {
|
||||
.nav-right .share-btn {
|
||||
display: inline-block;
|
||||
}
|
||||
.nav-right .small-share-btn {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<div class="container">
|
||||
|
||||
<div class="header">
|
||||
<a class="forkme" href="https://github.com/laurent22/joplin"><img src="{{{imageBaseUrl}}}/ForkMe.png"/></a>
|
||||
<h1 id="joplin"><img class="title-icon" src="{{{imageBaseUrl}}}/Icon512.png">oplin</h1>
|
||||
<p class="sub-title">An open source note taking and to-do application with synchronisation capabilities.</p>
|
||||
</div>
|
||||
|
||||
<div class="nav-wrapper">
|
||||
<div class="nav">
|
||||
<ul>
|
||||
<li class="{{selectedHome}}"><a href="{{baseUrl}}/" title="Home"><i class="fa fa-home"></i></a></li>
|
||||
<li class="{{selectedTerminal}}"><a href="{{baseUrl}}/terminal" title="Terminal"><i class="fa fa-terminal"></i></a></li>
|
||||
<li class="{{selectedDesktop}}"><a href="{{baseUrl}}/desktop" title="Desktop"><i class="fa fa-desktop"></i></a></li>
|
||||
</ul>
|
||||
<div class="nav-right">
|
||||
<iframe class="share-btn" src="https://www.facebook.com/plugins/share_button.php?href=http%3A%2F%2Fjoplin.cozic.net&layout=button&size=small&mobile_iframe=true&width=60&height=20&appId" width="60" height="20" style="border:none;overflow:hidden" scrolling="no" frameborder="0" allowTransparency="true"></iframe>
|
||||
<iframe class="share-btn" src="https://platform.twitter.com/widgets/tweet_button.html?url=http%3A%2F%2Fjoplin.cozic.net" width="62" height="20" title="Tweet" style="border: 0; overflow: hidden;"></iframe>
|
||||
<iframe class="share-btn share-btn-github" src="https://ghbtns.com/github-btn.html?user=laurent22&repo=joplin&type=star&count=true" frameborder="0" scrolling="0" width="80px" height="20px"></iframe>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="content">
|
||||
`;
|
||||
|
||||
const footerHtml = `
|
||||
</body>
|
||||
</html>
|
||||
`;
|
||||
|
||||
// const screenshotHtml = `
|
||||
// <table class="screenshots">
|
||||
// <tr>
|
||||
// <th>
|
||||
// Mobile
|
||||
// </th>
|
||||
// <th>
|
||||
// Command line
|
||||
// </th>
|
||||
// </tr>
|
||||
// <tr>
|
||||
// <td>
|
||||
// <img class="mobile-screenshot" src="docs/images/Mobile.png"/>
|
||||
// </td>
|
||||
// <td class="cli-screenshot-wrapper">
|
||||
// <pre class="cli-screenshot">
|
||||
// <span class="prompt">joplin:/My notebook$</span> ls -n 12
|
||||
// [ ] 8am conference call ☎
|
||||
// [ ] Make vet appointment
|
||||
// [ ] Go pick up parcel
|
||||
// [ ] Pay flat rent 💸
|
||||
// [X] Book ferry 🚢
|
||||
// [X] Deploy Joplin app
|
||||
// Open source stuff
|
||||
// Swimming pool time table 🏊
|
||||
// Grocery shopping list 📝
|
||||
// Work itinerary
|
||||
// Tuesday random note
|
||||
// Vacation plans ☀
|
||||
// </pre>
|
||||
// </td>
|
||||
// </tr>
|
||||
// </table>
|
||||
// `;
|
||||
|
||||
const scriptHtml = `
|
||||
<script>
|
||||
function stickyHeader() {
|
||||
if ($(window).scrollTop() > 179) {
|
||||
$('.nav').addClass('sticky');
|
||||
} else {
|
||||
$('.nav').removeClass('sticky');
|
||||
}
|
||||
}
|
||||
|
||||
$(window).scroll(function() {
|
||||
stickyHeader();
|
||||
});
|
||||
|
||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
||||
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
|
||||
ga('create', 'UA-103586105-1', 'auto');
|
||||
ga('send', 'pageview');
|
||||
</script>
|
||||
`;
|
||||
|
||||
// <a href="#" class="small-share-btn" style="background-color: #365899;"><img src="images/ShareFacebook.svg" style=" width: 1.2em; height: 1.2em"/></a>
|
||||
// <a href="#" class="small-share-btn" style="background-color: #1b95e0;"><img src="images/ShareTwitter.svg" style=" width: 1.2em; height: 1.2em"/></a>
|
||||
// <a href="#" class="small-share-btn" style="background-color: #eee;"><img src="images/ShareGithub.svg" style=" width: 1.2em; height: 1.2em"/></a>
|
||||
|
||||
const rootDir = dirname(dirname(__dirname));
|
||||
|
||||
function markdownToHtml(md) {
|
||||
const renderer = new marked.Renderer();
|
||||
|
||||
// Remove the header because it's going to be added back as HTML
|
||||
md = md.replace(/# Joplin/, '');
|
||||
|
||||
let output = marked(md, {
|
||||
gfm: true,
|
||||
break: true,
|
||||
renderer: renderer,
|
||||
});
|
||||
|
||||
//output = output.replace(/<!-- \[SCREENSHOTS\] -->/, screenshotHtml);
|
||||
|
||||
return headerHtml + output + scriptHtml + footerHtml;
|
||||
}
|
||||
|
||||
function renderFileToHtml(sourcePath, targetPath, params) {
|
||||
const md = fs.readFileSync(sourcePath, 'utf8');
|
||||
params.baseUrl = 'http://joplin.cozic.net';
|
||||
params.imageBaseUrl = params.baseUrl + '/images';
|
||||
const html = Mustache.render(markdownToHtml(md), params);
|
||||
fs.writeFileSync(targetPath, html);
|
||||
}
|
||||
|
||||
async function main() {
|
||||
renderFileToHtml(rootDir + '/README.md', rootDir + '/docs/index.html', {
|
||||
selectedHome: 'selected',
|
||||
});
|
||||
|
||||
renderFileToHtml(rootDir + '/README_terminal.md', rootDir + '/docs/terminal/index.html', {
|
||||
selectedTerminal: 'selected',
|
||||
});
|
||||
|
||||
renderFileToHtml(rootDir + '/README_desktop.md', rootDir + '/docs/desktop/index.html', {
|
||||
selectedDesktop: 'selected',
|
||||
});
|
||||
}
|
||||
|
||||
main().catch((error) => {
|
||||
console.error(error);
|
||||
});
|
||||
Reference in New Issue
Block a user