From 1838b3c7cb28eab8018f6aabb863352ef1c6b9b7 Mon Sep 17 00:00:00 2001 From: Felipe Moreno Borges Date: Tue, 7 Jul 2020 19:07:00 -0300 Subject: [PATCH 1/2] Final da primeira aula --- src/main/java/cotuba/LeitorOpcoesCLI.java | 96 ++++++ src/main/java/cotuba/Main.java | 375 +++++++++------------- 2 files changed, 246 insertions(+), 225 deletions(-) create mode 100644 src/main/java/cotuba/LeitorOpcoesCLI.java diff --git a/src/main/java/cotuba/LeitorOpcoesCLI.java b/src/main/java/cotuba/LeitorOpcoesCLI.java new file mode 100644 index 0000000..0e7ef8d --- /dev/null +++ b/src/main/java/cotuba/LeitorOpcoesCLI.java @@ -0,0 +1,96 @@ +package cotuba; + +import org.apache.commons.cli.*; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +public class LeitorOpcoesCLI { + + private Path diretorioDosMD; + private String formato; + private Path arquivoDeSaida; + boolean modoVerboso = false; + + LeitorOpcoesCLI(String[] args) { + Options options = new Options(); + + Option opcaoDeDiretorioDosMD = new Option("d", "dir", true, + "Diretório que contem os arquivos md. Default: diretório atual."); + options.addOption(opcaoDeDiretorioDosMD); + + Option opcaoDeFormatoDoEbook = new Option("f", "format", true, + "Formato de saída do ebook. Pode ser: pdf ou epub. Default: pdf"); + options.addOption(opcaoDeFormatoDoEbook); + + Option opcaoDeArquivoDeSaida = new Option("o", "output", true, + "Arquivo de saída do ebook. Default: book.{formato}."); + options.addOption(opcaoDeArquivoDeSaida); + + Option opcaoModoVerboso = new Option("v", "verbose", false, + "Habilita modo verboso."); + options.addOption(opcaoModoVerboso); + + CommandLineParser cmdParser = new DefaultParser(); + HelpFormatter ajuda = new HelpFormatter(); + CommandLine cmd; + + try { + cmd = cmdParser.parse(options, args); + } catch (ParseException e) { + System.err.println(e.getMessage()); + ajuda.printHelp("cotuba", options); + System.exit(1); + return; + } + + String nomeDoDiretorioDosMD = cmd.getOptionValue("dir"); + + if (nomeDoDiretorioDosMD != null) { + diretorioDosMD = Paths.get(nomeDoDiretorioDosMD); + if (!Files.isDirectory(diretorioDosMD)) { + throw new RuntimeException(nomeDoDiretorioDosMD + " não é um diretório."); + } + } else { + Path diretorioAtual = Paths.get(""); + diretorioDosMD = diretorioAtual; + } + + String nomeDoFormatoDoEbook = cmd.getOptionValue("format"); + + if (nomeDoFormatoDoEbook != null) { + formato = nomeDoFormatoDoEbook.toLowerCase(); + } else { + formato = "pdf"; + } + + String nomeDoArquivoDeSaidaDoEbook = cmd.getOptionValue("output"); + if (nomeDoArquivoDeSaidaDoEbook != null) { + arquivoDeSaida = Paths.get(nomeDoArquivoDeSaidaDoEbook); + if (Files.exists(arquivoDeSaida) && Files.isDirectory(arquivoDeSaida)) { + throw new RuntimeException(nomeDoArquivoDeSaidaDoEbook + " é um diretório."); + } + } else { + arquivoDeSaida = Paths.get("book." + formato.toLowerCase()); + } + + modoVerboso = cmd.hasOption("verbose"); + } + + public Path getDiretorioDosMD() { + return diretorioDosMD; + } + + public String getFormato() { + return formato; + } + + public Path getArquivoDeSaida() { + return arquivoDeSaida; + } + + public boolean isModoVerboso() { + return modoVerboso; + } +} diff --git a/src/main/java/cotuba/Main.java b/src/main/java/cotuba/Main.java index a1dcd2a..efa8a5f 100644 --- a/src/main/java/cotuba/Main.java +++ b/src/main/java/cotuba/Main.java @@ -1,28 +1,5 @@ package cotuba; -import java.io.IOException; -import java.nio.file.FileSystems; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.PathMatcher; -import java.nio.file.Paths; -import java.util.List; -import java.util.stream.Stream; - -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.DefaultParser; -import org.apache.commons.cli.HelpFormatter; -import org.apache.commons.cli.Option; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.ParseException; -import org.commonmark.node.AbstractVisitor; -import org.commonmark.node.Heading; -import org.commonmark.node.Node; -import org.commonmark.node.Text; -import org.commonmark.parser.Parser; -import org.commonmark.renderer.html.HtmlRenderer; - import com.itextpdf.html2pdf.HtmlConverter; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfWriter; @@ -31,212 +8,160 @@ import com.itextpdf.layout.element.IBlockElement; import com.itextpdf.layout.element.IElement; import com.itextpdf.layout.property.AreaBreakType; - import nl.siegmann.epublib.domain.Book; import nl.siegmann.epublib.domain.Resource; import nl.siegmann.epublib.epub.EpubWriter; import nl.siegmann.epublib.service.MediatypeService; +import org.commonmark.node.AbstractVisitor; +import org.commonmark.node.Heading; +import org.commonmark.node.Node; +import org.commonmark.node.Text; +import org.commonmark.parser.Parser; +import org.commonmark.renderer.html.HtmlRenderer; + +import java.io.IOException; +import java.nio.file.*; +import java.util.List; +import java.util.stream.Stream; public class Main { - public static void main(String[] args) { - Options options = new Options(); - - Option opcaoDeDiretorioDosMD = new Option("d", "dir", true, - "Diretório que contem os arquivos md. Default: diretório atual."); - options.addOption(opcaoDeDiretorioDosMD); - - Option opcaoDeFormatoDoEbook = new Option("f", "format", true, - "Formato de saída do ebook. Pode ser: pdf ou epub. Default: pdf"); - options.addOption(opcaoDeFormatoDoEbook); - - Option opcaoDeArquivoDeSaida = new Option("o", "output", true, - "Arquivo de saída do ebook. Default: book.{formato}."); - options.addOption(opcaoDeArquivoDeSaida); - - Option opcaoModoVerboso = new Option("v", "verbose", false, - "Habilita modo verboso."); - options.addOption(opcaoModoVerboso); - - CommandLineParser cmdParser = new DefaultParser(); - HelpFormatter ajuda = new HelpFormatter(); - CommandLine cmd; - - try { - cmd = cmdParser.parse(options, args); - } catch (ParseException e) { - System.err.println(e.getMessage()); - ajuda.printHelp("cotuba", options); - System.exit(1); - return; - } - - Path diretorioDosMD; - String formato; - Path arquivoDeSaida; - boolean modoVerboso = false; - - try { - - String nomeDoDiretorioDosMD = cmd.getOptionValue("dir"); - - if (nomeDoDiretorioDosMD != null) { - diretorioDosMD = Paths.get(nomeDoDiretorioDosMD); - if (!Files.isDirectory(diretorioDosMD)) { - throw new RuntimeException(nomeDoDiretorioDosMD + " não é um diretório."); - } - } else { - Path diretorioAtual = Paths.get(""); - diretorioDosMD = diretorioAtual; - } - - String nomeDoFormatoDoEbook = cmd.getOptionValue("format"); - - if (nomeDoFormatoDoEbook != null) { - formato = nomeDoFormatoDoEbook.toLowerCase(); - } else { - formato = "pdf"; - } - - String nomeDoArquivoDeSaidaDoEbook = cmd.getOptionValue("output"); - if (nomeDoArquivoDeSaidaDoEbook != null) { - arquivoDeSaida = Paths.get(nomeDoArquivoDeSaidaDoEbook); - if (Files.exists(arquivoDeSaida) && Files.isDirectory(arquivoDeSaida)) { - throw new RuntimeException(nomeDoArquivoDeSaidaDoEbook + " é um diretório."); - } - } else { - arquivoDeSaida = Paths.get("book." + formato.toLowerCase()); - } - - modoVerboso = cmd.hasOption("verbose"); - - if ("pdf".equals(formato)) { - try(PdfWriter writer = new PdfWriter(Files.newOutputStream(arquivoDeSaida)); - PdfDocument pdf = new PdfDocument(writer); - Document pdfDocument = new Document(pdf)) { - - PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:**/*.md"); - try (Stream arquivosMD = Files.list(diretorioDosMD)) { - arquivosMD - .filter(matcher::matches) - .sorted() - .forEach(arquivoMD -> { - Parser parser = Parser.builder().build(); - Node document = null; - try { - document = parser.parseReader(Files.newBufferedReader(arquivoMD)); - document.accept(new AbstractVisitor() { - @Override - public void visit(Heading heading) { - if (heading.getLevel() == 1) { - // capítulo - String tituloDoCapitulo = ((Text) heading.getFirstChild()).getLiteral(); - // TODO: usar título do capítulo - } else if (heading.getLevel() == 2) { - // seção - } else if (heading.getLevel() == 3) { - // título - } - } - - }); - } catch (Exception ex) { - throw new RuntimeException("Erro ao fazer parse do arquivo " + arquivoMD, ex); - } - - try { - HtmlRenderer renderer = HtmlRenderer.builder().build(); - String html = renderer.render(document); - - List convertToElements = HtmlConverter.convertToElements(html); - for (IElement element : convertToElements) { - pdfDocument.add((IBlockElement) element); - } - // TODO: não adicionar página depois do último capítulo - pdfDocument.add(new AreaBreak(AreaBreakType.NEXT_PAGE)); - - } catch (Exception ex) { - throw new RuntimeException("Erro ao renderizar para HTML o arquivo " + arquivoMD, ex); - } - - }); - } catch (IOException ex) { - throw new RuntimeException( - "Erro tentando encontrar arquivos .md em " + diretorioDosMD.toAbsolutePath(), ex); - } - - } catch (Exception ex) { - throw new RuntimeException("Erro ao criar arquivo PDF: " + arquivoDeSaida.toAbsolutePath(), ex); - } - - } else if ("epub".equals(formato)) { - Book epub = new Book(); - - PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:**/*.md"); - try (Stream arquivosMD = Files.list(diretorioDosMD)) { - arquivosMD - .filter(matcher::matches) - .sorted() - .forEach(arquivoMD -> { - Parser parser = Parser.builder().build(); - Node document = null; - try { - document = parser.parseReader(Files.newBufferedReader(arquivoMD)); - document.accept(new AbstractVisitor() { - @Override - public void visit(Heading heading) { - if (heading.getLevel() == 1) { - // capítulo - String tituloDoCapitulo = ((Text) heading.getFirstChild()).getLiteral(); - // TODO: usar título do capítulo - } else if (heading.getLevel() == 2) { - // seção - } else if (heading.getLevel() == 3) { - // título - } - } - - }); - } catch (Exception ex) { - throw new RuntimeException("Erro ao fazer parse do arquivo " + arquivoMD, ex); - } - - try { - HtmlRenderer renderer = HtmlRenderer.builder().build(); - String html = renderer.render(document); - - // TODO: usar título do capítulo - epub.addSection("Capítulo", new Resource(html.getBytes(), MediatypeService.XHTML)); - - } catch (Exception ex) { - throw new RuntimeException("Erro ao renderizar para HTML o arquivo " + arquivoMD, ex); - } - }); - } catch (IOException ex) { - throw new RuntimeException( - "Erro tentando encontrar arquivos .md em " + diretorioDosMD.toAbsolutePath(), ex); - } - - EpubWriter epubWriter = new EpubWriter(); - - try { - epubWriter.write(epub, Files.newOutputStream(arquivoDeSaida)); - } catch (IOException ex) { - throw new RuntimeException("Erro ao criar arquivo EPUB: " + arquivoDeSaida.toAbsolutePath(), ex); - } - } else { - throw new RuntimeException("Formato do ebook inválido: " + formato); - } - - System.out.println("Arquivo gerado com sucesso: " + arquivoDeSaida); - - } catch (Exception ex) { - System.err.println(ex.getMessage()); - if (modoVerboso) { - ex.printStackTrace(); - } - System.exit(1); - } - } - -} + public static void main(String[] args) { + LeitorOpcoesCLI leitorOpcoesCLI = new LeitorOpcoesCLI(args); + + Path diretorioDosMD = leitorOpcoesCLI.getDiretorioDosMD(); + String formato = leitorOpcoesCLI.getFormato(); + Path arquivoDeSaida = leitorOpcoesCLI.getArquivoDeSaida(); + boolean modoVerboso = leitorOpcoesCLI.isModoVerboso(); + + try { + if ("pdf".equals(formato)) { + try (PdfWriter writer = new PdfWriter(Files.newOutputStream(arquivoDeSaida)); + PdfDocument pdf = new PdfDocument(writer); + Document pdfDocument = new Document(pdf)) { + + PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:**/*.md"); + try (Stream arquivosMD = Files.list(diretorioDosMD)) { + arquivosMD + .filter(matcher::matches) + .sorted() + .forEach(arquivoMD -> { + Parser parser = Parser.builder().build(); + Node document = null; + try { + document = parser.parseReader(Files.newBufferedReader(arquivoMD)); + document.accept(new AbstractVisitor() { + @Override + public void visit(Heading heading) { + if (heading.getLevel() == 1) { + // capítulo + String tituloDoCapitulo = ((Text) heading.getFirstChild()).getLiteral(); + // TODO: usar título do capítulo + } else if (heading.getLevel() == 2) { + // seção + } else if (heading.getLevel() == 3) { + // título + } + } + + }); + } catch (Exception ex) { + throw new RuntimeException("Erro ao fazer parse do arquivo " + arquivoMD, ex); + } + + try { + HtmlRenderer renderer = HtmlRenderer.builder().build(); + String html = renderer.render(document); + + List convertToElements = HtmlConverter.convertToElements(html); + for (IElement element : convertToElements) { + pdfDocument.add((IBlockElement) element); + } + // TODO: não adicionar página depois do último capítulo + pdfDocument.add(new AreaBreak(AreaBreakType.NEXT_PAGE)); + + } catch (Exception ex) { + throw new RuntimeException("Erro ao renderizar para HTML o arquivo " + arquivoMD, ex); + } + + }); + } catch (IOException ex) { + throw new RuntimeException( + "Erro tentando encontrar arquivos .md em " + diretorioDosMD.toAbsolutePath(), ex); + } + + } catch (Exception ex) { + throw new RuntimeException("Erro ao criar arquivo PDF: " + arquivoDeSaida.toAbsolutePath(), ex); + } + + } else if ("epub".equals(formato)) { + Book epub = new Book(); + + PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:**/*.md"); + try (Stream arquivosMD = Files.list(diretorioDosMD)) { + arquivosMD + .filter(matcher::matches) + .sorted() + .forEach(arquivoMD -> { + Parser parser = Parser.builder().build(); + Node document = null; + try { + document = parser.parseReader(Files.newBufferedReader(arquivoMD)); + document.accept(new AbstractVisitor() { + @Override + public void visit(Heading heading) { + if (heading.getLevel() == 1) { + // capítulo + String tituloDoCapitulo = ((Text) heading.getFirstChild()).getLiteral(); + // TODO: usar título do capítulo + } else if (heading.getLevel() == 2) { + // seção + } else if (heading.getLevel() == 3) { + // título + } + } + + }); + } catch (Exception ex) { + throw new RuntimeException("Erro ao fazer parse do arquivo " + arquivoMD, ex); + } + + try { + HtmlRenderer renderer = HtmlRenderer.builder().build(); + String html = renderer.render(document); + + // TODO: usar título do capítulo + epub.addSection("Capítulo", new Resource(html.getBytes(), MediatypeService.XHTML)); + + } catch (Exception ex) { + throw new RuntimeException("Erro ao renderizar para HTML o arquivo " + arquivoMD, ex); + } + }); + } catch (IOException ex) { + throw new RuntimeException( + "Erro tentando encontrar arquivos .md em " + diretorioDosMD.toAbsolutePath(), ex); + } + + EpubWriter epubWriter = new EpubWriter(); + + try { + epubWriter.write(epub, Files.newOutputStream(arquivoDeSaida)); + } catch (IOException ex) { + throw new RuntimeException("Erro ao criar arquivo EPUB: " + arquivoDeSaida.toAbsolutePath(), ex); + } + } else { + throw new RuntimeException("Formato do ebook inválido: " + formato); + } + + System.out.println("Arquivo gerado com sucesso: " + arquivoDeSaida); + + } catch (Exception ex) { + System.err.println(ex.getMessage()); + if (modoVerboso) { + ex.printStackTrace(); + } + System.exit(1); + } + } + +} \ No newline at end of file From f9e567251f46984e808af54bdd9408f8b72ed251 Mon Sep 17 00:00:00 2001 From: Felipe Moreno Borges Date: Thu, 9 Jul 2020 17:11:07 -0300 Subject: [PATCH 2/2] Refatorando leitor comandos --- src/main/java/cotuba/CommandLineOptions.java | 24 ++++++++++++++ src/main/java/cotuba/LeitorOpcoesCLI.java | 35 ++++++++++---------- 2 files changed, 42 insertions(+), 17 deletions(-) create mode 100644 src/main/java/cotuba/CommandLineOptions.java diff --git a/src/main/java/cotuba/CommandLineOptions.java b/src/main/java/cotuba/CommandLineOptions.java new file mode 100644 index 0000000..918478b --- /dev/null +++ b/src/main/java/cotuba/CommandLineOptions.java @@ -0,0 +1,24 @@ +package cotuba; + +import org.apache.commons.cli.Option; + +public enum CommandLineOptions { + DIR(new Option("d", "dir", true, + "Diretório que contem os arquivos md. Default: diretório atual.")), + FORMAT(new Option("f", "format", true, + "Formato de saída do ebook. Pode ser: pdf ou epub. Default: pdf")), + OUTPUT(new Option("o", "output", true, + "Arquivo de saída do ebook. Default: book.{formato}.")), + VERBOSE(new Option("o", "output", true, + "Arquivo de saída do ebook. Default: book.{formato}.")); + + private Option option; + + CommandLineOptions(Option option) { + this.option = option; + } + + public Option getOption() { + return this.option; + } +} diff --git a/src/main/java/cotuba/LeitorOpcoesCLI.java b/src/main/java/cotuba/LeitorOpcoesCLI.java index 0e7ef8d..b39d259 100644 --- a/src/main/java/cotuba/LeitorOpcoesCLI.java +++ b/src/main/java/cotuba/LeitorOpcoesCLI.java @@ -14,23 +14,7 @@ public class LeitorOpcoesCLI { boolean modoVerboso = false; LeitorOpcoesCLI(String[] args) { - Options options = new Options(); - - Option opcaoDeDiretorioDosMD = new Option("d", "dir", true, - "Diretório que contem os arquivos md. Default: diretório atual."); - options.addOption(opcaoDeDiretorioDosMD); - - Option opcaoDeFormatoDoEbook = new Option("f", "format", true, - "Formato de saída do ebook. Pode ser: pdf ou epub. Default: pdf"); - options.addOption(opcaoDeFormatoDoEbook); - - Option opcaoDeArquivoDeSaida = new Option("o", "output", true, - "Arquivo de saída do ebook. Default: book.{formato}."); - options.addOption(opcaoDeArquivoDeSaida); - - Option opcaoModoVerboso = new Option("v", "verbose", false, - "Habilita modo verboso."); - options.addOption(opcaoModoVerboso); + Options options = initializeOptions(); CommandLineParser cmdParser = new DefaultParser(); HelpFormatter ajuda = new HelpFormatter(); @@ -78,6 +62,23 @@ public class LeitorOpcoesCLI { modoVerboso = cmd.hasOption("verbose"); } + private Options initializeOptions() { + Options options = new Options(); + + Option opcaoDeDiretorioDosMD = CommandLineOptions.DIR.getOption(); + options.addOption(opcaoDeDiretorioDosMD); + + Option opcaoDeFormatoDoEbook = CommandLineOptions.FORMAT.getOption(); + options.addOption(opcaoDeFormatoDoEbook); + + Option opcaoDeArquivoDeSaida = CommandLineOptions.OUTPUT.getOption(); + options.addOption(opcaoDeArquivoDeSaida); + + Option opcaoModoVerboso = CommandLineOptions.VERBOSE.getOption(); + options.addOption(opcaoModoVerboso); + return options; + } + public Path getDiretorioDosMD() { return diretorioDosMD; }