diff --git a/README.md b/README.md index da46446b..9bec4209 100644 --- a/README.md +++ b/README.md @@ -138,6 +138,7 @@ Select a problem to fight. With `-g`+`-l`, the code template could be auto gener The return format had been changed to zero-based indices. Please read the above updated description carefully. * `-g` to generate source file. +* `-d` to generate source file with problem description plus word wrapping. * `-l` to choose programming language. (Depends on which langs are provided on leetcode) * c * cpp @@ -148,6 +149,7 @@ Select a problem to fight. With `-g`+`-l`, the code template could be auto gener * python * ruby * swift + * Instead of index number, you can use name to select a problem. * `lc show "Two Sum"` * `lc show two-sum` diff --git a/lib/commands/show.js b/lib/commands/show.js index 9ea720dc..67fe93a6 100644 --- a/lib/commands/show.js +++ b/lib/commands/show.js @@ -7,6 +7,7 @@ var sprintf = require('sprintf-js').sprintf; var config = require('../config'); var core = require('../core'); var h = require('../helper'); +var wrap = require('wordwrap')(77); var cmd = { command: 'show ', @@ -17,6 +18,11 @@ var cmd = { type: 'boolean', describe: 'Generate source file from template' }, + dump: { + alias: 'd', + type: 'boolean', + describe: 'Write descriptions & source file from template' + }, lang: { alias: 'l', type: 'string', @@ -49,7 +55,56 @@ cmd.handler = function(argv) { console.log(sprintf('* %s (%.2f%%)', problem.level, problem.percent)); console.log(sprintf('* Total Accepted: %d', problem.totalAC)); console.log(sprintf('* Total Submissions: %d\n', problem.totalSubmit)); - console.log(problem.desc); + + var description = wrap(problem.desc.replace(/[\r]/g, '').replace(/[\r\n]{2,}/g, '\n')); + + if (argv.dump) { + var template = _.find(problem.templates, function(x) { + return x.value === argv.lang; + }); + if (!template) + return console.log('Failed to generate source file: ' + + 'unknown language ' + argv.lang); + + var f = problem.id + "_" + problem.key; + var delimiter = '//'; + var header = ''; + var library = ''; + + if (argv.lang === 'python' || argv.lang === 'ruby') { + f += h.langToExt(argv.lang); + header = sprintf('#!/usr/bin/env %s\n#\n', argv.lang); + delimiter = '#'; + } + else if (argv.lang === 'java') { + if (!fs.existsSync(f)) { + fs.mkdirSync(f); + } + f += '/' + 'Solution' + h.langToExt(argv.lang); + library = 'import java.util.*;'; + } + fs.writeFileSync(f, header); + fs.appendFileSync(f, sprintf('%s [%d] %s\n', delimiter, problem.id, problem.name)); + fs.appendFileSync(f, sprintf('%s %s\n%s\n', delimiter, problem.link, delimiter)); + fs.appendFileSync(f, sprintf('%s * %s (%.2f%%)\n', delimiter, problem.level, problem.percent)); + fs.appendFileSync(f, sprintf('%s * Total Accepted: %d\n', delimiter, problem.totalAC)); + fs.appendFileSync(f, sprintf('%s * Total Submissions: %d\n', delimiter, problem.totalSubmit)); + if (argv.lang === 'python' || argv.lang === 'ruby') { + fs.appendFileSync(f, '\n' + '# ' + description.split('\n').join('\n' + delimiter + ' ')); + } + else if (argv.lang === 'java') { + fs.appendFileSync(f, '\n' + '/* ' + description.split('\n').join('\n' + ' * ') + '\n */\n'); + } + fs.appendFileSync(f, sprintf('\n%s %s: %s\n', delimiter, "Time Complexity", "O()")); + fs.appendFileSync(f, sprintf('%s %s: %s\n\n\n', delimiter, "Space Complexity", "O()")); + if (library) { + fs.appendFileSync(f, sprintf('%s\n\n', library)); + } + fs.appendFileSync(f, template.defaultCode.replace(/[\r\t]/g, '')); + } + else { + console.log(description); + } }); }; diff --git a/package.json b/package.json index dc6b72f4..db78025e 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "request": "^2.74.0", "sprintf-js": "^1.0.3", "underscore": "^1.8.3", + "word-wrap": "^1.1.0", "yargs": "^5.0.0" }, "devDependencies": {