1
0
mirror of https://github.com/laurent22/joplin.git synced 2025-09-16 08:56:40 +02:00

Removing vorpal

This commit is contained in:
Laurent Cozic
2017-08-03 17:48:14 +00:00
parent 5f36645d40
commit 60c8b7530b
19 changed files with 393 additions and 101 deletions

View File

@@ -8,12 +8,13 @@ import { Note } from 'lib/models/note.js';
import { Setting } from 'lib/models/setting.js'; import { Setting } from 'lib/models/setting.js';
import { Logger } from 'lib/logger.js'; import { Logger } from 'lib/logger.js';
import { sprintf } from 'sprintf-js'; import { sprintf } from 'sprintf-js';
import { vorpalUtils } from 'vorpal-utils.js';
import { reg } from 'lib/registry.js'; import { reg } from 'lib/registry.js';
import { fileExtension } from 'lib/path-utils.js'; import { fileExtension } from 'lib/path-utils.js';
import { _, setLocale, defaultLocale, closestSupportedLocale } from 'lib/locale.js'; import { _, setLocale, defaultLocale, closestSupportedLocale } from 'lib/locale.js';
import os from 'os'; import os from 'os';
import fs from 'fs-extra'; import fs from 'fs-extra';
import yargParser from 'yargs-parser';
import omelette from 'omelette';
class Application { class Application {
@@ -23,9 +24,9 @@ class Application {
this.dbLogger_ = new Logger(); this.dbLogger_ = new Logger();
} }
vorpal() { // vorpal() {
return this.vorpal_; // return this.vorpal_;
} // }
currentFolder() { currentFolder() {
return this.currentFolder_; return this.currentFolder_;
@@ -40,22 +41,9 @@ class Application {
this.switchCurrentFolder(newFolder); this.switchCurrentFolder(newFolder);
} }
updatePrompt() {
if (!this.showPromptString_) return '';
let path = '';
if (this.currentFolder()) {
path += '/' + this.currentFolder().title;
}
const prompt = Setting.value('appName') + ':' + path + '$ ';
this.vorpal().delimiter(prompt);
}
switchCurrentFolder(folder) { switchCurrentFolder(folder) {
this.currentFolder_ = folder; this.currentFolder_ = folder;
Setting.setValue('activeFolderId', folder ? folder.id : ''); Setting.setValue('activeFolderId', folder ? folder.id : '');
this.updatePrompt();
} }
async guessTypeAndLoadItem(pattern, options = null) { async guessTypeAndLoadItem(pattern, options = null) {
@@ -132,11 +120,11 @@ class Application {
continue; continue;
} }
if (arg == '--redraw-disabled') { // if (arg == '--redraw-disabled') {
vorpalUtils.setRedrawEnabled(false); // vorpalUtils.setRedrawEnabled(false);
argv.splice(0, 1); // argv.splice(0, 1);
continue; // continue;
} // }
if (arg == '--update-geolocation-disabled') { if (arg == '--update-geolocation-disabled') {
Note.updateGeolocationEnabled_ = false; Note.updateGeolocationEnabled_ = false;
@@ -145,7 +133,7 @@ class Application {
} }
if (arg == '--stack-trace-enabled') { if (arg == '--stack-trace-enabled') {
vorpalUtils.setStackTraceEnabled(true); //vorpalUtils.setStackTraceEnabled(true);
argv.splice(0, 1); argv.splice(0, 1);
continue; continue;
} }
@@ -157,6 +145,12 @@ class Application {
continue; continue;
} }
if (arg == '--completion' || arg == '--compbash' || arg == '--compgen') {
// Handled by omelette
argv.splice(0, 1);
continue;
}
if (arg.length && arg[0] == '-') { if (arg.length && arg[0] == '-') {
throw new Error(_('Unknown flag: %s', arg)); throw new Error(_('Unknown flag: %s', arg));
} else { } else {
@@ -190,6 +184,8 @@ class Application {
} }
onLocaleChanged() { onLocaleChanged() {
return;
let currentCommands = this.vorpal().commands; let currentCommands = this.vorpal().commands;
for (let i = 0; i < currentCommands.length; i++) { for (let i = 0; i < currentCommands.length; i++) {
let cmd = currentCommands[i]; let cmd = currentCommands[i];
@@ -204,6 +200,8 @@ class Application {
} }
loadCommands_() { loadCommands_() {
return;
this.onLocaleChanged(); // Ensures that help and exit commands are translated this.onLocaleChanged(); // Ensures that help and exit commands are translated
fs.readdirSync(__dirname).forEach((path) => { fs.readdirSync(__dirname).forEach((path) => {
@@ -272,10 +270,120 @@ class Application {
} }
} }
async start() { findCommandByName(name) {
this.vorpal_ = require('vorpal')(); let CommandClass = null;
vorpalUtils.initialize(this.vorpal()); try {
CommandClass = require('./command-' + name + '.js');
} catch (error) {
let e = new Error('No such command: ' + name);
e.type = 'notFound';
throw e;
}
let cmd = new CommandClass();
cmd.log = (...object) => {
return console.log(...object);
}
return cmd;
}
makeCommandArgs(cmd, argv) {
let cmdUsage = cmd.usage();
cmdUsage = yargParser(cmdUsage);
let output = {};
let options = cmd.options();
let booleanFlags = [];
let aliases = {};
for (let i = 0; i < options.length; i++) {
if (options[i].length != 2) throw new Error('Invalid options: ' + options[i]);
let flags = options[i][0];
let text = options[i][1];
flags = this.parseFlags(flags);
if (!flags.arg) {
booleanFlags.push(flags.short);
if (flags.long) booleanFlags.push(flags.long);
}
if (flags.short && flags.long) {
aliases[flags.long] = [flags.short];
}
}
let args = yargParser(argv, {
boolean: booleanFlags,
alias: aliases,
});
for (let i = 1; i < cmdUsage['_'].length; i++) {
const a = this.parseCommandArg(cmdUsage['_'][i]);
if (a.required && !args['_'][i]) throw new Error('Missing required arg: ' + a.name);
if (i >= a.length) {
output[a.name] = null;
} else {
output[a.name] = args['_'][i];
}
}
let argOptions = {};
for (let key in args) {
if (!args.hasOwnProperty(key)) continue;
if (key == '_') continue;
argOptions[key] = args[key];
}
output.options = argOptions;
return output;
}
parseFlags(flags) {
let output = {};
flags = flags.split(',');
for (let i = 0; i < flags.length; i++) {
let f = flags[i].trim();
if (f.substr(0, 2) == '--') {
f = f.split(' ');
output.long = f[0].substr(2).trim();
if (f.length == 2) {
output.arg = this.parseCommandArg(f[1].trim());
}
} else if (f.substr(0, 1) == '-') {
output.short = f.substr(1);
}
}
return output;
}
parseCommandArg(arg) {
if (arg.length <= 2) throw new Error('Invalid command arg: ' + arg);
const c1 = arg[0];
const c2 = arg[arg.length - 1];
const name = arg.substr(1, arg.length - 2);
if (c1 == '<' && c2 == '>') {
return { required: true, name: name };
} else if (c1 == '[' && c2 == ']') {
return { required: false, name: name };
} else {
throw new Error('Invalid command arg: ' + arg);
}
}
async execCommand(argv) {
if (!argv.length) throw new Error('Empty command');
const commandName = argv[0];
const command = this.findCommandByName(commandName);
const cmdArgs = this.makeCommandArgs(command, argv);
await command.action(cmdArgs);
}
async start() {
let argv = process.argv; let argv = process.argv;
let startFlags = await this.handleStartFlags_(argv); let startFlags = await this.handleStartFlags_(argv);
argv = startFlags.argv; argv = startFlags.argv;
@@ -330,7 +438,7 @@ class Application {
setLocale(Setting.value('locale')); setLocale(Setting.value('locale'));
this.loadCommands_(); //this.loadCommands_();
let currentFolderId = Setting.value('activeFolderId'); let currentFolderId = Setting.value('activeFolderId');
this.currentFolder_ = null; this.currentFolder_ = null;
@@ -338,25 +446,101 @@ class Application {
if (!this.currentFolder_) this.currentFolder_ = await Folder.defaultFolder(); if (!this.currentFolder_) this.currentFolder_ = await Folder.defaultFolder();
Setting.setValue('activeFolderId', this.currentFolder_ ? this.currentFolder_.id : ''); Setting.setValue('activeFolderId', this.currentFolder_ ? this.currentFolder_.id : '');
if (this.currentFolder_) await this.vorpal().exec('use ' + this.escapeShellArg(this.currentFolder_.title));
// If we still have arguments, pass it to Vorpal and exit
if (argv.length) {
let cmd = this.shellArgsToString(argv);
await this.vorpal().exec(cmd);
} else {
setInterval(() => { const completion = omelette(`joplindev <title>`);
reg.scheduleSync(0);
}, 1000 * 60 * 5);
this.updatePrompt(); // Bind events for every template part.
this.vorpal().show(); completion.on('title', ({ before, reply }) => {
this.vorpal().history(Setting.value('appId')); // Enables persistent history const child_process = require('child_process');
if (!this.currentFolder()) { const stdout = child_process.execSync('joplindev autocompletion --before "' + before + '" notes');
this.vorpal().log(_('No notebook is defined. Create one with `mkbook <notebook>`.')); reply(JSON.parse(stdout));
} });
}
// Initialize the omelette.
completion.init()
// const omelCommand = ({ before, reply }) => {
// reply([ 'cat', 'ls' ]);
// }
// const omelTitle = ({ reply }) => {
// if (this.currentFolder_) {
// Note.previews(this.currentFolder_.id).then((notes) => {
// console.info(notes.length);
// const output = notes.map((n) => n.title);
// reply(['aa']);
// //reply(output);
// });
// } else {
// reply([]);
// }
// }
// omelette`joplindev ${omelCommand} ${omelTitle}`.init()
this.execCommand(argv);
// if (this.currentFolder_) await this.vorpal().exec('use ' + this.escapeShellArg(this.currentFolder_.title));
// // If we still have arguments, pass it to Vorpal and exit
// if (argv.length) {
// let cmd = this.shellArgsToString(argv);
// await this.vorpal().exec(cmd);
// } else {
// setInterval(() => {
// reg.scheduleSync(0);
// }, 1000 * 60 * 5);
// this.updatePrompt();
// this.vorpal().show();
// this.vorpal().history(Setting.value('appId')); // Enables persistent history
// if (!this.currentFolder()) {
// this.vorpal().log(_('No notebook is defined. Create one with `mkbook <notebook>`.'));
// }
// }
} }
} }

View File

@@ -0,0 +1,41 @@
const stringPadding = require('string-padding');
const cliUtils = {
printArray: function(logFunction, rows, headers = null) {
if (!rows.length) return '';
const ALIGN_LEFT = 0;
const ALIGN_RIGHT = 1;
let colWidths = [];
let colAligns = [];
for (let i = 0; i < rows.length; i++) {
let row = rows[i];
for (let j = 0; j < row.length; j++) {
let item = row[j];
let width = item ? item.toString().length : 0;
let align = typeof item == 'number' ? ALIGN_RIGHT : ALIGN_LEFT;
if (!colWidths[j] || colWidths[j] < width) colWidths[j] = width;
if (colAligns.length <= j) colAligns[j] = align;
}
}
let lines = [];
for (let row = 0; row < rows.length; row++) {
let line = [];
for (let col = 0; col < colWidths.length; col++) {
let item = rows[row][col];
let width = colWidths[col];
let dir = colAligns[col] == ALIGN_LEFT ? stringPadding.RIGHT : stringPadding.LEFT;
line.push(stringPadding(item, width, ' ', dir));
}
logFunction(line.join(' '));
}
},
}
export { cliUtils };

View File

@@ -0,0 +1,41 @@
import { BaseCommand } from './base-command.js';
import { app } from './app.js';
import { _ } from 'lib/locale.js';
import { Note } from 'lib/models/note.js';
class Command extends BaseCommand {
usage() {
return 'autocompletion <type> [arg1]';
}
description() {
return 'Helper for autocompletion';
}
options() {
return [
[ '--before <before>', 'before' ],
];
}
hidden() {
return true;
}
async action(args) {
let output = [];
if (args.type == 'notes') {
// TODO:
if (!app().currentFolder()) throw new Error('no current folder');
let options = {};
if (args.options.before) options.titlePattern = args.options.before + '*';
const notes = await Note.previews(app().currentFolder().id, options);
output = notes.map((n) => n.title);
}
this.log(JSON.stringify(output));
}
}
module.exports = Command;

View File

@@ -2,7 +2,6 @@ import fs from 'fs-extra';
import { BaseCommand } from './base-command.js'; import { BaseCommand } from './base-command.js';
import { app } from './app.js'; import { app } from './app.js';
import { _ } from 'lib/locale.js'; import { _ } from 'lib/locale.js';
import { vorpalUtils } from './vorpal-utils.js';
import { Folder } from 'lib/models/folder.js'; import { Folder } from 'lib/models/folder.js';
import { Note } from 'lib/models/note.js'; import { Note } from 'lib/models/note.js';
import { Setting } from 'lib/models/setting.js'; import { Setting } from 'lib/models/setting.js';
@@ -29,7 +28,7 @@ class Command extends BaseCommand {
const onFinishedEditing = async () => { const onFinishedEditing = async () => {
if (watcher) watcher.close(); if (watcher) watcher.close();
app().vorpal().show(); //app().vorpal().show();
newNote = null; newNote = null;
this.log(_('Done editing.')); this.log(_('Done editing.'));
} }
@@ -47,6 +46,9 @@ class Command extends BaseCommand {
let note = await app().loadItem(BaseModel.TYPE_NOTE, title); let note = await app().loadItem(BaseModel.TYPE_NOTE, title);
if (!note) { if (!note) {
// TODO
throw new Error(_('Note does not exist.'));
let ok = await vorpalUtils.cmdPromptConfirm(this, _('Note does not exist: "%s". Create it?', title)) let ok = await vorpalUtils.cmdPromptConfirm(this, _('Note does not exist: "%s". Create it?', title))
if (!ok) return; if (!ok) return;
newNote = await Note.save({ title: title, parent_id: app().currentFolder().id }); newNote = await Note.save({ title: title, parent_id: app().currentFolder().id });
@@ -68,7 +70,7 @@ class Command extends BaseCommand {
this.log(_('Starting to edit note. Close the editor to get back to the prompt.')); this.log(_('Starting to edit note. Close the editor to get back to the prompt.'));
app().vorpal().hide(); //app().vorpal().hide();
await fs.writeFile(tempFilePath, content); await fs.writeFile(tempFilePath, content);

View File

@@ -2,7 +2,6 @@ import { BaseCommand } from './base-command.js';
import { app } from './app.js'; import { app } from './app.js';
import { _ } from 'lib/locale.js'; import { _ } from 'lib/locale.js';
import { Folder } from 'lib/models/folder.js'; import { Folder } from 'lib/models/folder.js';
import { vorpalUtils } from './vorpal-utils.js';
import { importEnex } from 'import-enex'; import { importEnex } from 'import-enex';
import { filename, basename } from 'lib/path-utils.js'; import { filename, basename } from 'lib/path-utils.js';
@@ -29,6 +28,11 @@ class Command extends BaseCommand {
let folderTitle = args['notebook']; let folderTitle = args['notebook'];
let force = args.options.force === true; let force = args.options.force === true;
force = true; // TODO
if (!folderTitle) folderTitle = filename(filePath); if (!folderTitle) folderTitle = filename(filePath);
folder = await Folder.loadByField('title', folderTitle); folder = await Folder.loadByField('title', folderTitle);
const msg = folder ? _('File "%s" will be imported into existing notebook "%s". Continue?', basename(filePath), folderTitle) : _('New notebook "%s" will be created and file "%s" will be imported into it. Continue?', folderTitle, basename(filePath)); const msg = folder ? _('File "%s" will be imported into existing notebook "%s". Continue?', basename(filePath), folderTitle) : _('New notebook "%s" will be created and file "%s" will be imported into it. Continue?', folderTitle, basename(filePath));
@@ -46,10 +50,10 @@ class Command extends BaseCommand {
if (progressState.skipped) line.push(_('Skipped: %d.', progressState.skipped)); if (progressState.skipped) line.push(_('Skipped: %d.', progressState.skipped));
if (progressState.resourcesCreated) line.push(_('Resources: %d.', progressState.resourcesCreated)); if (progressState.resourcesCreated) line.push(_('Resources: %d.', progressState.resourcesCreated));
if (progressState.notesTagged) line.push(_('Tagged: %d.', progressState.notesTagged)); if (progressState.notesTagged) line.push(_('Tagged: %d.', progressState.notesTagged));
vorpalUtils.redraw(line.join(' ')); this.log(line.join(' ')); // TODO
//vorpalUtils.redraw(line.join(' '));
}, },
onError: (error) => { onError: (error) => {
vorpalUtils.redrawDone();
let s = error.trace ? error.trace : error.toString(); let s = error.trace ? error.trace : error.toString();
this.log(s); this.log(s);
}, },

View File

@@ -8,7 +8,7 @@ import { Note } from 'lib/models/note.js';
import { autocompleteFolders } from './autocomplete.js'; import { autocompleteFolders } from './autocomplete.js';
import { sprintf } from 'sprintf-js'; import { sprintf } from 'sprintf-js';
import { time } from 'lib/time-utils.js'; import { time } from 'lib/time-utils.js';
import { vorpalUtils } from './vorpal-utils.js'; import { cliUtils } from './cli-utils.js';
class Command extends BaseCommand { class Command extends BaseCommand {
@@ -117,7 +117,7 @@ class Command extends BaseCommand {
rows.push(row); rows.push(row);
} }
vorpalUtils.printArray(this, rows); cliUtils.printArray(this.log, rows);
} }
} }

View File

@@ -6,7 +6,6 @@ import { Folder } from 'lib/models/folder.js';
import { Note } from 'lib/models/note.js'; import { Note } from 'lib/models/note.js';
import { BaseModel } from 'lib/base-model.js'; import { BaseModel } from 'lib/base-model.js';
import { autocompleteItems } from './autocomplete.js'; import { autocompleteItems } from './autocomplete.js';
import { vorpalUtils } from './vorpal-utils.js';
class Command extends BaseCommand { class Command extends BaseCommand {
@@ -32,12 +31,12 @@ class Command extends BaseCommand {
async action(args) { async action(args) {
const pattern = args['pattern'].toString(); const pattern = args['pattern'].toString();
const recursive = args.options && args.options.recursive === true; const recursive = args.options && args.options.recursive === true;
const force = args.options && args.options.force === true; const force = true || args.options && args.options.force === true; // TODO
if (recursive) { if (recursive) {
const folder = await app().loadItem(BaseModel.TYPE_FOLDER, pattern); const folder = await app().loadItem(BaseModel.TYPE_FOLDER, pattern);
if (!folder) throw new Error(_('Cannot find "%s".', pattern)); if (!folder) throw new Error(_('Cannot find "%s".', pattern));
const ok = force ? true : await vorpalUtils.cmdPromptConfirm(this, _('Delete notebook "%s"?', folder.title)); //const ok = force ? true : await vorpalUtils.cmdPromptConfirm(this, _('Delete notebook "%s"?', folder.title));
if (!ok) return; if (!ok) return;
await Folder.delete(folder.id); await Folder.delete(folder.id);
await app().refreshCurrentFolder(); await app().refreshCurrentFolder();

View File

@@ -7,7 +7,6 @@ import { Note } from 'lib/models/note.js';
import { autocompleteFolders } from './autocomplete.js'; import { autocompleteFolders } from './autocomplete.js';
import { sprintf } from 'sprintf-js'; import { sprintf } from 'sprintf-js';
import { time } from 'lib/time-utils.js'; import { time } from 'lib/time-utils.js';
import { vorpalUtils } from './vorpal-utils.js';
class Command extends BaseCommand { class Command extends BaseCommand {

View File

@@ -4,7 +4,6 @@ import { _ } from 'lib/locale.js';
import { OneDriveApiNodeUtils } from './onedrive-api-node-utils.js'; import { OneDriveApiNodeUtils } from './onedrive-api-node-utils.js';
import { Setting } from 'lib/models/setting.js'; import { Setting } from 'lib/models/setting.js';
import { BaseItem } from 'lib/models/base-item.js'; import { BaseItem } from 'lib/models/base-item.js';
import { vorpalUtils } from './vorpal-utils.js';
import { Synchronizer } from 'lib/synchronizer.js'; import { Synchronizer } from 'lib/synchronizer.js';
import { reg } from 'lib/registry.js'; import { reg } from 'lib/registry.js';
import md5 from 'md5'; import md5 from 'md5';
@@ -88,7 +87,8 @@ class Command extends BaseCommand {
let options = { let options = {
onProgress: (report) => { onProgress: (report) => {
let lines = Synchronizer.reportToLines(report); let lines = Synchronizer.reportToLines(report);
if (lines.length) vorpalUtils.redraw(lines.join(' ')); //if (lines.length) vorpalUtils.redraw(lines.join(' '));
if (lines.length) this.log(lines.join(' ')); // TODO
}, },
onMessage: (msg) => { onMessage: (msg) => {
vorpalUtils.redrawDone(); vorpalUtils.redrawDone();
@@ -117,8 +117,6 @@ class Command extends BaseCommand {
throw error; throw error;
} }
} }
vorpalUtils.redrawDone();
await app().refreshCurrentFolder(); await app().refreshCurrentFolder();
@@ -136,7 +134,6 @@ class Command extends BaseCommand {
async cancel() { async cancel() {
const target = this.syncTarget_ ? this.syncTarget_ : Setting.value('sync.target'); const target = this.syncTarget_ ? this.syncTarget_ : Setting.value('sync.target');
vorpalUtils.redrawDone();
this.log(_('Cancelling...')); this.log(_('Cancelling...'));
if (reg.syncHasAuth(target)) { if (reg.syncHasAuth(target)) {

View File

@@ -1,5 +1,7 @@
#!/usr/bin/env node #!/usr/bin/env node
// Loading time: 20170803: 1.5s with no commands
require('source-map-support').install(); require('source-map-support').install();
require('babel-plugin-transform-runtime'); require('babel-plugin-transform-runtime');
@@ -36,12 +38,6 @@ BaseItem.loadClass('NoteTag', NoteTag);
Setting.setConstant('appId', 'net.cozic.joplin-cli'); Setting.setConstant('appId', 'net.cozic.joplin-cli');
Setting.setConstant('appType', 'cli'); Setting.setConstant('appType', 'cli');
process.stdin.on('keypress', (_, key) => {
if (key && key.name === 'return') {
app().updatePrompt();
}
});
shimInit(); shimInit();
app().start().catch((error) => { app().start().catch((error) => {

View File

@@ -12,6 +12,17 @@
var spawn = require('child_process').spawn; var spawn = require('child_process').spawn;
var args = ['main.js']; var args = ['main.js'];
if (process.argv[1].indexOf('joplindev') >= 0) {
args.push('--profile');
args.push('/mnt/d/Temp/TestNotes2');
args.push('--stack-trace-enabled');
args.push('--log-level');
args.push('debug');
args.push('--env');
args.push('dev');
}
var processArgs = process.argv.splice(2); var processArgs = process.argv.splice(2);
args = args.concat(processArgs); args = args.concat(processArgs);

View File

@@ -8,6 +8,7 @@ rm -f "$CLIENT_DIR/app/lib"
ln -s "$CLIENT_DIR/../ReactNativeClient/lib" "$CLIENT_DIR/app" ln -s "$CLIENT_DIR/../ReactNativeClient/lib" "$CLIENT_DIR/app"
cp "$CLIENT_DIR/package.json" "$CLIENT_DIR/build" cp "$CLIENT_DIR/package.json" "$CLIENT_DIR/build"
yarn run build npm run build
#yarn run build
NODE_PATH="$CLIENT_DIR/build" node "$CLIENT_DIR/build/build-translation.js" --silent #NODE_PATH="$CLIENT_DIR/build" node "$CLIENT_DIR/build/build-translation.js" --silent

View File

@@ -41,9 +41,6 @@ msgstr ""
msgid "Exits the application." msgid "Exits the application."
msgstr "" msgstr ""
msgid "No notebook is defined. Create one with `mkbook <notebook>`."
msgstr ""
msgid "Displays the given note." msgid "Displays the given note."
msgstr "" msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "No active notebook." msgid "No active notebook."
msgstr "" msgstr ""
msgid "Note does not exist."
msgstr ""
#, javascript-format #, javascript-format
msgid "Note does not exist: \"%s\". Create it?" msgid "Note does not exist: \"%s\". Create it?"
msgstr "" msgstr ""
@@ -200,10 +200,6 @@ msgstr ""
msgid "Deletes a notebook." msgid "Deletes a notebook."
msgstr "" msgstr ""
#, javascript-format
msgid "Delete notebook \"%s\"?"
msgstr ""
#, javascript-format #, javascript-format
msgid "%d notes match this pattern. Delete them?" msgid "%d notes match this pattern. Delete them?"
msgstr "" msgstr ""
@@ -319,7 +315,7 @@ msgid "Deleted remote items: %d."
msgstr "" msgstr ""
#, javascript-format #, javascript-format
msgid "State: %s." msgid "State: \"%s\"."
msgstr "" msgstr ""
#, javascript-format #, javascript-format
@@ -487,6 +483,9 @@ msgstr ""
msgid "Delete note?" msgid "Delete note?"
msgstr "" msgstr ""
msgid "Attach file"
msgstr ""
msgid "Delete note" msgid "Delete note"
msgstr "" msgstr ""

View File

@@ -14,8 +14,6 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.0.3\n" "X-Generator: Poedit 2.0.3\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
msgid "No notebook selected." msgid "No notebook selected."
msgstr "Aucun carnet n'est sélectionné." msgstr "Aucun carnet n'est sélectionné."
@@ -45,9 +43,6 @@ msgstr "Affiche l'aide pour la commande donnée."
msgid "Exits the application." msgid "Exits the application."
msgstr "Quitter le logiciel." msgstr "Quitter le logiciel."
msgid "No notebook is defined. Create one with `mkbook <notebook>`."
msgstr "Aucun carnet n'est défini. Créez-en un avec `mkbook <carnet>`."
msgid "Displays the given note." msgid "Displays the given note."
msgstr "Affiche la note." msgstr "Affiche la note."
@@ -100,6 +95,10 @@ msgstr ""
msgid "No active notebook." msgid "No active notebook."
msgstr "Aucun carnet actif." msgstr "Aucun carnet actif."
#, fuzzy
msgid "Note does not exist."
msgstr "Ce carnet n'existe pas : \"%s\". Le créer ?"
#, javascript-format #, javascript-format
msgid "Note does not exist: \"%s\". Create it?" msgid "Note does not exist: \"%s\". Create it?"
msgstr "Ce carnet n'existe pas : \"%s\". Le créer ?" msgstr "Ce carnet n'existe pas : \"%s\". Le créer ?"
@@ -227,10 +226,6 @@ msgstr "Supprime les objets sans demander la confirmation."
msgid "Deletes a notebook." msgid "Deletes a notebook."
msgstr "Supprime le carnet." msgstr "Supprime le carnet."
#, javascript-format
msgid "Delete notebook \"%s\"?"
msgstr "Supprimer le carnet \"%s\" ?"
#, javascript-format #, javascript-format
msgid "%d notes match this pattern. Delete them?" msgid "%d notes match this pattern. Delete them?"
msgstr "%d notes correspondent à ce motif. Les supprimer ?" msgstr "%d notes correspondent à ce motif. Les supprimer ?"
@@ -362,8 +357,8 @@ msgstr "Objets supprimés localement : %d."
msgid "Deleted remote items: %d." msgid "Deleted remote items: %d."
msgstr "Objets distants supprimés : %d." msgstr "Objets distants supprimés : %d."
#, javascript-format #, fuzzy, javascript-format
msgid "State: %s." msgid "State: \"%s\"."
msgstr "Etat : %s." msgstr "Etat : %s."
#, javascript-format #, javascript-format
@@ -533,6 +528,9 @@ msgstr "Sans titre"
msgid "Delete note?" msgid "Delete note?"
msgstr "Supprimer la note ?" msgstr "Supprimer la note ?"
msgid "Attach file"
msgstr "Attacher un fichier"
msgid "Delete note" msgid "Delete note"
msgstr "Supprimer la note" msgstr "Supprimer la note"
@@ -581,6 +579,12 @@ msgstr ""
msgid "Welcome" msgid "Welcome"
msgstr "Bienvenue" msgstr "Bienvenue"
#~ msgid "Delete notebook \"%s\"?"
#~ msgstr "Supprimer le carnet \"%s\" ?"
#~ msgid "No notebook is defined. Create one with `mkbook <notebook>`."
#~ msgstr "Aucun carnet n'est défini. Créez-en un avec `mkbook <carnet>`."
#~ msgid "NAME" #~ msgid "NAME"
#~ msgstr "NOM" #~ msgstr "NOM"
@@ -654,9 +658,6 @@ msgstr "Bienvenue"
#~ msgid "use <notebook>" #~ msgid "use <notebook>"
#~ msgstr "Nouveau carnet" #~ msgstr "Nouveau carnet"
#~ msgid "Attach file"
#~ msgstr "Attacher un fichier"
#~ msgid "All potential ports are in use - please report the issue at %s" #~ msgid "All potential ports are in use - please report the issue at %s"
#~ msgstr "" #~ msgstr ""
#~ "Tous les ports sont en cours d'utilisation. Veuillez signaler ce problème " #~ "Tous les ports sont en cours d'utilisation. Veuillez signaler ce problème "

View File

@@ -41,9 +41,6 @@ msgstr ""
msgid "Exits the application." msgid "Exits the application."
msgstr "" msgstr ""
msgid "No notebook is defined. Create one with `mkbook <notebook>`."
msgstr ""
msgid "Displays the given note." msgid "Displays the given note."
msgstr "" msgstr ""
@@ -89,6 +86,9 @@ msgstr ""
msgid "No active notebook." msgid "No active notebook."
msgstr "" msgstr ""
msgid "Note does not exist."
msgstr ""
#, javascript-format #, javascript-format
msgid "Note does not exist: \"%s\". Create it?" msgid "Note does not exist: \"%s\". Create it?"
msgstr "" msgstr ""
@@ -200,10 +200,6 @@ msgstr ""
msgid "Deletes a notebook." msgid "Deletes a notebook."
msgstr "" msgstr ""
#, javascript-format
msgid "Delete notebook \"%s\"?"
msgstr ""
#, javascript-format #, javascript-format
msgid "%d notes match this pattern. Delete them?" msgid "%d notes match this pattern. Delete them?"
msgstr "" msgstr ""
@@ -319,7 +315,7 @@ msgid "Deleted remote items: %d."
msgstr "" msgstr ""
#, javascript-format #, javascript-format
msgid "State: %s." msgid "State: \"%s\"."
msgstr "" msgstr ""
#, javascript-format #, javascript-format
@@ -487,6 +483,9 @@ msgstr ""
msgid "Delete note?" msgid "Delete note?"
msgstr "" msgstr ""
msgid "Attach file"
msgstr ""
msgid "Delete note" msgid "Delete note"
msgstr "" msgstr ""

View File

@@ -14,6 +14,7 @@
"dependencies": { "dependencies": {
"app-module-path": "^2.2.0", "app-module-path": "^2.2.0",
"babel-plugin-transform-runtime": "^6.23.0", "babel-plugin-transform-runtime": "^6.23.0",
"cache-require-paths": "^0.3.0",
"follow-redirects": "^1.2.4", "follow-redirects": "^1.2.4",
"form-data": "^2.1.4", "form-data": "^2.1.4",
"fs-extra": "^3.0.1", "fs-extra": "^3.0.1",
@@ -25,6 +26,7 @@
"moment": "^2.18.1", "moment": "^2.18.1",
"moment-timezone": "^0.5.13", "moment-timezone": "^0.5.13",
"node-fetch": "^1.7.1", "node-fetch": "^1.7.1",
"omelette": "^0.4.4",
"os-tmpdir": "^1.0.2", "os-tmpdir": "^1.0.2",
"promise": "^7.1.1", "promise": "^7.1.1",
"proper-lockfile": "^2.0.1", "proper-lockfile": "^2.0.1",
@@ -38,7 +40,8 @@
"string-to-stream": "^1.1.0", "string-to-stream": "^1.1.0",
"tcp-port-used": "^0.1.2", "tcp-port-used": "^0.1.2",
"uuid": "^3.0.1", "uuid": "^3.0.1",
"vorpal": "^1.12.0" "vorpal": "^1.12.0",
"yargs-parser": "^7.0.0"
}, },
"devDependencies": { "devDependencies": {
"babel-changed": "^7.0.0", "babel-changed": "^7.0.0",

View File

@@ -1,6 +1,7 @@
#!/bin/bash #!/bin/bash
set -e set -e
CLIENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" CLIENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
bash $CLIENT_DIR/build.sh && NODE_PATH="$CLIENT_DIR/build/" node build/main.js --profile ~/Temp/TestNotes2 --stack-trace-enabled --log-level debug --env dev "$@" bash $CLIENT_DIR/build.sh && NODE_PATH="$CLIENT_DIR/build/" node build/main.js --profile ~/Temp/TestNotes2 --stack-trace-enabled --log-level debug --env dev "$@"
#bash $CLIENT_DIR/build.sh && NODE_PATH="$CLIENT_DIR/build/" node build/main.js --profile ~/Temp/TestNotes import-enex --fuzzy-matching /home/laurent/Desktop/afaire.enex afaire #bash $CLIENT_DIR/build.sh && NODE_PATH="$CLIENT_DIR/build/" node build/main.js --profile ~/Temp/TestNotes import-enex --fuzzy-matching /home/laurent/Desktop/afaire.enex afaire
#bash $CLIENT_DIR/build.sh && NODE_PATH="$CLIENT_DIR/build/" node build/main.js --profile ~/Temp/TestNotes import-enex --fuzzy-matching /home/laurent/Desktop/Laurent.enex laurent #bash $CLIENT_DIR/build.sh && NODE_PATH="$CLIENT_DIR/build/" node build/main.js --profile ~/Temp/TestNotes import-enex --fuzzy-matching /home/laurent/Desktop/Laurent.enex laurent

View File

@@ -758,6 +758,10 @@ browserslist@^2.1.2:
caniuse-lite "^1.0.30000684" caniuse-lite "^1.0.30000684"
electron-to-chromium "^1.3.14" electron-to-chromium "^1.3.14"
camelcase@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
caniuse-lite@^1.0.30000684: caniuse-lite@^1.0.30000684:
version "1.0.30000701" version "1.0.30000701"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000701.tgz#9d673cf6b74dcb3d5c21d213176b011ac6a45baa" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000701.tgz#9d673cf6b74dcb3d5c21d213176b011ac6a45baa"
@@ -1643,6 +1647,10 @@ object.omit@^2.0.0:
for-own "^0.1.4" for-own "^0.1.4"
is-extendable "^0.1.1" is-extendable "^0.1.1"
omelette@^0.4.4:
version "0.4.4"
resolved "https://registry.yarnpkg.com/omelette/-/omelette-0.4.4.tgz#e8fa98cb08eeec0e402c49561fc0670c75120c89"
once@^1.3.0, once@^1.3.3: once@^1.3.0, once@^1.3.3:
version "1.4.0" version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
@@ -2174,3 +2182,9 @@ write@^0.2.1:
resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
dependencies: dependencies:
mkdirp "^0.5.1" mkdirp "^0.5.1"
yargs-parser@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9"
dependencies:
camelcase "^4.1.0"

View File

@@ -90,8 +90,8 @@ android {
applicationId "net.cozic.joplin" applicationId "net.cozic.joplin"
minSdkVersion 16 minSdkVersion 16
targetSdkVersion 22 targetSdkVersion 22
versionCode 40 versionCode 41
versionName "0.9.27" versionName "0.9.28"
ndk { ndk {
abiFilters "armeabi-v7a", "x86" abiFilters "armeabi-v7a", "x86"
} }