2017-11-03 02:09:34 +02:00
const fs = require ( 'fs-extra' ) ;
2020-11-07 17:59:37 +02:00
const { fileExtension , dirname } = require ( '@joplin/lib/path-utils' ) ;
2017-11-03 02:09:34 +02:00
const wrap _ = require ( 'word-wrap' ) ;
2020-11-07 17:59:37 +02:00
const { languageCode } = require ( '@joplin/lib/locale' ) ;
2017-07-28 00:59:34 +02:00
const rootDir = dirname ( dirname ( _ _dirname ) ) ;
const MAX _WIDTH = 78 ;
const INDENT = ' ' ;
function wrap ( text , indent ) {
return wrap _ ( text , {
width : MAX _WIDTH - indent . length ,
indent : indent ,
} ) ;
}
function renderOptions ( options ) {
2020-03-14 01:46:14 +02:00
const output = [ ] ;
2017-07-28 00:59:34 +02:00
const optionColWidth = getOptionColWidth ( options ) ;
for ( let i = 0 ; i < options . length ; i ++ ) {
2020-03-14 01:46:14 +02:00
const option = options [ i ] ;
2017-07-28 00:59:34 +02:00
const flag = option [ 0 ] ;
const indent = INDENT + INDENT + ' ' . repeat ( optionColWidth + 2 ) ;
2019-07-30 09:35:42 +02:00
2017-07-28 00:59:34 +02:00
let r = wrap ( option [ 1 ] , indent ) ;
r = r . substr ( flag . length + ( INDENT + INDENT ) . length ) ;
r = INDENT + INDENT + flag + r ;
output . push ( r ) ;
}
2019-07-30 09:35:42 +02:00
return output . join ( '\n' ) ;
2017-07-28 00:59:34 +02:00
}
function renderCommand ( cmd ) {
2020-03-14 01:46:14 +02:00
const output = [ ] ;
2017-07-28 00:59:34 +02:00
output . push ( INDENT + cmd . usage ( ) ) ;
output . push ( '' ) ;
output . push ( wrap ( cmd . description ( ) , INDENT + INDENT ) ) ;
const optionString = renderOptions ( cmd . options ( ) ) ;
if ( optionString ) {
output . push ( '' ) ;
output . push ( optionString ) ;
}
2019-07-30 09:35:42 +02:00
return output . join ( '\n' ) ;
2017-07-28 00:59:34 +02:00
}
function getCommands ( ) {
2020-03-14 01:46:14 +02:00
const output = [ ] ;
2020-05-21 10:14:33 +02:00
fs . readdirSync ( _ _dirname ) . forEach ( path => {
2017-07-28 00:59:34 +02:00
if ( path . indexOf ( 'command-' ) !== 0 ) return ;
2019-07-30 09:35:42 +02:00
const ext = fileExtension ( path ) ;
2022-07-23 09:31:32 +02:00
if ( ext !== 'js' ) return ;
2017-07-28 00:59:34 +02:00
2020-03-14 01:46:14 +02:00
const CommandClass = require ( ` ./ ${ path } ` ) ;
const cmd = new CommandClass ( ) ;
2017-07-28 00:59:34 +02:00
if ( ! cmd . enabled ( ) ) return ;
2017-07-28 19:57:01 +02:00
if ( cmd . hidden ( ) ) return ;
2017-07-28 00:59:34 +02:00
output . push ( cmd ) ;
} ) ;
return output ;
}
function getOptionColWidth ( options ) {
let output = 0 ;
for ( let j = 0 ; j < options . length ; j ++ ) {
const option = options [ j ] ;
if ( option [ 0 ] . length > output ) output = option [ 0 ] . length ;
}
return output ;
}
function getHeader ( ) {
2020-03-14 01:46:14 +02:00
const output = [ ] ;
2017-07-28 00:59:34 +02:00
2017-08-01 20:53:50 +02:00
output . push ( 'NAME' ) ;
2017-07-28 00:59:34 +02:00
output . push ( '' ) ;
2017-10-30 02:37:34 +02:00
output . push ( wrap ( 'joplin - a note taking and to-do app with synchronisation capabilities' ) , INDENT ) ;
2017-07-28 00:59:34 +02:00
output . push ( '' ) ;
2017-08-01 20:53:50 +02:00
output . push ( 'DESCRIPTION' ) ;
2017-07-28 00:59:34 +02:00
output . push ( '' ) ;
2020-03-14 01:46:14 +02:00
const description = [ ] ;
2017-10-30 02:37:34 +02:00
description . push ( 'Joplin is a note taking and to-do application, which can handle a large number of notes organised into notebooks.' ) ;
2017-08-01 20:53:50 +02:00
description . push ( 'The notes are searchable, can be copied, tagged and modified with your own text editor.' ) ;
2019-07-30 09:35:42 +02:00
description . push ( '\n\n' ) ;
2017-08-01 20:53:50 +02:00
description . push ( 'The notes can be synchronised with various target including the file system (for example with a network directory) or with Microsoft OneDrive.' ) ;
2019-07-30 09:35:42 +02:00
description . push ( '\n\n' ) ;
2017-08-01 20:53:50 +02:00
description . push ( 'Notes exported from Evenotes via .enex files can be imported into Joplin, including the formatted content, resources (images, attachments, etc.) and complete metadata (geolocation, updated time, created time, etc.).' ) ;
2017-07-28 00:59:34 +02:00
output . push ( wrap ( description . join ( '' ) , INDENT ) ) ;
2019-07-30 09:35:42 +02:00
return output . join ( '\n' ) ;
2017-07-28 00:59:34 +02:00
}
function getFooter ( ) {
2020-03-14 01:46:14 +02:00
const output = [ ] ;
2017-07-28 00:59:34 +02:00
2017-08-01 20:53:50 +02:00
output . push ( 'WEBSITE' ) ;
2017-07-28 00:59:34 +02:00
output . push ( '' ) ;
2019-09-19 23:51:18 +02:00
output . push ( ` ${ INDENT } https://joplinapp.org ` ) ;
2017-07-28 00:59:34 +02:00
output . push ( '' ) ;
2017-08-01 20:53:50 +02:00
output . push ( 'LICENSE' ) ;
2017-07-28 00:59:34 +02:00
output . push ( '' ) ;
2019-09-19 23:51:18 +02:00
let filePath = ` ${ rootDir } /LICENSE_ ${ languageCode ( ) } ` ;
if ( ! fs . existsSync ( filePath ) ) filePath = ` ${ rootDir } /LICENSE ` ;
2017-07-28 00:59:34 +02:00
const licenseText = fs . readFileSync ( filePath , 'utf8' ) ;
output . push ( wrap ( licenseText , INDENT ) ) ;
2019-07-30 09:35:42 +02:00
return output . join ( '\n' ) ;
2017-07-28 00:59:34 +02:00
}
async function main ( ) {
// setLocale('fr_FR');
const commands = getCommands ( ) ;
2020-03-14 01:46:14 +02:00
const commandBlocks = [ ] ;
2017-07-28 00:59:34 +02:00
for ( let i = 0 ; i < commands . length ; i ++ ) {
2020-03-14 01:46:14 +02:00
const cmd = commands [ i ] ;
2017-07-28 00:59:34 +02:00
commandBlocks . push ( renderCommand ( cmd ) ) ;
}
const headerText = getHeader ( ) ;
2019-07-30 09:35:42 +02:00
const commandsText = commandBlocks . join ( '\n\n' ) ;
2017-07-28 00:59:34 +02:00
const footerText = getFooter ( ) ;
2019-09-19 23:51:18 +02:00
console . info ( ` ${ headerText } \n \n ` + 'USAGE' + ` \n \n ${ commandsText } \n \n ${ footerText } ` ) ;
2017-07-28 00:59:34 +02:00
}
2020-05-21 10:14:33 +02:00
main ( ) . catch ( error => {
2017-07-28 00:59:34 +02:00
console . error ( error ) ;
2019-07-30 09:35:42 +02:00
} ) ;