├── .gitmodules ├── changelogs ├── releases │ ├── .gitkeep │ ├── 19.7.2.md │ ├── 19.7.md │ ├── 19.7.3.md │ ├── 19.06.md │ └── 20.7.13.md ├── unreleased │ └── .gitkeep ├── header.txt ├── template.yml └── codelog.yml ├── spec ├── monografias │ └── ludico │ │ └── referencias.bib ├── formulario-pdf │ ├── campo-multi-linhas.odt │ ├── fdf │ │ └── gerar-folha-de-aprovacao.fdf │ ├── campo-multi-linhas-preenchido-com-evince.pdf │ └── campo-multi-linhas-preenchido-com-pdf-xchange.pdf ├── dependencias │ ├── texlive-abntex2.profile │ └── latex_spec.rb ├── latex │ ├── exemplo-pequeno-latex │ │ └── imagens │ │ │ ├── passaro.jpg │ │ │ ├── questionario_BRA_2006_Untrans_Portuguese.pdf │ │ │ └── Buzz-e-Rex-Jogando-Videogame-Toy-Story_1920x1080.jpg │ ├── simple-abntex.tex │ ├── exemplo-minimo │ │ └── xxx-Monografia.tex │ └── exemplo-minimo-com-acentos │ │ └── xxx-Monografia.tex ├── limarka_spec.rb ├── spec_helper.rb ├── simbolos_spec.rb ├── configuracao_padrao │ └── configuracao.yaml ├── cronograma_spec.rb ├── simples_spec.rb ├── lista_ilustracoes_spec.rb ├── preambulo_spec.rb ├── lista_tabelas_spec.rb ├── cli_spec.rb ├── conversor_spec.rb ├── errata_spec.rb ├── check_spec.rb ├── apendices_spec.rb ├── capa_spec.rb ├── anexos_spec.rb ├── sumario_spec.rb ├── pdfconf.rb ├── exemplos_spec.rb ├── referencias_spec.rb ├── siglas_spec.rb ├── folha_aprovacao_spec.rb └── trabalho_spec.rb ├── .rspec ├── Gemfile ├── features ├── support │ ├── aruba.rb │ ├── env.rb │ └── hooks.rb ├── filtros.feature ├── formato.feature └── step_definitions │ └── passos.rb ├── imagens ├── passaro.jpg ├── configuracao │ ├── capa.png │ ├── errata.png │ ├── epigrafe.png │ ├── dedicatoria.png │ ├── agradecimentos.png │ ├── folha-de-rosto.png │ ├── lista-siglas.png │ ├── lista-simbolos.png │ ├── capitulos-e-secoes.png │ ├── folha-de-aprovacao.png │ ├── lista-nao-ordenada.png │ ├── consulta-vigencia-normas-abnt.png │ ├── lista-ordenada-numericamente1.png │ ├── trabalho-academico-elementos.png │ ├── lista-ordenada-por-letras-ponto.png │ ├── lista-ordenada-por-letras-parentese.png │ └── mapa-arquivos.mm ├── ficha-catalografica.odt ├── ficha-catalografica.pdf └── folha-de-aprovacao-escaneada.pdf ├── bin ├── test ├── instaladores │ ├── dependencias_desenvolvimento_install.sh │ ├── dependencias_execucao_install.sh │ ├── pandoc_install.sh │ └── tinytex_install.sh ├── build-docker.sh ├── console ├── setup ├── deploy-docker.sh └── instalador.sh ├── lib ├── limarka │ ├── version.rb │ ├── check.rb │ ├── configuracao.rb │ ├── ref.rb │ ├── cronograma.rb │ ├── pdfconf_remover.rb │ ├── trabalho.rb │ └── conversor.rb └── limarka.rb ├── containers ├── limarka.dockerfile ├── ruby-latex-pandoc.dockerfile └── alphine-ruby-latex-pandoc.dockerfile ├── test └── filtros │ ├── lua │ └── filtro.lua │ └── ruby │ └── filtro.rb ├── ISSUE_TEMPLATE.md ├── exe └── limarka ├── .github └── FUNDING.yml ├── rakelib └── guard.rake ├── docs └── paper │ ├── codemeta.json │ ├── paper.bib │ ├── paper.md │ ├── open-canvas.md │ └── generate ├── LICENSE ├── limarka.gemspec ├── Rakefile ├── .gitignore ├── .travis.yml ├── CODE_OF_CONDUCT.md ├── README.md ├── CONTRIBUTING.md └── referencias.bib /.gitmodules: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /changelogs/releases/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /changelogs/unreleased/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /spec/monografias/ludico/referencias.bib: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.rspec: -------------------------------------------------------------------------------- 1 | --format documentation 2 | --color 3 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | gemspec 4 | -------------------------------------------------------------------------------- /features/support/aruba.rb: -------------------------------------------------------------------------------- 1 | require 'aruba/cucumber' 2 | -------------------------------------------------------------------------------- /imagens/passaro.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abntex/limarka/HEAD/imagens/passaro.jpg -------------------------------------------------------------------------------- /features/support/env.rb: -------------------------------------------------------------------------------- 1 | require './spec/spec_helper' 2 | require 'cucumber/rspec/doubles' 3 | -------------------------------------------------------------------------------- /imagens/configuracao/capa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abntex/limarka/HEAD/imagens/configuracao/capa.png -------------------------------------------------------------------------------- /bin/test: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -e 4 | 5 | echo "===> Executa os testes rápidos..." 6 | rake spec 7 | -------------------------------------------------------------------------------- /imagens/configuracao/errata.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abntex/limarka/HEAD/imagens/configuracao/errata.png -------------------------------------------------------------------------------- /imagens/ficha-catalografica.odt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abntex/limarka/HEAD/imagens/ficha-catalografica.odt -------------------------------------------------------------------------------- /imagens/ficha-catalografica.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abntex/limarka/HEAD/imagens/ficha-catalografica.pdf -------------------------------------------------------------------------------- /lib/limarka/version.rb: -------------------------------------------------------------------------------- 1 | module Limarka 2 | # O Versionamento é ano e mês 3 | VERSION = "20.7.13" 4 | end 5 | -------------------------------------------------------------------------------- /imagens/configuracao/epigrafe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abntex/limarka/HEAD/imagens/configuracao/epigrafe.png -------------------------------------------------------------------------------- /imagens/configuracao/dedicatoria.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abntex/limarka/HEAD/imagens/configuracao/dedicatoria.png -------------------------------------------------------------------------------- /imagens/configuracao/agradecimentos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abntex/limarka/HEAD/imagens/configuracao/agradecimentos.png -------------------------------------------------------------------------------- /imagens/configuracao/folha-de-rosto.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abntex/limarka/HEAD/imagens/configuracao/folha-de-rosto.png -------------------------------------------------------------------------------- /imagens/configuracao/lista-siglas.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abntex/limarka/HEAD/imagens/configuracao/lista-siglas.png -------------------------------------------------------------------------------- /imagens/configuracao/lista-simbolos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abntex/limarka/HEAD/imagens/configuracao/lista-simbolos.png -------------------------------------------------------------------------------- /imagens/folha-de-aprovacao-escaneada.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abntex/limarka/HEAD/imagens/folha-de-aprovacao-escaneada.pdf -------------------------------------------------------------------------------- /imagens/configuracao/capitulos-e-secoes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abntex/limarka/HEAD/imagens/configuracao/capitulos-e-secoes.png -------------------------------------------------------------------------------- /imagens/configuracao/folha-de-aprovacao.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abntex/limarka/HEAD/imagens/configuracao/folha-de-aprovacao.png -------------------------------------------------------------------------------- /imagens/configuracao/lista-nao-ordenada.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abntex/limarka/HEAD/imagens/configuracao/lista-nao-ordenada.png -------------------------------------------------------------------------------- /spec/formulario-pdf/campo-multi-linhas.odt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abntex/limarka/HEAD/spec/formulario-pdf/campo-multi-linhas.odt -------------------------------------------------------------------------------- /spec/dependencias/texlive-abntex2.profile: -------------------------------------------------------------------------------- 1 | selected_scheme scheme-full 2 | option_letter 0 3 | portable 0 4 | option_doc 0 5 | option_src 0 6 | -------------------------------------------------------------------------------- /bin/instaladores/dependencias_desenvolvimento_install.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | apt-get install -y -qq \ 4 | pdfgrep \ 5 | poppler-utils 6 | -------------------------------------------------------------------------------- /imagens/configuracao/consulta-vigencia-normas-abnt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abntex/limarka/HEAD/imagens/configuracao/consulta-vigencia-normas-abnt.png -------------------------------------------------------------------------------- /imagens/configuracao/lista-ordenada-numericamente1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abntex/limarka/HEAD/imagens/configuracao/lista-ordenada-numericamente1.png -------------------------------------------------------------------------------- /imagens/configuracao/trabalho-academico-elementos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abntex/limarka/HEAD/imagens/configuracao/trabalho-academico-elementos.png -------------------------------------------------------------------------------- /spec/formulario-pdf/fdf/gerar-folha-de-aprovacao.fdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abntex/limarka/HEAD/spec/formulario-pdf/fdf/gerar-folha-de-aprovacao.fdf -------------------------------------------------------------------------------- /spec/latex/exemplo-pequeno-latex/imagens/passaro.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abntex/limarka/HEAD/spec/latex/exemplo-pequeno-latex/imagens/passaro.jpg -------------------------------------------------------------------------------- /imagens/configuracao/lista-ordenada-por-letras-ponto.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abntex/limarka/HEAD/imagens/configuracao/lista-ordenada-por-letras-ponto.png -------------------------------------------------------------------------------- /imagens/configuracao/lista-ordenada-por-letras-parentese.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abntex/limarka/HEAD/imagens/configuracao/lista-ordenada-por-letras-parentese.png -------------------------------------------------------------------------------- /spec/formulario-pdf/campo-multi-linhas-preenchido-com-evince.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abntex/limarka/HEAD/spec/formulario-pdf/campo-multi-linhas-preenchido-com-evince.pdf -------------------------------------------------------------------------------- /spec/limarka_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe Limarka do 4 | it 'has a version number' do 5 | expect(Limarka::VERSION).not_to be nil 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /changelogs/header.txt: -------------------------------------------------------------------------------- 1 | Todas as mudanças relevantes deste projeto serão documentadas neste arquivo. 2 | O formato é baseado em [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). 3 | -------------------------------------------------------------------------------- /spec/formulario-pdf/campo-multi-linhas-preenchido-com-pdf-xchange.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abntex/limarka/HEAD/spec/formulario-pdf/campo-multi-linhas-preenchido-com-pdf-xchange.pdf -------------------------------------------------------------------------------- /changelogs/releases/19.7.2.md: -------------------------------------------------------------------------------- 1 | ## 19.7.2 - 2019-07-03 2 | ### Deprecated 3 | - Comando 'check' será removido em breve 4 | 5 | ### Correções 6 | - `help exec` passou a mostrar os parâmetros dos filtros. 7 | 8 | --- 9 | -------------------------------------------------------------------------------- /spec/latex/exemplo-pequeno-latex/imagens/questionario_BRA_2006_Untrans_Portuguese.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abntex/limarka/HEAD/spec/latex/exemplo-pequeno-latex/imagens/questionario_BRA_2006_Untrans_Portuguese.pdf -------------------------------------------------------------------------------- /containers/limarka.dockerfile: -------------------------------------------------------------------------------- 1 | FROM ruby-latex-pandoc 2 | 3 | RUN gem install limarka 4 | 5 | VOLUME ["/trabalho"] 6 | WORKDIR /trabalho 7 | 8 | CMD ["--help"] 9 | ENTRYPOINT ["/usr/local/bundle/bin/limarka"] 10 | -------------------------------------------------------------------------------- /changelogs/releases/19.7.md: -------------------------------------------------------------------------------- 1 | ## 19.7 - 2019-07-02 2 | ### Melhorias implementadas 3 | - Possível utilizar filtros pandoc através das opções --filtros ou --filtros-lua [\#158](https://github.com/abntex/limarka/issues/158) 4 | 5 | --- 6 | -------------------------------------------------------------------------------- /features/support/hooks.rb: -------------------------------------------------------------------------------- 1 | # https://cucumber.io/docs/cucumber/api/ 2 | 3 | 4 | Before do 5 | FileUtils.rm_rf File.join('tmp', 'cucumber') 6 | @inicio = Dir.pwd 7 | end 8 | After do 9 | Dir.chdir(@inicio) 10 | end 11 | -------------------------------------------------------------------------------- /lib/limarka.rb: -------------------------------------------------------------------------------- 1 | require "limarka/version" 2 | require "limarka/cli" 3 | require "limarka/trabalho" 4 | require "limarka/cronograma" 5 | require "limarka/check" 6 | 7 | module Limarka 8 | # Your code goes here... 9 | end 10 | -------------------------------------------------------------------------------- /spec/latex/exemplo-pequeno-latex/imagens/Buzz-e-Rex-Jogando-Videogame-Toy-Story_1920x1080.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abntex/limarka/HEAD/spec/latex/exemplo-pequeno-latex/imagens/Buzz-e-Rex-Jogando-Videogame-Toy-Story_1920x1080.jpg -------------------------------------------------------------------------------- /test/filtros/lua/filtro.lua: -------------------------------------------------------------------------------- 1 | function expand_hello_world(inline) 2 | if inline.c == '{{mundo}}' then 3 | return pandoc.Emph{ pandoc.Str "Olá mundo!" } 4 | else 5 | return inline 6 | end 7 | end 8 | 9 | return {{Str = expand_hello_world}} 10 | -------------------------------------------------------------------------------- /bin/build-docker.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | # $1: limarka version 3 | echo "Gerando imagem do limarka..." 4 | docker build -t ruby-latex-pandoc . -f containers/ruby-latex-pandoc.dockerfile 5 | docker build -t limarka - < containers/limarka.dockerfile 6 | docker images 7 | -------------------------------------------------------------------------------- /ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | **Comportamento esperado**: 2 | 3 | 4 | **Passos para reprodução**: 5 | 6 | 7 | **Especificações do sistema**: 8 | 9 | 11 | -------------------------------------------------------------------------------- /exe/limarka: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | # Para corrigir os problemas de codificação no Windows #98 4 | Encoding.default_external = Encoding::UTF_8 5 | Encoding.default_internal = Encoding::UTF_8 6 | 7 | require "limarka" 8 | require "limarka/cli" 9 | 10 | Limarka::Cli.start(ARGV) 11 | -------------------------------------------------------------------------------- /bin/console: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | require "bundler/setup" 4 | require "limarka" 5 | 6 | # You can add fixtures and/or initialization code here to make experimenting 7 | # with your gem easier. You can also use a different console, if you like. 8 | 9 | # (If you use this, don't forget to add pry to your Gemfile!) 10 | # require "pry" 11 | # Pry.start 12 | 13 | require "irb" 14 | IRB.start 15 | -------------------------------------------------------------------------------- /bin/instaladores/dependencias_execucao_install.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # Algumas dependencias de desenvolvimento são adicionadas, 4 | # as dapendencias dos gems do limarka precisam ser compilados. 5 | # https://github.com/travis-ci/travis.rb/issues/558 6 | 7 | apt-get install -y -qq \ 8 | gcc \ 9 | libffi-dev \ 10 | libfontconfig \ 11 | locales \ 12 | make \ 13 | perl-doc \ 14 | ruby-dev \ 15 | unzip \ 16 | wget 17 | -------------------------------------------------------------------------------- /bin/instaladores/pandoc_install.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | quiet=0 4 | PANDOC_DEB=https://github.com/jgm/pandoc/releases/download/2.10/pandoc-2.10-1-amd64.deb 5 | 6 | while getopts "q" opt; do 7 | case $opt in 8 | q) 9 | quiet=1 10 | ;; 11 | esac 12 | done 13 | 14 | if [ $quiet eq 1 ]; then 15 | wget -nv $PANDOC_DEB 16 | else 17 | wget -c $PANDOC_DEB 18 | fi 19 | 20 | dpkg -i pandoc-*.deb && rm pandoc-*.deb 21 | -------------------------------------------------------------------------------- /test/filtros/ruby/filtro.rb: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # Capitalize the first N characters of a paragraph 3 | require "paru/filter" 4 | 5 | END_CAPITAL = 10 6 | Paru::Filter.run do 7 | with "Header +1 Para" do |p| 8 | text = p.inner_markdown 9 | first_line = text.slice(0, END_CAPITAL).upcase 10 | rest = text.slice(END_CAPITAL, text.size) 11 | p.inner_markdown = first_line + rest 12 | end 13 | end 14 | 15 | -------------------------------------------------------------------------------- /changelogs/template.yml: -------------------------------------------------------------------------------- 1 | "Melhorias implementadas": 2 | - Nova funcionalidade implementada 3 | 4 | "Mudanças": 5 | - Novo comportamento 6 | 7 | "Deprecated": 8 | - Funcionalidades que serão removidas em breve 9 | 10 | "Removido": 11 | - Funcionalidades que serão removidas 12 | 13 | "Correções": 14 | - Alterações em código com erro 15 | 16 | "Segurança": 17 | - Mudanças que corrigem vulnerabilidade 18 | 19 | "Deploy notes": 20 | - Mudanças que impactam no processo de implantação 21 | -------------------------------------------------------------------------------- /changelogs/codelog.yml: -------------------------------------------------------------------------------- 1 | # Changelog Header ------------------------------------------------- 2 | 3 | header_textfile: changelogs/header.txt 4 | default_changelog_filename: CHANGELOG.md 5 | 6 | # Tag formatting --------------------------------------------------- 7 | 8 | version_prefix: "" 9 | version_suffix: "" 10 | date_prefix: "" 11 | 12 | # Date formatting -------------------------------------------------- 13 | 14 | show_date: true 15 | date_input_format: "%Y-%m-%d" 16 | date_output_format: "%Y-%m-%d" -------------------------------------------------------------------------------- /changelogs/releases/19.7.3.md: -------------------------------------------------------------------------------- 1 | ## 19.7.3 - 2019-07-05 2 | ### Removido 3 | - Remoção da opção de upgrade do pdf (que nunca foi implementada) 4 | 5 | ### Mudanças 6 | - Arquivos `latexcustomizacao.sty` e referencias passaram a ser opcionais - [#194](https://github.com/abntex/limarka/issues/194) 7 | 8 | ### Melhorias implementadas 9 | - Agora é possível ativar [outras extensões do pandoc](https://pandoc.org/MANUAL.html#non-pandoc-extensions) - [#63](https://github.com/abntex/limarka/issues/63) 10 | 11 | --- 12 | -------------------------------------------------------------------------------- /bin/setup: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -euo pipefail 3 | IFS=$'\n\t' 4 | set -vx 5 | 6 | bundle install 7 | 8 | # Do any other automated setup that you need to do here 9 | 10 | # Baixando modelo-oficial 11 | git clone https://github.com/abntex/trabalho-academico-limarka.git modelo-oficial 12 | # git clone git@github.com:abntex/trabalho-academico-limarka.git modelo-oficial 13 | 14 | 15 | # tlmgr update --self --all 16 | # tlmgr path add 17 | # fmtutil-sys --all 18 | 19 | # sudo apt-get install xzdec 20 | # tlmgr install memoir abntex2 lm latex lastpage tools graphics microtype lipsum hyperref pdfpages caption 21 | 22 | # docker: https://docs.docker.com/install/linux/docker-ce/ubuntu/ 23 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: limarka 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | -------------------------------------------------------------------------------- /rakelib/guard.rake: -------------------------------------------------------------------------------- 1 | ERB_TEMPLATE = <<~HEREDOC 2 | guard :shell do 3 | <% all_tasks.each do |t, files| %> 4 | watch(%r{^(<%= files.join('|') %>)$}) do |m| 5 | system("rake <%= t %>") 6 | end 7 | <% end %> 8 | end 9 | HEREDOC 10 | 11 | desc "Generates a Guardfile from Rake tasks" 12 | task :guard do 13 | app = Rake::application 14 | app.init 15 | app.load_rakefile 16 | 17 | all_tasks = {} 18 | app.tasks.each do |t| 19 | t.sources.each do |src| 20 | if File.file?(src) then 21 | all_tasks[t.name] = [] unless all_tasks[t.name] 22 | all_tasks[t.name] << src 23 | end 24 | end 25 | end 26 | template = ERB.new(ERB_TEMPLATE) 27 | File.write('Guardfile', template.result(binding)) 28 | end 29 | -------------------------------------------------------------------------------- /spec/latex/simple-abntex.tex: -------------------------------------------------------------------------------- 1 | \documentclass{abntex2} 2 | 3 | \usepackage{etoolbox} 4 | \usepackage[numbers,round,comma]{natbib} 5 | %\usepackage[num]{abntex2cite} 6 | 7 | \begin{document} 8 | 9 | \AtEndEnvironment{thebibliography}{ 10 | \bibitem{ABNT-citacao} ASSOCIAÇÃO BRASILEIRA DE NORMAS TÉCNICAS. {\emph ABNT NBR 6024:2012}: 11 | Informação e documentaçãao -- Apresentação de citações em documentos. Rio de Janeiro, 2002. 12 | } 13 | 14 | As normas da ABNT especificam que a citação pode ser numérica \cite{ABNT-citacao}. 15 | 16 | Cite from above \cite{extra1}. 17 | 18 | %\bibliographystyle{plainnat} 19 | 20 | \makeatletter 21 | \renewcommand\@biblabel[1]{#1} 22 | \makeatother 23 | \bibliographystyle{plain} 24 | \bibliography{master.bib} 25 | 26 | \end{document} 27 | -------------------------------------------------------------------------------- /docs/paper/codemeta.json: -------------------------------------------------------------------------------- 1 | { 2 | "@context": "https://raw.githubusercontent.com/mbjones/codemeta/master/codemeta.jsonld", 3 | "@type": "Code", 4 | "author": [ 5 | { 6 | "@id": "http://orcid.org/0000-0002-9165-9438", 7 | "@type": "Person", 8 | "email": "eduardo.ufpb@gmail.com", 9 | "name": "Eduardo de Santana Medeiros Alexandre", 10 | "affiliation": "Universidade Federal da Paraíba" 11 | } 12 | ], 13 | "identifier": "", 14 | "codeRepository": "https://github.com/abntex/limarka", 15 | "datePublished": "2016-12-08", 16 | "dateModified": "2016-12-08", 17 | "dateCreated": "2016-12-08", 18 | "description": "Limarka makes possible to write dissertation and thesis with Markdown and produces PDFs according to Brazilian's ABNT standard.", 19 | "keywords": "limarka,ABNT,markdown,dissertation,thesis", 20 | "license": "MIT", 21 | "title": "limarka", 22 | "version": "v0.6.5" 23 | } 24 | -------------------------------------------------------------------------------- /containers/ruby-latex-pandoc.dockerfile: -------------------------------------------------------------------------------- 1 | FROM ruby:2-slim 2 | 3 | LABEL maintainer="eduardo.ufpb@gmail.com" 4 | 5 | # Tentamos seguir as melhores práticas: 6 | # https://docs.docker.com/develop/develop-images/dockerfile_best-practices/ 7 | 8 | WORKDIR /tmp 9 | COPY bin/instaladores/dependencias_execucao_install.sh \ 10 | bin/instaladores/pandoc_install.sh \ 11 | bin/instaladores/tinytex_install.sh \ 12 | /tmp/ 13 | 14 | RUN apt-get update && /tmp/dependencias_execucao_install.sh 15 | 16 | # Instala tinytex (/root/.TinyTex) 17 | # e bibliotecas para o abntex2/limarka 18 | RUN IGNORE_CACHE=1 /tmp/tinytex_install.sh 19 | ENV PATH="/root/bin:~/.TinyTeX/bin/x86_64-linux:${PATH}" 20 | 21 | # Configurando o idioma português #175: https://hub.docker.com/_/debian/#locales 22 | RUN rm -rf /var/lib/apt/lists/* \ 23 | && localedef -i pt_BR -c -f UTF-8 -A /usr/share/locale/locale.alias pt_BR.UTF-8 24 | ENV LANG pt_BR.UTF8 25 | 26 | # Instalação do pandoc 27 | RUN /tmp/pandoc_install.sh 28 | -------------------------------------------------------------------------------- /bin/deploy-docker.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # $1: TAG 4 | # http://codewiki.wikidot.com/shell-script:if-else 5 | if [ -n "$1" ] 6 | then 7 | # Versionamento ANO.MÊS 8 | # https://semver.org/lang/pt-BR/ 9 | ANO=`echo $1|cut -f 1 -d '.'` 10 | MES=`echo $1|cut -f 2 -d '.'` 11 | rtptags="limarka/ruby-latex-pandoc limarka/ruby-latex-pandoc:$ANO limarka/ruby-latex-pandoc:$ANO.$MES" 12 | ltags="limarka/limarka limarka/limarka:$ANO limarka/limarka:$ANO.$MES" 13 | else 14 | rtptags="limarka/ruby-latex-pandoc:dev" 15 | ltags="limarka/limarka:dev" 16 | fi 17 | 18 | echo "Aplicando tags: $rtptags e $ltags" 19 | for tag in $rtptags 20 | do 21 | docker tag ruby-latex-pandoc "$tag" 22 | done 23 | for tag in $ltags 24 | do 25 | docker tag limarka "$tag" 26 | done 27 | 28 | echo "Publicando tags..." 29 | echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin 30 | for tag in $rtptags 31 | do 32 | docker push "$tag" 33 | done 34 | for tag in $ltags 35 | do 36 | docker push "$tag" 37 | done 38 | -------------------------------------------------------------------------------- /changelogs/releases/19.06.md: -------------------------------------------------------------------------------- 1 | ## 19.06 - 2019-06-22 2 | ### Melhorias implementadas 3 | - Otimização da execução dos testes no Travis através do cache com o TinyTex entre execuções. 4 | - Testes e deploys realizados em 2 stages no Travis (Otimização do tempo do teste e deploy) 5 | - Os testes automatizados geram [relatório de cobertura dos testes](https://coveralls.io/github/abntex/limarka) - [\#152](https://github.com/abntex/limarka/issues/152) 6 | 7 | ### Mudanças 8 | - Versionamento do limarka foi simplificado, agora utiliza ANO.MÊS (yy.d) para a versões oficiais, E ANO.MÊS-pre.NUMBER (yy.d-pre-n) para versões em desenvolvimento. Essa mudança permite o desenvolvimento mais ágil. 9 | - Novas imagens do docker passaram a ser geradas no processo de build. Imagens de desenvolvimento: `limarka/ruby-latex-pandoc:dev` e `limarka/limarka:dev` Imagens de release: `limarka/limarka`, `limarka/limarka:ANO` e `limarka/limarka:ANO.MES` 10 | - Gestão do changelog passou ser feito com o codelog - [\#191](https://github.com/abntex/limarka/issues/191) 11 | 12 | --- 13 | -------------------------------------------------------------------------------- /bin/instaladores/tinytex_install.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | if [ "$IGNORE_CACHE" != "1" ] && command -v tlmgr > /dev/null; then 4 | tex_em_cache=1 5 | echo TinyTeX não será instalado pois foi encontrado no cache. 6 | else 7 | # O mirror //linorg.usp.br/CTAN está muito lento, uilizando outro 8 | wget -qO- "https://yihui.name/gh/tinytex/tools/install-unx.sh" | CTAN_REPO=http://mirrors.rit.edu/CTAN/systems/texlive/tlnet sh 9 | tlmgr option repository http://mirrors.rit.edu/CTAN/systems/texlive/tlnet 10 | 11 | ~/bin/tlmgr --verify-repo=none install \ 12 | abntex2 \ 13 | babel-portuges \ 14 | biber \ 15 | biblatex \ 16 | biblatex-abnt \ 17 | bookmark \ 18 | caption \ 19 | enumitem \ 20 | epstopdf-pkg \ 21 | lastpage \ 22 | lipsum \ 23 | listings \ 24 | memoir \ 25 | microtype \ 26 | pdflscape \ 27 | pdfpages \ 28 | psnfss \ 29 | shipunov \ 30 | texliveonfly \ 31 | textcase \ 32 | xcolor 33 | ~/bin/tlmgr option -- autobackup 0 34 | fi 35 | -------------------------------------------------------------------------------- /docs/paper/paper.bib: -------------------------------------------------------------------------------- 1 | @online{Pandoc, 2 | author = {John MacFarlane}, 3 | title = {Pandoc a universal document converter}, 4 | year = 2007, 5 | url = {http://pandoc.org}, 6 | urldate = {2016-12-08} 7 | } 8 | 9 | @online{abnTeX2, 10 | author = {abnTeX}, 11 | title = {Classe LaTeX e estilo bibliográfico compatíveis com as normas da ABNT}, 12 | year = 2016, 13 | url = {http://www.abntex.net.br}, 14 | urldate = {2016-12-08} 15 | } 16 | 17 | @online{YAML, 18 | author = {YAML}, 19 | title = {YAML Ain't Markup Language}, 20 | year = 2001, 21 | url = {http://yaml.org}, 22 | urldate = {2016-12-08} 23 | } 24 | 25 | 26 | @online{form, 27 | author = {Richard Foersom}, 28 | title = {Create PDF Forms with LibreOffice}, 29 | year = 2016, 30 | url = {http://foersom.com/org/HowTo/CreatePdfForm.html}, 31 | urldate = {2016-12-08} 32 | } 33 | 34 | @manual{NBR14724:2011, 35 | Address = {Rio de Janeiro}, 36 | Org-Short = {ABNT}, 37 | Organization = {Associa{\c c}\~ao Brasileira de Normas T\'ecnicas}, 38 | Pages = 15, 39 | Title = {{NBR} 14724}, 40 | Year = 2011} 41 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Eduardo de Santana Medeiros Alexandre 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /changelogs/releases/20.7.13.md: -------------------------------------------------------------------------------- 1 | ## 20.7.13 - 2020-07-13 2 | ### Mudanças 3 | - Utilização de `biblatex-abnt` em vez de `abntex2-cite` por padrão 4 | - As configurações serão possíveis apenas a partir de arquivo YAML 5 | - Agora o nome do pdf gerado independe do tipo do trabalho. [#196](https://github.com/abntex/limarka/issues/196) 6 | 7 | ### Melhorias implementadas 8 | - Nova funcionalidade implementada 9 | - Inclusão de tarefa rake de desenvolvimento `rake codelog:new[funcionalidade]` 10 | - Configurando mirror de NY (mais rápido) para instalar o TinyTex 11 | 12 | ### Deprecated 13 | - Funcionalidades que serão removidas em breve 14 | - Opção `-y` será removida na próxima versão 15 | 16 | ### Removido 17 | - Arquivo de configuração em pdf [#169](https://github.com/abntex/limarka/issues/169) 18 | - Dependências de execução pdftk [#169](https://github.com/abntex/limarka/issues/169) 19 | - Dependências do clipboard [#169](https://github.com/abntex/limarka/issues/169) 20 | 21 | ### Correções 22 | - Alterações em código com erro 23 | 24 | ### Segurança 25 | - Mudanças que corrigem vulnerabilidade 26 | 27 | ### Deploy notes 28 | - Mudanças que impactam no processo de implantação 29 | - Problema com uso da opção `--filtro` 30 | 31 | --- 32 | -------------------------------------------------------------------------------- /spec/spec_helper.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__) 3 | require 'limarka' 4 | require 'yaml' 5 | require 'pry-byebug' 6 | 7 | # https://coveralls.io/github/abntex/limarka 8 | require 'coveralls' 9 | Coveralls.wear! 10 | 11 | def modelo_dir 12 | Dir.pwd + '/modelo-oficial' 13 | end 14 | 15 | def cria_copia_do_modelo(output_dir) 16 | FileUtils.rm_rf output_dir 17 | FileUtils.mkdir_p output_dir 18 | FileUtils.cp_r "#{modelo_dir}/imagens",output_dir 19 | FileUtils.cp_r "#{modelo_dir}/templates",output_dir 20 | end 21 | 22 | @configuracao_padrao = nil 23 | ## Para regerar o arquivo de configuração invoke rake configuracao_padrao 24 | def configuracao_padrao 25 | ## TODO: criar a configuracao padrão, caso não exista: invocar rake configuracao_padrao 26 | @configuracao_padrao = @configuracao_padrao or YAML.load_file('spec/configuracao_padrao/configuracao.yaml') 27 | end 28 | 29 | # Retorna o texto do pdf 30 | def pdftext(pdf_file) 31 | <<-PDF 32 | Citações podem ser numéricas (1). 33 | 34 | Referências 35 | 36 | 1 ASSOCIAÇÃO BRASILEIRA" 37 | PDF 38 | end 39 | 40 | 41 | def hash_to_yaml(h) 42 | s = StringIO.new 43 | s << h.to_yaml 44 | s << "---\n\n" 45 | s.string 46 | end 47 | -------------------------------------------------------------------------------- /features/filtros.feature: -------------------------------------------------------------------------------- 1 | # language: pt 2 | @extensao 3 | Funcionalidade: Utilizar filtros do pandoc 4 | 5 | Como usuário do limarka eu gostaria poder utilizar filtros pandoc 6 | para aprimorar o resultado produzido. 7 | 8 | Existem dois tipos de filtros: *executáveis* e *scripts lua*. 9 | 10 | Os filtros são executados através das opções `--filtros` e `--filtros-lua`. 11 | 12 | Contexto: 13 | Dado um diretório com o template oficial 14 | E arquivo configuracao.yaml com configuração padrão 15 | 16 | Cenário: chamando filtro executável (que torna os dez primeiros caracteres maiúsculas) 17 | Dado arquivo "trabalho-academico.md" com o seguinte conteúdo: 18 | """ 19 | # inicio 20 | 21 | abc def ghi 22 | """ 23 | Dado existe um filtro executável filtro.rb 24 | Quando executar limarka "-y --no-compila-tex --filtros filtro.rb" 25 | Então o arquivo tex gerado contém "ABC DEF GHi" 26 | 27 | Cenário: chamando filtro lua (que expande {{mundo}}) 28 | Dado arquivo "trabalho-academico.md" com o seguinte conteúdo: 29 | """ 30 | # Inicio 31 | {{mundo}} 32 | """ 33 | Dado existe um filtro lua filtro.lua 34 | Quando executar limarka "-y --no-compila-tex --filtros-lua filtro.lua" 35 | Então o arquivo tex gerado contém "Olá mundo!" 36 | -------------------------------------------------------------------------------- /spec/simbolos_spec.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | 3 | require 'spec_helper' 4 | require 'limarka/conversor' 5 | 6 | describe 'Lista de Simbolos', :simbolos do 7 | 8 | let!(:options) {{output_dir: output_dir, templates_dir: modelo_dir}} 9 | let(:tex_file) {Limarka::Conversor.tex_file} 10 | let (:texto) {<<-TEXTO 11 | # Primeiro Capítulo 12 | 13 | Texto1 14 | 15 | TEXTO 16 | } 17 | 18 | 19 | before do 20 | FileUtils.rm_rf output_dir 21 | FileUtils.mkdir_p output_dir 22 | end 23 | 24 | context 'quando simbolos forem especificados', :compilacao, :lento, :simbolos => 'especificado' do 25 | let (:output_dir) {"tmp/simbolos/especificados"} 26 | let (:simbolos){{'simbolos' => [{'s'=>"in",'d'=>'Pertence'}, {'s'=>'zeta', 'd'=>'Letra Zeta'}]}} 27 | let (:t) {Limarka::Trabalho.new(configuracao: configuracao_padrao.merge(simbolos), texto: texto)} 28 | 29 | before do 30 | @cv = Limarka::Conversor.new(t, options) 31 | @cv.convert 32 | @cv.compila 33 | end 34 | 35 | it "lista de simbolos é gerada segundo as Normas da ABNT" do 36 | expect(File).to exist(@cv.pdf_file) 37 | expect(@cv.txt).to include(<<-TXT) 38 | Lista de símbolos 39 | ∈ 40 | 41 | Pertence 42 | 43 | ζ 44 | 45 | Letra Zeta 46 | TXT 47 | end 48 | end 49 | end 50 | -------------------------------------------------------------------------------- /lib/limarka/check.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | 3 | module Limarka 4 | 5 | # Possibilita checar dependencias: pandoc 6 | # Ver https://github.com/abntex/limarka/issues/165 7 | # @see Cli 8 | class Check 9 | attr_accessor :pandoc 10 | attr_accessor :sistema 11 | PANDOC_VERSAO_MINIMA = '1.19.1' 12 | PANDOC_VERSAO_MAXIMA = '3.0.0' 13 | 14 | def initialize(pandoc: nil, sistema: true) 15 | self.pandoc = pandoc 16 | self.sistema = sistema 17 | end 18 | 19 | def check 20 | if sistema 21 | ler_pandoc_version 22 | end 23 | verifica_compatibilidade 24 | puts "OK." 25 | end 26 | 27 | def ler_pandoc_version 28 | self.pandoc = `pandoc --version`.split("\n")[0].split(" ")[1] 29 | end 30 | 31 | private 32 | 33 | def verifica_compatibilidade 34 | #byebug 35 | if Gem::Version.new(pandoc) < Gem::Version.new(Check::PANDOC_VERSAO_MINIMA) || Gem::Version.new(pandoc) >= Gem::Version.new(Check::PANDOC_VERSAO_MAXIMA) 36 | raise VersaoIncompativelError, "Versão incompatível do pandoc. Versão compatível: #{Check::PANDOC_VERSAO_MINIMA} <= Versão < #{Check::PANDOC_VERSAO_MAXIMA}" 37 | end 38 | end 39 | 40 | end 41 | 42 | class VersaoIncompativelError < StandardError 43 | end 44 | 45 | end 46 | -------------------------------------------------------------------------------- /spec/configuracao_padrao/configuracao.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | instituicao: Universidade/Faculdade do Brasil 3 | author: Nome do autor 4 | title: Título do trabalho 5 | local: Cidade - UF 6 | date: '2019' 7 | capa_pdf_caminho: '' 8 | titulacao: Minha-titulação 9 | curso: Meu-curso 10 | programa: Programa de Pós-Graduação em XXX 11 | area_de_concentracao: Computação 12 | linha_de_pesquisa: '' 13 | coorientador: '' 14 | orientador: Nome-do-Orientador 15 | referencias_caminho: referencias.bib 16 | proposito: '' 17 | resumo: '' 18 | palavras_chave: '' 19 | keywords: '' 20 | abstract_texto: '' 21 | resumen: '' 22 | palabras_clave: '' 23 | resume: '' 24 | mots_cles: '' 25 | siglas: 26 | - s: ABNT 27 | d: Associação Brasileira de Normas Técnicas 28 | simbolos: 29 | dedicatoria: '' 30 | agradecimentos: '' 31 | epigrafe: '' 32 | avaliador2: Nome-do-Prof-Convidado2 33 | aprovacao_dia: '1' 34 | avaliador1: Nome-do-Prof-Convidado1 35 | avaliador3: '' 36 | graduacao: true 37 | especializacao: false 38 | mestrado: false 39 | doutorado: false 40 | tipo_do_trabalho: Monografia 41 | incluir_ficha_catalografica: false 42 | folha_de_aprovacao: false 43 | projeto: true 44 | apendices: false 45 | anexos: false 46 | errata: false 47 | referencias_sistema: alf 48 | lista_ilustracoes: false 49 | lista_quadros: false 50 | lista_tabelas: false 51 | 52 | --- 53 | -------------------------------------------------------------------------------- /spec/cronograma_spec.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | require 'spec_helper' 3 | require 'limarka' 4 | 5 | describe Limarka::Cronograma, :cronograma do 6 | let (:legenda) {'Cronograma'} 7 | let (:fonte) {'Autor.'} 8 | let (:rotulo) { 'tab:cronograma' } 9 | let (:tabela) {[[]]} 10 | 11 | describe '#new' do 12 | context 'com argumentos' do 13 | let(:c) {Limarka::Cronograma.new(tabela: tabela, legenda: legenda, fonte: fonte, rotulo: rotulo)} 14 | it 'cria um cronograma com as propriedades passadas' do 15 | expect(c.tabela).to equal(tabela) 16 | expect(c.legenda).to equal(legenda) 17 | expect(c.fonte).to equal(fonte) 18 | expect(c.rotulo).to equal(rotulo) 19 | end 20 | end 21 | end 22 | 23 | describe '.cria_atividades' do 24 | context "qtde_atividades válida E meses válido" do 25 | let (:qtde_atividades) {5} 26 | let (:meses) {[3,4,5,6,7]} 27 | let (:c) {Limarka::Cronograma.cria_atividades(qtde_atividades, meses, legenda, fonte, rotulo)} 28 | 29 | it "tabela possui qtde_atividades +1 linhas" do 30 | expect(c.tabela.length).to eq(qtde_atividades+1) 31 | end 32 | it "tabela possui qtde_meses +1 colunas" do 33 | expect(c.tabela[0].length).to eq(meses.length+1) 34 | end 35 | end 36 | end 37 | 38 | end 39 | -------------------------------------------------------------------------------- /docs/paper/paper.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 'Limarka: making possible Brazilian students writing dissertation and thesis with Markdown' 3 | tags: 4 | - limarka 5 | - markdown 6 | - writing 7 | - dissertation 8 | - thesis 9 | - abnt 10 | authors: 11 | - name: Eduardo S M Alexandre 12 | orcid: 0000-0002-9165-9438 13 | affiliation: 1 14 | affiliations: 15 | - name: Universidade Federal da Paraíba 16 | index: 1 17 | date: 15 January 2017 18 | bibliography: paper.bib 19 | --- 20 | 21 | # Summary 22 | 23 | Many Brazilian's students have to write Monograph, Dissertation or Thesis at the 24 | end of their course. But these documents must be written according to Brazilian's 25 | @NBR14724:2011 standard (ABNT). Despite the fact that this standard is not public available 26 | (it's for sale), it changes over time and has many rules. 27 | 28 | Limarka makes possible to produce these documents according to ABNT standard, 29 | by writing it with Markdown. Where the Markdown syntax is not expressive enough 30 | to follow ABNT rules, the user will need to input Latex code, and limarka 31 | makes it easier. 32 | 33 | Limarka uses @pandoc to convert documents from Markdown to Latex, but uses custom 34 | templates based on @abnTeX2 and configuration is done by filling a PDF @form, 35 | instead of editing files with @YAML format. 36 | 37 | # References 38 | 39 | -------------------------------------------------------------------------------- /spec/simples_spec.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | 3 | require 'spec_helper' 4 | require 'limarka/conversor' 5 | 6 | describe 'Teste simples', :simpls do 7 | 8 | let!(:options) {{output_dir: output_dir, templates_dir: modelo_dir, verbose:true}} 9 | let(:tex_file) {Limarka::Conversor.tex_file} 10 | let (:texto) {<<-TEXTO 11 | # Primeiro capítulo 12 | 13 | Primeiro parágrafo. 14 | 15 | TEXTO 16 | } 17 | 18 | 19 | before do 20 | FileUtils.rm_rf output_dir 21 | FileUtils.mkdir_p output_dir 22 | end 23 | 24 | context 'em um arquivo de texto simples com verbose ativado' do 25 | let (:output_dir) {"tmp/simples"} 26 | let (:t) {Limarka::Trabalho.new(configuracao: configuracao_padrao, texto: texto)} 27 | 28 | before do 29 | @cv = Limarka::Conversor.new(t, options) 30 | @cv.convert 31 | end 32 | 33 | it 'gera arquivo tex corretamente' do 34 | expect(File).to exist(@cv.texto_tex_file) 35 | expect(@cv.texto_tex).to include("\\chapter{Primeiro capítulo}") 36 | expect(@cv.texto_tex).to include("Primeiro parágrafo.") 37 | end 38 | 39 | describe 'no pdf', :compilacao, :lento do 40 | before do 41 | @cv.compila 42 | end 43 | it "é gerado segundo as Normas da ABNT" do 44 | expect(File).to exist(@cv.pdf_file) 45 | expect(@cv.txt).to include("Primeiro capítulo\n") 46 | expect(@cv.txt).to include("Primeiro parágrafo.") 47 | end 48 | end 49 | 50 | 51 | end 52 | 53 | end 54 | -------------------------------------------------------------------------------- /lib/limarka/configuracao.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | require "thor" 3 | require 'yaml' 4 | require 'colorize' 5 | require 'open3' 6 | 7 | 8 | module Limarka 9 | 10 | # Representa os comandos de linha sobre configuracao. 11 | # 12 | # Invoque `limarka help configuracao` para verificar os comandos. 13 | # @see Cli 14 | class Configuracao < Thor 15 | 16 | method_option :output_dir, :aliases => '-o', :desc => 'Diretório onde será salvo a exportação', :default => '.' 17 | method_option :input_dir, :aliases => '-i', :desc => 'Diretório onde será executado a ferramenta', :default => '.' 18 | desc "exporta", "Exporta configuração para YAML. Ler configuracao.pdf e salva em configuracao.yaml no diretório indicado" 19 | def exporta 20 | configuracao_pdf = "configuracao.pdf" 21 | configuracao_yaml = "configuracao.yaml" 22 | Dir.chdir(options[:input_dir]) do 23 | raise IOError, "Arquivo não encontrado: #{options[:input_dir]}/" + configuracao_pdf unless File.exist? (configuracao_pdf) 24 | pdf = PdfForms::Pdf.new configuracao_pdf, (PdfForms.new 'pdftk'), utf8_fields: true 25 | pdfconf = Limarka::Pdfconf.new(pdf: pdf) 26 | 27 | # exporta sem validação 28 | h = pdfconf.exporta(false) 29 | 30 | target_file = options[:output_dir]+'/'+configuracao_yaml 31 | puts "Sobrescrevendo #{target_file}".green if File.exist?(target_file) 32 | Limarka::Trabalho.save_yaml(h, target_file) 33 | end 34 | end 35 | 36 | end 37 | end 38 | -------------------------------------------------------------------------------- /features/formato.feature: -------------------------------------------------------------------------------- 1 | # language: pt 2 | @extensao 3 | Funcionalidade: Formato e extensões pandoc 4 | 5 | O limarka utiliza [pandoc](https://pandoc.org) para geração do PDF. 6 | 7 | Como usuário do limarka eu gostaria poder extender o formato do arquivo 8 | de texto habilitando extensões do pandoc. 9 | 10 | Contexto: 11 | Dado um diretório com o template oficial 12 | E arquivo "trabalho-academico.md" com o seguinte conteúdo: 13 | """ 14 | # Links 15 | 16 | - https://github.com/abntex/limarka 17 | 18 | """ 19 | E arquivo configuracao.yaml com configuração padrão 20 | 21 | Cenário: caso normal, utilizando o formato pré-definido do limarka 22 | O comportamento padrão do limarka não gera links clicáveis no texto, a 23 | não ser que o usuário utilize a sintaxe apropriada de link. 24 | 25 | Quando executar limarka "-y --no-compila-tex" 26 | Então o arquivo tex gerado contém "https://github.com/abntex/limarka" 27 | Mas o arquivo tex gerado não contém "\url{https://github.com/abntex/limarka}" 28 | 29 | Cenário: habilitando uma extensão pandoc 30 | Neste cenário iremos habilitar a extensão 'autolink_bare_uris' 31 | (ver em https://pandoc.org/MANUAL.html#non-pandoc-extensions) 32 | que converte automaticamente todos os endereços web no texto em links 33 | clicáveis no PDF. 34 | 35 | Dado adiciona-se em configuracao.yaml: 36 | """ 37 | formato: "+autolink_bare_uris" 38 | """ 39 | Quando executar limarka "-y --no-compila-tex" 40 | Então o arquivo tex gerado contém "\url{https://github.com/abntex/limarka}" 41 | -------------------------------------------------------------------------------- /features/step_definitions/passos.rb: -------------------------------------------------------------------------------- 1 | require 'csv' 2 | 3 | Dado("um diretório com o template oficial") do 4 | @modelo_dir = File.join(@inicio,'modelo-oficial') 5 | @dir = File.join('tmp/cucumber', [*('a'..'z')].sample(8).join) 6 | FileUtils.mkdir_p @dir 7 | Dir.chdir @dir 8 | end 9 | 10 | Dado("arquivo {string} com o seguinte conteúdo:") do |arquivo, string| 11 | File.open(arquivo, 'w'){|f| f.write string} 12 | end 13 | 14 | Quando("executar limarka {string}") do |string| 15 | @params = (string + " -t "+ @modelo_dir).parse_csv(:col_sep =>" ") 16 | Limarka::Cli.start(@params) 17 | end 18 | 19 | Então("o arquivo tex gerado contém {string}") do |string| 20 | expect(Limarka::Cli.cv.texto_tex).to include(string) 21 | end 22 | 23 | Então("o arquivo tex gerado não contém {string}") do |string| 24 | expect(Limarka::Cli.cv.texto_tex).not_to include(string) 25 | end 26 | 27 | Dado("adiciona-se em configuracao.yaml:") do |string| 28 | toMerge = YAML.load(string) 29 | configuracao = YAML::load_file('configuracao.yaml') 30 | configuracao.merge! toMerge 31 | File.open('configuracao.yaml', 'w'){|f| f.write(configuracao.to_yaml + "\n\n---")} 32 | end 33 | 34 | Dado("arquivo configuracao.yaml com configuração padrão") do 35 | FileUtils.cp_r File.join(@inicio, "spec/configuracao_padrao/configuracao.yaml"),'.' 36 | end 37 | 38 | Dado("existe um filtro executável filtro.rb") do 39 | FileUtils.cp_r File.join(@inicio,"test/filtros/ruby/filtro.rb"), "." 40 | end 41 | 42 | Dado("existe um filtro lua filtro.lua") do 43 | FileUtils.cp_r File.join(@inicio,"test/filtros/lua/filtro.lua"), "." 44 | end 45 | -------------------------------------------------------------------------------- /lib/limarka/ref.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | require "thor" 3 | require 'open3' 4 | require 'bibtex' 5 | 6 | module Limarka 7 | 8 | # Essa classe contem os comandos de linhas referente aos comandos de `ref`. 9 | # Execute `limarka help ref` para conhecer os comandos. 10 | # Ela é incluída em {Cli}, utiliza a mesma sintaxe daquela classe. 11 | # @see Cli 12 | class Ref < Thor 13 | include Thor::Actions 14 | 15 | method_option :bibfile, :aliases => '-f', :desc => 'Arquivo de referências bibtex onde será incluído a referência', :default => "referencias.bib", :type => :string 16 | desc "add", "Adiciona referência ao arquivo de bibliografia." 17 | long_desc <<-DESC 18 | Quando você estiver navegando poderá copiar a referência bibtex (do google acadêmico, Zotero, etc.) e incluir ao arquivo de gerência de bibliografia (geralmente referencias.bib) utilizando esse comando. A inclusão do texto ocorrerá da entrada padrão. 19 | DESC 20 | def add 21 | begin 22 | entry = BibTeX.parse(referencia) 23 | error = entry.length.zero? 24 | if not error then 25 | append_to_file options[:bibfile], referencia 26 | 27 | puts < true}} 28 | let (:t) {Limarka::Trabalho.new(configuracao: configuracao_padrao.merge(configuracao_especifica), texto: texto)} 29 | 30 | before do 31 | @cv = Limarka::Conversor.new(t, options) 32 | @cv.convert 33 | @cv.compila 34 | end 35 | 36 | it "é gerada segundo as Normas da ABNT no PDF" do 37 | expect(File).to exist(@cv.pdf_file) 38 | expect(@cv.txt).to include("Lista de ilustrações\nFigura 1 – Minha figura") 39 | end 40 | end 41 | 42 | context 'quando desativada', :compilacao, :lento do 43 | let (:output_dir) {"tmp/lista_tabelas/desativada"} 44 | let (:configuracao_da_tabela) {{'lista_tabelas' => false}} 45 | let (:t) {Limarka::Trabalho.new(configuracao: configuracao_padrao.merge(configuracao_da_tabela), texto: texto)} 46 | 47 | before do 48 | @cv = Limarka::Conversor.new(t, options) 49 | @cv.convert 50 | @cv.compila 51 | end 52 | 53 | it "nao é gerada no PDF" do 54 | expect(File).to exist(@cv.pdf_file) 55 | expect(@cv.txt).not_to include("Lista de ilustrações") 56 | end 57 | end 58 | 59 | end 60 | -------------------------------------------------------------------------------- /spec/preambulo_spec.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | 3 | require 'spec_helper' 4 | require 'limarka/conversor' 5 | require 'open3' 6 | 7 | describe 'Preambulo', :projeto do 8 | 9 | let!(:options) {{output_dir: output_dir, templates_dir: modelo_dir}} 10 | let(:tex_file) {Limarka::Conversor.tex_file} 11 | let (:t) {Limarka::Trabalho.new(configuracao: configuracao_padrao.merge(configuracao_especifica), texto: texto)} 12 | let (:texto) {<<-TEXTO 13 | # Primeiro Capítulo 14 | 15 | texto. 16 | 17 | TEXTO 18 | } 19 | 20 | 21 | before do 22 | FileUtils.rm_rf output_dir 23 | FileUtils.mkdir_p output_dir 24 | end 25 | 26 | context 'quando configurado como projeto ', :compilacao, :lento, :folha_aprovacao => 'ativada' do 27 | let (:output_dir) {File.absolute_path "tmp/preambulo/projeto"} 28 | let (:configuracao_especifica) {{"projeto" => true}} 29 | 30 | 31 | before do 32 | @cv = Limarka::Conversor.new(t, options) 33 | @cv.convert 34 | @cv.compila 35 | end 36 | 37 | it "gera o texto de projeto", :area_de_concentracao, :linha_de_pesquisa do 38 | expect(File).to exist(@cv.pdf_file) 39 | expect(@cv.txt).to include("Projeto") 40 | end 41 | 42 | end 43 | 44 | 45 | context 'quando configurado como trabalho final ', :compilacao, :lento, :folha_aprovacao => 'ativada' do 46 | let (:output_dir) {File.absolute_path "tmp/preambulo/trabalho-final"} 47 | let (:configuracao_especifica) {{"projeto" => false}} 48 | 49 | before do 50 | @cv = Limarka::Conversor.new(t, options) 51 | @cv.convert 52 | @cv.compila 53 | end 54 | 55 | it "gera o texto de trabalho final", :area_de_concentracao, :linha_de_pesquisa do 56 | expect(File).to exist(@cv.pdf_file) 57 | expect(@cv.txt).not_to include("Projeto") 58 | end 59 | 60 | end 61 | 62 | 63 | 64 | end 65 | -------------------------------------------------------------------------------- /spec/lista_tabelas_spec.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | 3 | require 'spec_helper' 4 | require 'limarka/conversor' 5 | 6 | describe 'Lista de Tabelas', :lista_tabelas do 7 | 8 | let!(:options) {{output_dir: output_dir, templates_dir: modelo_dir}} 9 | let(:tex_file) {Limarka::Conversor.tex_file} 10 | let (:texto) {<<-TEXTO 11 | # Primeiro Capítulo 12 | 13 | Texto1 14 | 15 | |AA|BB| 16 | ---|--- 17 | |CC|DD| 18 | 19 | : Título da tabela 20 | 21 | TEXTO 22 | } 23 | 24 | 25 | 26 | before do 27 | FileUtils.rm_rf output_dir 28 | FileUtils.mkdir_p output_dir 29 | end 30 | 31 | context 'quando ativada', :compilacao, :lento do 32 | let (:output_dir) {"tmp/lista_tabelas/ativada"} 33 | let (:configuracao_da_tabela) {{'lista_tabelas' => true}} 34 | let (:t) {Limarka::Trabalho.new(configuracao: configuracao_padrao.merge(configuracao_da_tabela), texto: texto)} 35 | 36 | before do 37 | @cv = Limarka::Conversor.new(t, options) 38 | @cv.convert 39 | @cv.compila 40 | end 41 | 42 | it "é gerada segundo as Normas da ABNT no PDF" do 43 | expect(File).to exist(@cv.pdf_file) 44 | expect(@cv.txt).to include("Lista de tabelas\nTabela 1 – Título da tabela") 45 | end 46 | end 47 | 48 | context 'quando desativada', :compilacao, :lento do 49 | let (:output_dir) {"tmp/lista_tabelas/ativada"} 50 | let (:configuracao_da_tabela) {{'lista_tabelas' => false}} 51 | let (:t) {Limarka::Trabalho.new(configuracao: configuracao_padrao.merge(configuracao_da_tabela), texto: texto)} 52 | 53 | before do 54 | @cv = Limarka::Conversor.new(t, options) 55 | @cv.convert 56 | @cv.compila 57 | end 58 | 59 | it "nao é gerada no PDF" do 60 | expect(File).to exist(@cv.pdf_file) 61 | expect(@cv.txt).not_to include("Lista de tabelas\nTabela 1 – Título da tabela") 62 | end 63 | end 64 | 65 | 66 | end 67 | -------------------------------------------------------------------------------- /containers/alphine-ruby-latex-pandoc.dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine:3.7 2 | 3 | LABEL maintainer="eduardo.ufpb@gmail.com" 4 | 5 | # Tentamos seguir as melhores práticas: 6 | # https://docs.docker.com/develop/develop-images/dockerfile_best-practices/ 7 | 8 | RUN apk update \ 9 | && apk upgrade \ 10 | && apk add --no-cache --update \ 11 | alpine-sdk \ 12 | build-base \ 13 | fontconfig \ 14 | pdfgrep \ 15 | perl \ 16 | poppler-utils \ 17 | ruby-dev \ 18 | ruby \ 19 | unzip \ 20 | wget 21 | 22 | # Instala tinytex (/root/.TinyTex) 23 | RUN wget -qO- "https://yihui.name/gh/tinytex/tools/install-unx.sh" | sh 24 | ENV PATH="/root/bin:${PATH}" 25 | 26 | # instala bibliotecas para o abntex2/limarka 27 | RUN tlmgr install \ 28 | abntex2 \ 29 | babel-portuges \ 30 | bookmark \ 31 | enumitem \ 32 | epstopdf-pkg \ 33 | iftex \ 34 | lastpage \ 35 | lipsum \ 36 | listings \ 37 | caption \ 38 | memoir \ 39 | microtype \ 40 | pdflscape \ 41 | pdfpages \ 42 | textcase \ 43 | xcolor 44 | 45 | # Configurando o idioma português 46 | ENV MUSL_LOCALE_DEPS cmake make musl-dev gcc gettext-dev libintl 47 | ENV MUSL_LOCPATH /usr/share/i18n/locales/musl 48 | 49 | RUN apk add --no-cache \ 50 | $MUSL_LOCALE_DEPS \ 51 | && wget https://gitlab.com/rilian-la-te/musl-locales/-/archive/master/musl-locales-master.zip \ 52 | && unzip musl-locales-master.zip \ 53 | && cd musl-locales-master \ 54 | && cmake -DLOCALE_PROFILE=OFF -D CMAKE_INSTALL_PREFIX:PATH=/usr . && make && make install \ 55 | && cd .. && rm -r musl-locales-master 56 | 57 | ENV LANG pt_BR.UTF8 58 | 59 | # Instalação do pandoc 60 | RUN wget -O pandoc.tar.gz https://github.com/jgm/pandoc/releases/download/2.9.2.1/pandoc-2.9.2.1-linux-amd64.tar.gz \ 61 | && tar xvzf pandoc.tar.gz --strip-components 1 -C /usr/local/ && rm pandoc.tar.gz 62 | 63 | RUN gem install limarka; exit 0 64 | 65 | RUN apk del ruby-dev build-base wget alpine-sdk unzip cmake make musl-dev gcc 66 | 67 | VOLUME ["/trabalho"] 68 | WORKDIR /trabalho 69 | 70 | CMD ["--help"] 71 | ENTRYPOINT ["/usr/local/bundle/bin/limarka"] 72 | -------------------------------------------------------------------------------- /spec/cli_spec.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | 3 | require 'spec_helper' 4 | require 'limarka/cli' 5 | 6 | describe Limarka::Cli, :cli do 7 | 8 | describe "#exec", :filtros do 9 | 10 | context "--filtros-lua filtro.lua", :filtro => 'lua' do 11 | let (:output_dir) {"tmp/cli/filtros/lua"} 12 | let (:texto) {%Q( 13 | # Início 14 | 15 | {{mundo}} 16 | )} 17 | 18 | before do 19 | FileUtils.rm_rf output_dir 20 | FileUtils.mkdir_p output_dir 21 | IO.write(File.join(output_dir,'trabalho-academico.md'), texto) 22 | IO.write(File.join(output_dir,'configuracao.yaml'), JSON.pretty_generate(configuracao_padrao)) 23 | FileUtils.cp_r "modelo-oficial/referencias.bib",output_dir 24 | FileUtils.cp_r "test/filtros/lua/filtro.lua",output_dir 25 | end 26 | 27 | 28 | it "o filtro é executado durante conversão" do 29 | Limarka::Cli.start(["exec","-y", "--filtros-lua", "filtro.lua", "--no-compila-tex", "--input-dir", output_dir, "-t", modelo_dir]) 30 | expect(Limarka::Cli.cv.texto_tex).to include("Olá mundo!") 31 | end 32 | end 33 | 34 | context "--filtros filtro.rb", :filtro => 'ruby' do 35 | let (:output_dir) {"tmp/cli/filtros/ruby"} 36 | let (:texto) {%Q( 37 | # inicio 38 | 39 | abc def ghi 40 | )} 41 | 42 | before do 43 | FileUtils.rm_rf output_dir 44 | FileUtils.mkdir_p output_dir 45 | IO.write(File.join(output_dir,'trabalho-academico.md'), texto) 46 | IO.write(File.join(output_dir,'configuracao.yaml'), JSON.pretty_generate(configuracao_padrao)) 47 | FileUtils.cp_r "modelo-oficial/referencias.bib",output_dir 48 | FileUtils.cp_r "test/filtros/ruby/filtro.rb",output_dir 49 | end 50 | 51 | 52 | it "o filtro é executado durante conversão" do 53 | skip # error with paru -- https://github.com/htdebeer/paru/issues/59 54 | Limarka::Cli.start(["exec","-y", "--filtros", "filtro.rb", "--no-compila-tex", "--input-dir", output_dir, "-t", modelo_dir]) 55 | expect(Limarka::Cli.cv.texto_tex).to include("ABC DEF GHi") 56 | end 57 | end 58 | 59 | 60 | end 61 | 62 | 63 | end 64 | -------------------------------------------------------------------------------- /spec/conversor_spec.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | 3 | require 'spec_helper' 4 | require 'limarka/conversor' 5 | 6 | describe Limarka::Conversor do 7 | 8 | describe ".tex_file", :tipo_trabalho, :nivel_educacao do 9 | let (:configuracao_exportada) {} 10 | it "retorna xxx-trabalho-academico.tex" do 11 | expect(Limarka::Conversor.tex_file).to eq('xxx-trabalho-academico.tex') 12 | end 13 | end 14 | 15 | describe "#cria_xxx_referencias" do 16 | context "quando contém subtítulo e duplas chaves", :i122 do 17 | let(:referencias_com_duplas_chaves) {<<-BIB 18 | @article{Patton2009, 19 | author = {Patton, George C and Coffey, Carolyn and Sawyer, Susan M and Viner, Russell M and Haller, Dagmar M and Bose, Krishna and Vos, Theo and Ferguson, Jane and Mathers, Colin D}, 20 | doi = {10.1016/S0140-6736(09)60741-8}, 21 | file = {:home/andresimi/Documentos/Dropbox/Sincronizar/Mendeley Desktop/pdf/Patton et al. - 2009 - Global patterns of mortality in young people a systematic analysis of population health data.pdf:pdf}, 22 | journal = {Lancet}, 23 | keywords = {infancy,suicide}, 24 | mendeley-tags = {infancy,suicide}, 25 | number = {9693}, 26 | pages = {881--92}, 27 | pmid = {19748397}, 28 | title = {{Global patterns of mortality in young people: a systematic analysis of population health data}}, 29 | url = {http://www.ncbi.nlm.nih.gov/pubmed/19748397}, 30 | volume = {374}, 31 | year = {2009} 32 | } 33 | BIB 34 | } 35 | let(:titulo_esperado){"Global patterns of mortality in young people"} 36 | let(:subtitulo_esperado){"a systematic analysis of population health data"} 37 | let(:output_dir){"test/referencias/subtitulo-chaves-duplas"} 38 | let!(:options) {{output_dir: output_dir}} 39 | 40 | before do 41 | FileUtils.rm_rf output_dir 42 | FileUtils.mkdir_p output_dir 43 | 44 | t = Limarka::Trabalho.new(referencias_bib: referencias_com_duplas_chaves) 45 | @c = Limarka::Conversor.new(t,options) 46 | end 47 | 48 | it "mantém título e subtítulo consistentes" do 49 | @c.cria_xxx_referencias 50 | 51 | b = BibTeX.open(@c.referencias_bib_file) 52 | expect(b['Patton2009'].title.to_s).to eq(titulo_esperado) 53 | expect(b['Patton2009'].subtitle).to eq(subtitulo_esperado) 54 | end 55 | end 56 | end 57 | 58 | end 59 | -------------------------------------------------------------------------------- /limarka.gemspec: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | lib = File.expand_path('../lib', __FILE__) 3 | $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) 4 | require 'limarka/version' 5 | 6 | IS_TAGGED = ENV['TRAVIS_TAG'] == "v#{Limarka::VERSION}" 7 | IS_ORIGIN = ENV['TRAVIS_REPO_SLUG'] == 'abntex/limarka' 8 | BUILD_NUMBER = ENV['TRAVIS_BUILD_NUMBER'] 9 | 10 | Gem::Specification.new do |spec| 11 | spec.name = "limarka" 12 | spec.version = if BUILD_NUMBER && IS_ORIGIN && !IS_TAGGED 13 | # Prereleasing on Travis CI 14 | Limarka::VERSION + ".pre.#{BUILD_NUMBER}" 15 | else 16 | Limarka::VERSION 17 | end 18 | spec.authors = ["Eduardo de Santana Medeiros Alexandre"] 19 | spec.email = ["eduardo.ufpb@gmail.com"] 20 | spec.summary = %q{Ferramenta para compilação de trabalhos acadêmicos com markdown e abnTeX2} 21 | spec.description = %q{Com essa ferramenta você poderá escrever sua monografia, dissertação ou tese utilizando Markdown (linguagem mais simples que Latex).} 22 | spec.homepage = "https://github.com/abntex/limarka" 23 | spec.license = "MIT" 24 | spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) } 25 | spec.bindir = "exe" 26 | spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } 27 | spec.require_paths = ["lib"] 28 | #spec.requirements = 'pandoc, v1.19.1' 29 | spec.post_install_message = 'Gostou do limarka? Considere contribuir com o projeto: https://opencollective.com/limarka/donate' 30 | 31 | # essas são as ferramentas de desenvolvimento 32 | spec.add_development_dependency "bundler", "~> 2.0" 33 | spec.add_development_dependency "rake", "~> 12.0" 34 | spec.add_development_dependency "rspec", "~> 3.8" 35 | spec.add_development_dependency "pry-byebug" 36 | spec.add_development_dependency "codelog" 37 | spec.add_development_dependency "coveralls" 38 | spec.add_development_dependency "paru" 39 | spec.add_development_dependency "cucumber" 40 | spec.add_development_dependency "aruba" 41 | 42 | spec.add_dependency "ffi" 43 | spec.add_dependency "colorize" 44 | #spec.add_dependency "pdf-forms", "~> 1.2" 45 | spec.add_dependency "pandoc-ruby" 46 | spec.add_dependency "thor" 47 | spec.add_dependency "bibtex-ruby" 48 | spec.add_dependency "terminal-table" 49 | spec.add_dependency "pandoc_abnt", "~> 2.0.0" 50 | spec.add_dependency "guard" 51 | spec.add_dependency "guard-shell" 52 | spec.add_dependency "guard-rake" 53 | 54 | end 55 | -------------------------------------------------------------------------------- /spec/dependencias/latex_spec.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | 3 | require 'spec_helper' 4 | require 'limarka/conversor' 5 | 6 | describe 'Compilação Latex', :dependencias, :dependencias_latex do 7 | 8 | before do 9 | # Cria cópia de input_dir em output_dir 10 | FileUtils.rm_rf output_dir 11 | FileUtils.mkdir_p output_dir 12 | FileUtils.cp_r input_dir+"/.", output_dir 13 | end 14 | 15 | context 'de arquivo abntex2 mínimo com latexmk', :latex_minimo do 16 | let(:input_dir) {"spec/latex/exemplo-minimo"} 17 | let(:output_dir) {input_dir.gsub("spec","tmp")} 18 | 19 | it 'O pdf é gerado e o capítulo é prefixado com o número dele' do 20 | Dir.chdir(output_dir) do 21 | system "latexmk --quiet --xelatex -f xxx-Monografia.tex", [:out, :err]=>"latexmk.log" 22 | expect(File).to exist("xxx-Monografia.pdf") 23 | system "pdftotext -enc UTF-8 xxx-Monografia.pdf" 24 | expect(File).to exist("xxx-Monografia.txt") 25 | expect(File.read("xxx-Monografia.txt")).to include("1 Chapter example") 26 | end 27 | end 28 | end 29 | 30 | 31 | context 'de arquivo abntex2 mínimo com títulos com acentos e latexmk', :latex_minimo do 32 | let(:input_dir) {"spec/latex/exemplo-minimo-com-acentos"} 33 | let(:output_dir) {input_dir.gsub("spec","tmp")} 34 | 35 | it 'O pdf é gerado e o capítulo é prefixado com o número dele' do 36 | Dir.chdir(output_dir) do 37 | system "latexmk --quiet --xelatex -f xxx-Monografia.tex", [:out, :err]=>"latexmk.log" 38 | expect(File).to exist("xxx-Monografia.pdf") 39 | system "pdftotext -enc UTF-8 xxx-Monografia.pdf" 40 | expect(File).to exist("xxx-Monografia.txt") 41 | expect(File.read("xxx-Monografia.txt")).to include("1 Introdução") 42 | end 43 | end 44 | end 45 | 46 | 47 | context 'compilando um arquivo tex pequeno com latexmk', :latex_minimo do 48 | let(:input_dir) {"spec/latex/exemplo-pequeno-latex"} 49 | let(:output_dir) {input_dir.gsub("spec","tmp")} 50 | 51 | it 'O pdf é gerado segundo as normas da ABNT' do 52 | Dir.chdir(output_dir) do 53 | system "latexmk --quiet --xelatex -f xxx-Monografia.tex", [:out, :err]=>"latexmk.log" 54 | expect(File).to exist("xxx-Monografia.pdf") 55 | system "pdftotext -enc UTF-8 xxx-Monografia.pdf" 56 | expect(File).to exist("xxx-Monografia.txt") 57 | expect(File.read("xxx-Monografia.txt")).to include("1 Introdução") 58 | end 59 | end 60 | end 61 | 62 | 63 | end 64 | -------------------------------------------------------------------------------- /spec/errata_spec.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | 3 | require 'spec_helper' 4 | require 'limarka/conversor' 5 | 6 | describe 'Errata', :anexos do 7 | 8 | let!(:options) {{output_dir: output_dir, templates_dir: modelo_dir}} 9 | let (:errata) {<<-TEXTO 10 | A aranha arranha a rã. A rã arranha a aranha. **Nem a aranha arranha a rã**. Nem a rã arranha a aranha. 11 | 12 | Folha| Linha| Onde se lê | Leia-se 13 | -----|------|----------------|---------------- 14 | 10 |12 |aranhaarranha | aranha arranha 15 | 16 | TEXTO 17 | } 18 | 19 | before do 20 | FileUtils.rm_rf output_dir 21 | FileUtils.mkdir_p output_dir 22 | FileUtils.cp_r "#{modelo_dir}/.",output_dir 23 | end 24 | 25 | context 'quando configurada como desativada' do 26 | let (:output_dir) {File.absolute_path "tmp/errata/desativada"} 27 | let (:t) {Limarka::Trabalho.new(errata: nil)} 28 | 29 | before do 30 | Dir.chdir output_dir do 31 | @cv = Limarka::Conversor.new(t, options) 32 | @cv.convert 33 | end 34 | end 35 | 36 | it 'não será gerada' do 37 | expect(@cv.texto_tex).not_to include("\\begin{errata}") 38 | expect(@cv.texto_tex).not_to include("\\end{errata}") 39 | end 40 | it 'apresenta mensagem indicando que a seção está configurada como desativada' do 41 | expect(@cv.texto_tex).to include("Sem errata") 42 | end 43 | 44 | end 45 | 46 | context 'quando configurada para ser gerada' do 47 | let (:output_dir) {File.absolute_path "tmp/errata/ativada"} 48 | let (:t) {Limarka::Trabalho.new(errata: errata)} 49 | 50 | before do 51 | Dir.chdir output_dir do 52 | @cv = Limarka::Conversor.new(t, options) 53 | @cv.convert 54 | end 55 | end 56 | 57 | it 'a seção de errata foi criada' do 58 | Dir.chdir output_dir do 59 | expect(@cv.texto_tex).to include("\\begin{errata}") 60 | expect(@cv.texto_tex).to include("\\end{errata}") 61 | end 62 | end 63 | it 'a errata foi incluída no arquivo' do 64 | expect(@cv.texto_tex).to include("A aranha arranha a rã.") 65 | expect(@cv.texto_tex).to include("aranhaarranha") 66 | end 67 | 68 | describe 'no pdf', :compilacao, :lento do 69 | before do 70 | @cv.compila 71 | end 72 | it "é gerada segundo as Normas da ABNT" do 73 | expect(File).to exist(@cv.pdf_file) 74 | expect(@cv.txt).to include("Errata\n") 75 | expect(@cv.txt).to include("A aranha arranha a rã.") 76 | end 77 | end 78 | 79 | end 80 | 81 | end 82 | -------------------------------------------------------------------------------- /spec/check_spec.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | require 'spec_helper' 3 | require 'limarka' 4 | 5 | describe Limarka::Check, :check do 6 | let (:pandoc_min_version) {'1.19.1'} 7 | let (:pandoc_max_version) {'3.0.0'} 8 | let (:pandoc_versao_inferior) {'1.19.0'} 9 | let (:pandoc_versao_compativel) {'1.19.3'} 10 | let (:pandoc_versao_superior) {'4.0.0'} 11 | 12 | describe '#ler_pandoc_version' do 13 | let(:c) {Limarka::Check.new()} 14 | it 'ler a versão do pandoc do sistema' do 15 | expect(c.ler_pandoc_version).to eq(`pandoc --version`.split("\n")[0].split(" ")[1]) 16 | end 17 | end 18 | 19 | describe '#check' do 20 | context 'lendo versões do sistema (real)' do 21 | let(:c) {Limarka::Check.new()} 22 | it 'ler a versão do pandoc do sistema' do 23 | expect(c).to receive(:ler_pandoc_version) 24 | expect(c).to receive(:verifica_compatibilidade) 25 | allow(STDOUT).to receive(:puts) # this disables puts 26 | c.check 27 | end 28 | end 29 | 30 | context 'configurando versões das dependencias' do 31 | let(:c) {Limarka::Check.new(pandoc: pandoc_min_version, sistema: false)} 32 | it 'assume as versões das dependências passadas nos construtor' do 33 | expect(c.pandoc).to eq(pandoc_min_version) 34 | end 35 | end 36 | context 'configurando versões maiores das dependencias', :maior do 37 | let(:c) {Limarka::Check.new(pandoc: pandoc_max_version, sistema: false)} 38 | it 'assume as versões das dependências passadas nos construtor' do 39 | expect(c.pandoc).to eq(pandoc_max_version) 40 | end 41 | end 42 | 43 | context 'utilizando versão do pandoc inferior', :inferior do 44 | let(:c) {Limarka::Check.new(pandoc: pandoc_versao_inferior, sistema: false)} 45 | it 'emite erro informando que está utilizando uma versão incompatível' do 46 | expect { c.check }.to raise_error(Limarka::VersaoIncompativelError) 47 | end 48 | end 49 | context 'utilizando versão do pandoc superior' do 50 | let(:c) {Limarka::Check.new(pandoc: pandoc_versao_superior, sistema: false)} 51 | 52 | it 'emite erro informando que está utilizando uma versão incompatível' do 53 | expect { c.check }.to raise_error(Limarka::VersaoIncompativelError) 54 | end 55 | end 56 | context 'utilizando versão compatível do pandoc' do 57 | let(:c) {Limarka::Check.new(pandoc: pandoc_versao_compativel, sistema: false)} 58 | it 'emite OK' do 59 | expect { c.check }.to output("OK.\n").to_stdout 60 | end 61 | end 62 | 63 | end 64 | 65 | 66 | 67 | 68 | end 69 | -------------------------------------------------------------------------------- /spec/apendices_spec.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | 3 | require 'spec_helper' 4 | require 'limarka/conversor' 5 | 6 | describe 'Apendices', :apendices do 7 | 8 | let!(:options) {{output_dir: output_dir, templates_dir: modelo_dir}} 9 | let (:configuracao) {configuracao_padrao} 10 | before do 11 | FileUtils.rm_rf output_dir 12 | FileUtils.mkdir_p output_dir 13 | end 14 | 15 | context 'quando configurado como oculto' do 16 | let (:output_dir) {"tmp/apendices/desativado"} 17 | let (:t) {Limarka::Trabalho.new(configuracao: configuracao_padrao, anexos: nil)} 18 | 19 | before do 20 | @cv = Limarka::Conversor.new(t, options) 21 | @cv.convert 22 | end 23 | 24 | it 'não serao gerados' do 25 | expect(@cv.texto_tex).not_to include("\\begin{apendicesenv}") 26 | expect(@cv.texto_tex).not_to include("\\partapendices") 27 | expect(@cv.texto_tex).not_to include("\\end{apendicesenv}") 28 | end 29 | it 'apresenta mensagem indicando que a seção está configurada como desativada' do 30 | expect(@cv.texto_tex).to include("Seção de apendices configurada como desativada") 31 | end 32 | 33 | end 34 | 35 | context 'quando configurado para serem gerados' do 36 | let (:output_dir) {"tmp/apendices/ativado"} 37 | let (:apendice_texto) {<<-APENDICE 38 | # Primeiro apêndice 39 | 40 | Texto do apêndice. 41 | 42 | # Segundo apêndice 43 | 44 | Texto do segundo apêndice 45 | 46 | APENDICE 47 | } 48 | let (:t) {Limarka::Trabalho.new(apendices: apendice_texto)} 49 | 50 | before do 51 | @cv = Limarka::Conversor.new(t, options) 52 | @cv.convert 53 | end 54 | 55 | it 'a seção de apêndices foi criada' do 56 | expect(@cv.texto_tex).to include("\\begin{apendicesenv}") 57 | expect(@cv.texto_tex).to include("\\partapendices") 58 | expect(@cv.texto_tex).to include("\\end{apendicesenv}") 59 | end 60 | it 'o texto do apêndice foi incluído no arquivo' do 61 | expect(@cv.texto_tex).to include("\\chapter{Primeiro apêndice}") 62 | expect(@cv.texto_tex).to include("\\chapter{Segundo apêndice}") 63 | end 64 | 65 | describe 'no pdf', :compilacao, :lento do 66 | before do 67 | @cv.compila 68 | end 69 | it "é gerado segundo as Normas da ABNT" do 70 | expect(File).to exist(@cv.pdf_file) 71 | expect(@cv.txt).to include("Apêndices\n") 72 | expect(@cv.txt).to include("APÊNDICE A – Primeiro apêndice\nTexto do apêndice.") 73 | expect(@cv.txt).to include("APÊNDICE B – Segundo apêndice\nTexto do segundo apêndice") 74 | end 75 | end 76 | 77 | end 78 | 79 | end 80 | -------------------------------------------------------------------------------- /spec/capa_spec.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | 3 | require 'spec_helper' 4 | require 'limarka/conversor' 5 | 6 | describe 'Capa', :capa do 7 | 8 | 9 | let!(:configuracao) {configuracao_padrao.merge(configuracao_especifica)} 10 | let!(:options) {{output_dir: output_dir, templates_dir: modelo_dir}} 11 | let (:t) {Limarka::Trabalho.new(configuracao: configuracao, texto: texto)} 12 | let(:tex_file) {Limarka::Conversor.tex_file} 13 | let (:texto) {<<-TEXTO 14 | # Primeiro Capítulo 15 | 16 | Texto qualquer 17 | 18 | TEXTO 19 | } 20 | let (:texto_gerado_para_capa){<<-TEXTO 21 | Nome do autor 22 | 23 | Título do trabalho 24 | 25 | Cidade - UF 26 | 2019 27 | TEXTO 28 | } 29 | 30 | before do 31 | cria_copia_do_modelo(output_dir) 32 | @cv = Limarka::Conversor.new(t, options) 33 | @cv.convert 34 | end 35 | 36 | context 'quando fornece pdf personalizado' do 37 | let (:output_dir) {"tmp/capa/capa-pdf-personalizada"} 38 | let (:configuracao_especifica) {{'capa_pdf_caminho'=> 'imagens/capa.pdf'}} 39 | 40 | it 'capa não será gerada' do 41 | expect(@cv.texto_tex).not_to include("% Gerando capa abnTeX2") 42 | expect(@cv.texto_tex).not_to include("\\imprimircapa") 43 | end 44 | it 'o pdf da capa é utilizado' do 45 | expect(@cv.texto_tex).to include("% Incluindo capa personalizada de pdf") 46 | expect(@cv.texto_tex).to include("\\includepdf{imagens/capa.pdf}") 47 | end 48 | 49 | describe 'no pdf', :compilacao, :lento do 50 | before do 51 | @cv.compila 52 | end 53 | it "a capa foi incluída apropriadamente" do 54 | expect(@cv.txt).to include("Capa personalizada") 55 | expect(@cv.txt).not_to include(texto_gerado_para_capa) 56 | end 57 | end 58 | end 59 | 60 | context 'quando NÃO fornece pdf personalizado' do 61 | let (:output_dir) {"tmp/capa/sem-capa-personalizada"} 62 | let (:configuracao_especifica) {{'capa_pdf_caminho'=> ''}} 63 | 64 | it 'nenhuma capa é incluída' do 65 | expect(@cv.texto_tex).not_to include("\\includepdf") 66 | expect(@cv.texto_tex).not_to include("% Incluindo capa personalizada de pdf") 67 | end 68 | it 'capa será gerada' do 69 | expect(@cv.texto_tex).to include("\\imprimircapa") 70 | expect(@cv.texto_tex).to include("% Gerando capa abnTeX2") 71 | end 72 | 73 | describe 'no pdf', :compilacao, :lento do 74 | before do 75 | @cv.compila 76 | end 77 | it "a capa foi gerada apropriadamente" do 78 | expect(@cv.txt).to include(texto_gerado_para_capa) 79 | expect(@cv.txt).not_to include("Capa personalizada") 80 | end 81 | end 82 | end 83 | 84 | 85 | end 86 | -------------------------------------------------------------------------------- /spec/anexos_spec.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | 3 | require 'spec_helper' 4 | require 'limarka/conversor' 5 | 6 | describe 'Anexos', :anexos do 7 | 8 | let!(:options) {{output_dir: output_dir, templates_dir: modelo_dir}} 9 | let(:tex_file) {Limarka::Conversor.tex_file} 10 | let (:anexos) {<<-ANEXO 11 | # Primeiro anexo 12 | 13 | Texto do anexo. 14 | 15 | # Segundo anexo 16 | 17 | Texto do segundo anexo. 18 | 19 | ANEXO 20 | } 21 | 22 | before do 23 | FileUtils.rm_rf output_dir 24 | FileUtils.mkdir_p output_dir 25 | end 26 | 27 | context 'quando configurado como desativado' do 28 | let (:output_dir) {"tmp/anexos/desativado"} 29 | let (:t) {Limarka::Trabalho.new(configuracao: configuracao_padrao, anexos: nil)} 30 | 31 | before do 32 | @cv = Limarka::Conversor.new(t, options) 33 | @cv.convert 34 | end 35 | 36 | it 'não serao gerados' do 37 | expect(@cv.texto_tex).to include("% Anexos desativados") 38 | expect(@cv.texto_tex).not_to include("\\begin{anexosenv}") 39 | expect(@cv.texto_tex).not_to include("\\partanexos") 40 | expect(@cv.texto_tex).not_to include("\\end{anexosenv}") 41 | end 42 | it 'apresenta mensagem indicando que a seção está configurada como desativada' do 43 | expect(@cv.texto_tex).to include("Seção de anexos configurada como desativada") 44 | end 45 | 46 | end 47 | 48 | context 'quando configurado para serem gerados' do 49 | let (:output_dir) {"tmp/anexos/ativado"} 50 | let (:t) {Limarka::Trabalho.new(configuracao: configuracao_padrao.merge({input_dir: modelo_dir}), anexos: anexos)} 51 | 52 | before do 53 | @cv = Limarka::Conversor.new(t, options) 54 | @cv.convert 55 | end 56 | 57 | it 'cria o arquivo latex' do 58 | expect(File).to exist(@cv.texto_tex_file) 59 | end 60 | 61 | it 'a seção de anexos foi criada' do 62 | expect(@cv.texto_tex).to include("\\begin{anexosenv}") 63 | expect(@cv.texto_tex).to include("\\partanexos") 64 | expect(@cv.texto_tex).to include("\\end{anexosenv}") 65 | end 66 | it 'os anexos foram incluído no arquivo' do 67 | expect(@cv.texto_tex).to include("\\chapter{Primeiro anexo}") 68 | expect(@cv.texto_tex).to include("\\chapter{Segundo anexo}") 69 | end 70 | 71 | describe 'no pdf', :compilacao, :lento do 72 | before do 73 | @cv.compila 74 | end 75 | it "é gerado segundo as Normas da ABNT" do 76 | expect(File).to exist(@cv.pdf_file) 77 | expect(@cv.txt).to include("Anexos\n") 78 | expect(@cv.txt).to include("ANEXO A – Primeiro anexo") 79 | expect(@cv.txt).to include("ANEXO B – Segundo anexo") 80 | end 81 | end 82 | 83 | end 84 | 85 | end 86 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | require "bundler/gem_tasks" 3 | require "rspec/core/rake_task" 4 | require 'limarka/version' 5 | require 'colorize' 6 | require 'open3' 7 | require 'yaml' 8 | require 'rake/clean' 9 | #require 'pdf_forms' 10 | 11 | desc 'Executa os testes ruby' 12 | RSpec::Core::RakeTask.new('spec:ruby') do |t| 13 | t.rspec_opts = "--tag ~compilacao --tag ~dependencias_latex" 14 | end 15 | 16 | desc 'Executa os testes com geração de pdf' 17 | RSpec::Core::RakeTask.new('spec:pdf') do |t| 18 | t.rspec_opts = "--tag compilacao --tag dependencias_latex" 19 | end 20 | 21 | desc 'Executa o teste mínimo de compilação' 22 | RSpec::Core::RakeTask.new('spec:latex_minimo') do |t| 23 | t.rspec_opts = "--tag latex_minimo" 24 | end 25 | 26 | namespace :cucumber do 27 | desc 'Executa testes cucumber que NÃO envolvem gerão de pdfs' 28 | task :ruby do 29 | system "cucumber -t 'not @pdf' -f progress" 30 | end 31 | 32 | desc 'Executa testes cucumber que envolvem gerão de pdfs' 33 | task :pdf do 34 | system "cucumber -t '@pdf' -f progress" 35 | end 36 | end 37 | 38 | task :default => ['spec:ruby'] 39 | 40 | # http://stackoverflow.com/questions/19841865/ruby-gem-to-extract-form-data-from-fillable-pdf 41 | # https://github.com/jkraemer/pdf-forms/blob/master/test/pdf_test.rb 42 | 43 | 44 | directory 'dissertacao-limarka/output' 45 | 46 | desc 'Compila dissertação' 47 | task :dissertacao => 'dissertacao-limarka/output' do 48 | system 'bundle', 'exec', 'limarka', 'exec', '-i', 'dissertacao-limarka', '-o', 'dissertacao-limarka/output' 49 | end 50 | 51 | desc "Aplica tag v#{Limarka::VERSION}" 52 | task 'tag' do 53 | system 'git', 'commit', '-m', %Q(Gerando versão v#{Limarka::VERSION}) 54 | system 'git', 'tag', %Q(v#{Limarka::VERSION}) 55 | system 'git', 'push' 56 | system 'git', 'push', '--tags' 57 | end 58 | 59 | desc "Gera codelog para release de v#{Limarka::VERSION}" 60 | task 'codelog' do 61 | system 'codelog', 'release', "#{Limarka::VERSION}" 62 | end 63 | 64 | desc "Gera entrada par ao codelog" 65 | task 'codelog:new', [:feature] do |t, args| 66 | system 'codelog', 'new', args[:feature] 67 | end 68 | 69 | 70 | # Desatualizado 71 | namespace 'docker' do 72 | 73 | desc 'Constroi imagem docker' 74 | task 'build' do 75 | sh 'bin/build-docker.sh' 76 | end 77 | 78 | desc 'Publica imagens docker do limarka no travis' 79 | task 'deploy' do 80 | sh 'bin/deploy-docker.sh' 81 | end 82 | 83 | desc 'Executa o docker dentro do modelo' 84 | task 'run' do 85 | Dir.chdir('modelo-oficial') do 86 | rm_rf("xxx*") 87 | sh 'docker run --mount src=`pwd`,target=/trabalho,type=bind limarka exec' 88 | end 89 | end 90 | 91 | end 92 | 93 | PREAMBULO="templates/preambulo.tex" 94 | PRETEXTUAL = "templates/pretextual.tex" 95 | POSTEXTUAL = "templates/postextual.tex" 96 | CLEAN.include(["xxx-*",PREAMBULO,PRETEXTUAL,POSTEXTUAL,"templates/configuracao.yaml",'tmp']) 97 | -------------------------------------------------------------------------------- /spec/sumario_spec.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | 3 | require 'spec_helper' 4 | require 'limarka/conversor' 5 | 6 | describe 'Sumário', :sumario do 7 | 8 | let!(:options) {{output_dir: output_dir, templates_dir: modelo_dir}} 9 | let(:tex_file) {Limarka::Conversor.tex_file} 10 | let (:texto) {<<-TEXTO 11 | # Primeiro Capítulo 12 | 13 | Texto1 14 | 15 | ## Seção 1.1 16 | 17 | Texto1.1 18 | 19 | ## Seção 1.2 20 | 21 | Texto1.2 22 | 23 | # Segundo capítulo 24 | 25 | Texto2 26 | 27 | TEXTO 28 | } 29 | 30 | before do 31 | FileUtils.rm_rf output_dir 32 | FileUtils.mkdir_p output_dir 33 | end 34 | 35 | context 'independente de qualquer configuração' do 36 | let (:output_dir) {"tmp/sumario/automatico"} 37 | let (:t) {Limarka::Trabalho.new(configuracao: configuracao_padrao, texto: texto)} 38 | 39 | before do 40 | @cv = Limarka::Conversor.new(t, options) 41 | @cv.convert 42 | end 43 | 44 | it 'sempre é gerado' do 45 | expect(@cv.texto_tex).to include("% Sumário") 46 | expect(@cv.texto_tex).to include("\\tableofcontents*") 47 | end 48 | 49 | 50 | end 51 | 52 | context 'quando não for especificado siglas' do 53 | let (:output_dir) {"tmp/sumario/siglas-nil"} 54 | let (:t) {Limarka::Trabalho.new(configuracao: configuracao_padrao.merge({'siglas'=>nil}), texto: texto)} 55 | 56 | before do 57 | @cv = Limarka::Conversor.new(t, options) 58 | @cv.convert 59 | end 60 | 61 | 62 | it 'nenhuma sigla é incluída' do 63 | expect(@cv.texto_tex).not_to include("\\begin{siglas}") 64 | expect(@cv.texto_tex).not_to include("\\end{siglas}") 65 | end 66 | 67 | describe 'o sumário no pdf', :compilacao, :lento do 68 | before do 69 | @cv.compila 70 | end 71 | it "é gerado segundo as Normas da ABNT" do 72 | expect(File).to exist(@cv.pdf_file) 73 | expect(@cv.txt).to include("Sumário\n") 74 | expect(@cv.txt).to include("Seção 1.1\n") 75 | expect(@cv.txt).to include("Seção 1.2\n") 76 | end 77 | end 78 | end 79 | 80 | 81 | context 'quando não for especificado siglas' do 82 | let (:output_dir) {"tmp/sumario/sem-siglas"} 83 | let (:t) {Limarka::Trabalho.new(configuracao: configuracao_padrao.merge({'siglas'=>{}}), texto: texto)} 84 | 85 | before do 86 | @cv = Limarka::Conversor.new(t, options) 87 | @cv.convert 88 | end 89 | 90 | it 'nenhuma sigla é incluída' do 91 | expect(@cv.texto_tex).not_to include("\\begin{siglas}") 92 | expect(@cv.texto_tex).not_to include("\\end{siglas}") 93 | end 94 | 95 | 96 | describe 'o sumário no pdf', :compilacao, :lento do 97 | before do 98 | @cv.compila 99 | end 100 | it "é gerado segundo as Normas da ABNT" do 101 | expect(File).to exist(@cv.pdf_file) 102 | expect(@cv.txt).to include("Sumário\n") 103 | expect(@cv.txt).to include("Seção 1.1\n") 104 | expect(@cv.txt).to include("Seção 1.2\n") 105 | 106 | end 107 | end 108 | end 109 | 110 | end 111 | -------------------------------------------------------------------------------- /spec/pdfconf.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | 3 | require 'spec_helper' 4 | 5 | 6 | xdescribe Limarka::Pdfconf do 7 | 8 | let!(:root_dir){Dir.pwd} 9 | 10 | xdescribe "#ler_campo" do 11 | 12 | context "quando campo multi-linhas salvo pelo evince", :pdf_evince, :i124 do 13 | let(:form_file){"spec/formulario-pdf/campo-multi-linhas-preenchido-com-evince.pdf"} 14 | let(:valor_experado){"ABNT: Associação Brasileira de Normas Técnicas 15 | ES: Engenharia de Software"} 16 | let(:campo){"siglas"} 17 | before do 18 | skip 19 | pdf = PdfForms::Pdf.new form_file, (PdfForms.new 'pdftk'), utf8_fields: true 20 | @pdfconf = Limarka::Pdfconf.new(pdf: pdf) 21 | end 22 | it "ler o valor do campo normalmente" do 23 | expect(@pdfconf.ler_campo(campo)).to eq(valor_experado) 24 | end 25 | end 26 | 27 | context "quando campo multi-linhas salvo pelo pdf-xchange", :pdf_xchange, :i124 do 28 | let(:form_file){"spec/formulario-pdf/campo-multi-linhas-preenchido-com-pdf-xchange.pdf"} 29 | let(:valor_experado){"ABNT: Associação Brasileira de Normas Técnicas 30 | ES: Engenharia de Software"} 31 | let(:campo){"siglas"} 32 | before do 33 | pdf = PdfForms::Pdf.new form_file, (PdfForms.new 'pdftk'), utf8_fields: true 34 | @pdfconf = Limarka::Pdfconf.new(pdf: pdf) 35 | end 36 | 37 | it "ler o valor do campo e utiliza fim de linha universal" do 38 | expect(@pdfconf.ler_campo(campo)).to eq(valor_experado) 39 | end 40 | end 41 | end 42 | 43 | 44 | describe "#exporta" do 45 | 46 | context "quando PDF configurado para gerar folha de aprovação", :i128 do 47 | let(:fdf_file){"spec/formulario-pdf/fdf/gerar-folha-de-aprovacao.fdf"} 48 | let(:pdf_file){"test/formulario-pdf/fdf/gerar-folha-de-aprovacao.pdf"} 49 | let(:test_dir){"test/formulario-pdf/fdf"} 50 | before(:context) do 51 | Dir.chdir(modelo_dir) do 52 | system "libreoffice --headless --convert-to pdf configuracao.odt", :out=>"/dev/null" 53 | end 54 | end 55 | 56 | before do 57 | FileUtils.mkdir_p test_dir 58 | system "pdftk #{modelo_dir}/configuracao.pdf fill_form #{fdf_file} output #{pdf_file}" 59 | pdf = PdfForms::Pdf.new pdf_file, (PdfForms.new 'pdftk'), utf8_fields: true 60 | @pdfconf = Limarka::Pdfconf.new(pdf: pdf) 61 | end 62 | it "exporta 'folha_de_aprovacao' => true" do 63 | expect(@pdfconf.exporta).to include('folha_de_aprovacao' => true) 64 | end 65 | 66 | it "exporta o mês de aprovação selecionado" do 67 | expect(@pdfconf.exporta).to include("aprovacao_mes" => "Maio") 68 | end 69 | 70 | it "exporta o avaliador1 preenchido" do 71 | expect(@pdfconf.exporta).to include("avaliador1" => "Fulano") 72 | end 73 | 74 | it "exporta o avaliador2 preenchido" do 75 | expect(@pdfconf.exporta).to include("avaliador2" => "Beltrano") 76 | end 77 | 78 | it "exporta o avaliador3 preenchido" do 79 | expect(@pdfconf.exporta).to include("avaliador3" => "Cicrano") 80 | end 81 | 82 | end 83 | end 84 | 85 | end 86 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Core latex/pdflatex auxiliary files: 2 | *.aux 3 | *.lof 4 | *.log 5 | *.lot 6 | *.fls 7 | *.out 8 | *.toc 9 | *.fmt 10 | *.fot 11 | *.cb 12 | *.cb2 13 | *.out.ps 14 | 15 | ## Intermediate documents: 16 | *.dvi 17 | *-converted-to.* 18 | # these rules might exclude image files for figures etc. 19 | # *.ps 20 | # *.eps 21 | # *.pdf 22 | 23 | ## Bibliography auxiliary files (bibtex/biblatex/biber): 24 | *.bbl 25 | *.bcf 26 | *.blg 27 | *-blx.aux 28 | *-blx.bib 29 | *.brf 30 | *.run.xml 31 | 32 | ## Build tool auxiliary files: 33 | *.fdb_latexmk 34 | *.synctex 35 | *.synctex.gz 36 | *.synctex.gz(busy) 37 | *.pdfsync 38 | 39 | ## Auxiliary and intermediate files from other packages: 40 | # algorithms 41 | *.alg 42 | *.loa 43 | 44 | # achemso 45 | acs-*.bib 46 | 47 | # amsthm 48 | *.thm 49 | 50 | # beamer 51 | *.nav 52 | *.snm 53 | *.vrb 54 | 55 | # cprotect 56 | *.cpt 57 | 58 | # fixme 59 | *.lox 60 | 61 | #(r)(e)ledmac/(r)(e)ledpar 62 | *.end 63 | *.?end 64 | *.[1-9] 65 | *.[1-9][0-9] 66 | *.[1-9][0-9][0-9] 67 | *.[1-9]R 68 | *.[1-9][0-9]R 69 | *.[1-9][0-9][0-9]R 70 | *.eledsec[1-9] 71 | *.eledsec[1-9]R 72 | *.eledsec[1-9][0-9] 73 | *.eledsec[1-9][0-9]R 74 | *.eledsec[1-9][0-9][0-9] 75 | *.eledsec[1-9][0-9][0-9]R 76 | 77 | # glossaries 78 | *.acn 79 | *.acr 80 | *.glg 81 | *.glo 82 | *.gls 83 | *.glsdefs 84 | 85 | # gnuplottex 86 | *-gnuplottex-* 87 | 88 | # hyperref 89 | *.brf 90 | 91 | # knitr 92 | *-concordance.tex 93 | # TODO Comment the next line if you want to keep your tikz graphics files 94 | *.tikz 95 | *-tikzDictionary 96 | 97 | # listings 98 | *.lol 99 | 100 | # makeidx 101 | *.idx 102 | *.ilg 103 | *.ind 104 | *.ist 105 | 106 | # minitoc 107 | *.maf 108 | *.mlf 109 | *.mlt 110 | *.mtc 111 | *.mtc[0-9] 112 | *.mtc[1-9][0-9] 113 | 114 | # minted 115 | _minted* 116 | *.pyg 117 | 118 | # morewrites 119 | *.mw 120 | 121 | # mylatexformat 122 | *.fmt 123 | 124 | # nomencl 125 | *.nlo 126 | 127 | # sagetex 128 | *.sagetex.sage 129 | *.sagetex.py 130 | *.sagetex.scmd 131 | 132 | # sympy 133 | *.sout 134 | *.sympy 135 | sympy-plots-for-*.tex/ 136 | 137 | # pdfcomment 138 | *.upa 139 | *.upb 140 | 141 | # pythontex 142 | *.pytxcode 143 | pythontex-files-*/ 144 | 145 | # thmtools 146 | *.loe 147 | 148 | # TikZ & PGF 149 | *.dpth 150 | *.md5 151 | *.auxlock 152 | 153 | # todonotes 154 | *.tdo 155 | 156 | # xindy 157 | *.xdy 158 | 159 | # xypic precompiled matrices 160 | *.xyc 161 | 162 | # endfloat 163 | *.ttt 164 | *.fff 165 | 166 | # Latexian 167 | TSWLatexianTemp* 168 | 169 | ## Editors: 170 | # WinEdt 171 | *.bak 172 | *.sav 173 | 174 | # Texpad 175 | .texpadtmp 176 | 177 | # Kile 178 | *.backup 179 | 180 | # KBibTeX 181 | *~[0-9]* 182 | 183 | *~ 184 | configuracao.pdf 185 | templates/postextual.tex 186 | templates/pretextual.tex 187 | templates/preambulo.tex 188 | templates/configuracao.yaml 189 | xxx-* 190 | /.bundle/ 191 | /.yardoc 192 | /Gemfile.lock 193 | /_yardoc/ 194 | /coverage/ 195 | /doc/ 196 | /pkg/ 197 | /spec/reports/ 198 | /tmp/ 199 | master.bib 200 | ./configuracao.yaml 201 | .emacs.desktop* 202 | 203 | test 204 | .byebug_history 205 | coverage/ 206 | modelo-oficial 207 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | dist: bionic 2 | sudo: required 3 | language: ruby 4 | services: 5 | - docker 6 | notifications: 7 | webhooks: https://coveralls.io/webhook 8 | env: 9 | global: 10 | - COVERALLS_PARALLEL=true 11 | jobs: 12 | include: 13 | - stage: testes 14 | name: "Testes RUBY" 15 | before_install: 16 | - sudo apt-get update -qq 17 | - sudo bin/instaladores/dependencias_execucao_install.sh && sudo bin/instaladores/dependencias_desenvolvimento_install.sh 18 | - sudo bin/instaladores/pandoc_install.sh -q 19 | before_script: 20 | - pandoc -v 21 | - git clone --depth=1 https://github.com/abntex/trabalho-academico-limarka.git modelo-oficial 22 | script: 23 | - bundle exec rake spec:ruby 24 | - bundle exec rake cucumber:ruby 25 | - stage: testes 26 | name: "Testes com LaTeX (PDFs)" 27 | cache: 28 | directories: 29 | - $HOME/.TinyTeX 30 | before_install: 31 | - sudo apt-get update -qq 32 | - sudo bin/instaladores/dependencias_execucao_install.sh && sudo bin/instaladores/dependencias_desenvolvimento_install.sh 33 | - sudo bin/instaladores/pandoc_install.sh -q 34 | - sudo bin/instaladores/tinytex_install.sh 35 | - export PATH=$PATH:~/.TinyTeX/bin/x86_64-linux 36 | before_script: 37 | - tlmgr --version && tlmgr show --only-installed 38 | - latexmk -v 39 | - xelatex -v 40 | - pdftotext -v 41 | - pandoc -v 42 | - git clone --depth=1 https://github.com/abntex/trabalho-academico-limarka.git modelo-oficial 43 | script: 44 | - bundle exec rspec spec/dependencias/latex_spec.rb 45 | - bundle exec rspec spec/simples_spec.rb 46 | - bundle exec rake spec:pdf 47 | - bundle exec rake cucumber:pdf 48 | after_failure: 49 | - cat test/latex/exemplo-minimo/xxx-Monografia.log 50 | - cat tmp/simples/xxx-trabalho-academico.tex 51 | - cat tmp/simples/xxx-trabalho-academico.log 52 | - cat tmp/simples/xxx-trabalho-academico.txt 53 | - stage: testes 54 | name: "Deploy docker and rubygems" 55 | install: skip 56 | script: echo tag $TRAVIS_TAG slug $TRAVIS_REPO_SLUG branch $TRAVIS_BRANCH 57 | deploy: 58 | - provider: rubygems 59 | api_key: 60 | secure: YLuHbYsHGPTHoXIBr874CbIAn0/z0H0B8aW39NDQIwk7SMsd4HBgTq/6zgtUVLsp3AO9daHzk0FGcMKAOh9fxFzUuA5MmQTdQA8A3VI7JRM2BEVl8x6Hw2bjMTYMCAVGNGZT9oFKIq2lHByf9zDoQlT7CobKCY3Ofa0MTKcGgvfnqaW+VGosKrcYyZ9HPxBkH8SGnzef1joIcdtWOi3HHV28AacgRslWEkwTmYrsQcamTafQazuIbdhQ5UzvKS6PuIX56wvP6ugy9QTPtsU82x7oaDk+5e8ULJ2BMu/jwM4H3/aJ8ASg17a2EeIJRFckjQpMc+P3WCnbTu4tV2NqsXRzNmTcqwsM4bHTX2/WPlvVNwmTE9f5wSR9uCoQbDvCimCoo0miAE7xMbik0zvWVYZFtIcw3Rn+F+36jXXzY5xLSSYIZgJATbQgnNrYzCs54mUtmF+kUhYzDov4VfYcbc4ihEP6A/AdxvxuO4/xkGIsxlzxjCSw/Bs369zDXO5uUtORSQsLYPW4gZM+p++UMR63l7Radaq45HX0AVtkg9oWMj/UO8XCE2nMEUelcfeseuyy8ZB/Ga97KFVQH/LZLJYYU8+qDXQdfe8oWOlthuOA2QKyErDWQ9YWW2LVRhTacVjLBkYeChgpCReT1FDW982jfSWFCJTtb/XkM+D/90U= 61 | on: 62 | branch: master 63 | - provider: script 64 | script: bin/build-docker.sh && bin/deploy-docker.sh 65 | on: 66 | repo: abntex/limarka 67 | branch: master 68 | - provider: script 69 | script: bin/build-docker.sh && bin/deploy-docker.sh $TRAVIS_TAG 70 | on: 71 | tags: true 72 | after_script: 73 | - cat /root/.TinyTeX/texmf-var/web2c/tlmgr.log 74 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Código de Conduta para Colaboradores 2 | 3 | ## Nossa promessa 4 | 5 | Com o interesse de fomentar uma comunidade aberta e acolhedora, 6 | nós, como colaboradores e administradores deste projeto, comprometemo-nos 7 | a fazer a participação deste projeto uma experiência livre de assédio 8 | para todos, independentemente da aparência pessoal, deficiência, 9 | diferença corporal, etnia, gênero, idade, identidade ou expressão 10 | de gênero, identidade ou orientação sexual, nacionalidade, nível de 11 | experiência, raça ou religião. 12 | 13 | ## Nossos padrões 14 | 15 | Exemplos de comportamentos que contribuem a criar um ambiente positivo incluem: 16 | 17 | * Usar linguagem acolhedora e inclusiva 18 | * Respeitar pontos de vista e experiencias diferentes 19 | * Aceitar crítica construtíva com graça 20 | * Focar no que é melhor para a comunidade 21 | * Mostrar empatia com outros membros da comunidade 22 | 23 | Exemplos de comportamentos inaceitáveis por parte dos participantes incluem: 24 | 25 | * Uso de linguagem ou imagens sexuais e atenção ou avanço sexual indesejada 26 | * Comentários insultuosos e/ou depreciativos e ataques pessoais ou políticos (*Trolling*) 27 | * Assédio público ou privado 28 | * Publicar informação pessoal de outros sem permissão explícita, como, por exemplo, um endereço eletrônico ou residencial 29 | * Qualquer outra forma de conduta que pode ser razoavelmente considerada inapropriada num ambiente profissional 30 | 31 | ## Nossas responsibilidades 32 | 33 | Os administradores do projeto são responsáveis por esclareçer os padrões de 34 | comportamento e deverão tomar ação corretiva apropriada e justa em resposta 35 | a qualquer instância de comportamento inaceitável. 36 | 37 | Os administradores do projeto têm o direito e a responsabilidade de 38 | remover, editar ou rejeitar comentários, commits, código, edições 39 | na wiki, erros ou outras formas de contribuição que não estejam de 40 | acordo com este Código de Conduta, bem como banir temporariamente ou 41 | permanentemente qualquer colaborador por qualquer outro comportamento 42 | que se considere impróprio, perigoso, ofensivo ou problemático. 43 | 44 | ## Escopo 45 | 46 | Este Código de Conduta aplica-se dentro dos espaços do projeto ou 47 | qualquer espaço público onde alguém represente o mesmo ou a sua 48 | comunidade. Exemplos de representação do projeto ou comunidade incluem 49 | usar um endereço de email oficial do projeto, postar por uma conta de 50 | mídia social oficial, ou agir como um representante designado num evento 51 | online ou offline. A representação de um projeto pode ser ainda definida e 52 | esclarecida pelos administradores do projeto. 53 | 54 | ## Aplicação 55 | 56 | Comportamento abusivo, de assédio ou de outros tipos pode ser 57 | comunicados contatando a equipe do projeto (https://www.facebook.com/eduardosantanamedeiros). 58 | Todas as queixas serão revistas e investigadas e 59 | resultarão numa resposta necessária e apropriada à situação. 60 | A equipe é obrigada a manter a confidencialidade em relação 61 | ao elemento que reportou o incidente. Demais detalhes de 62 | políticas de aplicação podem ser postadas separadamente. 63 | 64 | Administradores do projeto que não sigam ou não mantenham o Código 65 | de Conduta em boa fé podem enfrentar repercussões temporárias ou permanentes 66 | determinadas por outros membros da liderança do projeto. 67 | 68 | ## Atribuição 69 | 70 | Este Código de Conduta é adaptado do [Contributor Covenant](http://contributor-covenant.org), 71 | versão 1.4, disponível em [http://contributor-covenant.org/version/1/4/pt_br/](http://contributor-covenant.org/version/1/4/pt_br/) 72 | -------------------------------------------------------------------------------- /docs/paper/open-canvas.md: -------------------------------------------------------------------------------- 1 | # Open Canvas 2 | 3 | **Project**: [limarka](https://github.com/abntex/limarka) 4 | 5 | 6 | 7 | # Problem 8 | 9 | 10 | 11 | 1. Saber as Normas da ABNT atuais 12 | 2. Saber como implementar as normas da ABNT atuais no editor (Configuração de Páginas, seções, estilos, formatação, sumário, apêndices, anexos, etc.) 13 | 3. Manter consistente as citações e referências no documento. 14 | 15 | 16 | # Solution 17 | 18 | 19 | 20 | 1. Exigir conhecimentos mínimos sobre as normas ABNT. 21 | 2. Modelo com estilos pré-configurados e de fácil utilização. 22 | 3. Sistema para gerenciamento de citações e elaboração das referências automaticamente. 23 | 24 | # Key Metrics 25 | 26 | 27 | 28 | - [Estrelas do projeto](https://github.com/abntex/limarka/stargazers) 29 | - Tráfegos de acesso no github: [limarka](https://github.com/abntex/limarka/graphs/traffic), [trabalho-academico-limarka 30 | ](https://github.com/abntex/trabalho-academico-limarka 31 | /graphs/traffic) 32 | - [Notificações de trabalhos escritos com o limarka](https://github.com/abntex/limarka/wiki/M%C3%A9tricas) 33 | 34 | # Unique Value Proposition 35 | 36 | 37 | 38 | - O documento é escrito e formatado facilmente utilizando marcações no texto 39 | - Não exige conhecimentos técnicos para configuração, que é realizada através do preenchimento de um formulário PDF 40 | - Ótimo visual do documento de apresentação, pois é baseado no modelo Latex de trabalhos acadêmicos mantido pela comunidade abnTeX. 41 | - Solução Gratuita, software livre. 42 | 43 | # User profiles 44 | 45 | 46 | 47 | 48 | - Alunos com conhecimentos técnicos de informática que precisam escrever relatórios ou trabalhos de conclusão. 49 | - Mestrandos em computação/informática que precisam escrever a dissertação. (*early adopters*) 50 | 51 | # User channels 52 | 53 | 54 | 55 | - Instruções das coordenações/instituições para produção dos trabalhos acadêmicos sugerindo utilização do limarka. 56 | - Instruções de tarefas submetidas aos alunos/aprendentes sugerindo utilização do limarka. 57 | - Páginas pessoais/institucionais de professores. 58 | - Listas de discussões de alunos universitários. 59 | - Publicidade nas agências de noticias universitárias. 60 | 61 | # Resources required 62 | 63 | 64 | - Sistema para conversão de Markdown para Latex; 65 | - Templates Latex para produção de trabalhos de conclusão em conformidade com as Normas da ABNT; 66 | - Desenvolvedor ruby; 67 | - Estrutural inicial de trabalho de conclusão de curso; 68 | - Câmera e Microfone: gravação de vídeos para o canal. 69 | 70 | # Contributor Profiles 71 | 72 | 73 | 74 | - Professores que solicitam trabalhos/relatórios aos alunos 75 | - Orientadores que desejam otimizar o tempo de discussões metodológicas com seus orientandos 76 | - Estudantes de informática que desejam produzir os trabalhos com agilidade 77 | - Usuários Latex que desejam elaborar novos templates 78 | - Desenvolvedores Ruby que desejam implementar novas funcionalidades 79 | 80 | # Contributor Channels 81 | 82 | 83 | 84 | - [Publicidade nas agências de noticias universitárias](https://github.com/abntex/limarka/wiki/Imprensa) 85 | - [CONTRIBUTING.md no repositório do projeto](https://github.com/abntex/limarka/blob/master/CONTRIBUTING.md) 86 | - [Canal do limarka Youtube](https://www.youtube.com/channel/UC4kERewtyT_nw__YHbKMdBA) 87 | -------------------------------------------------------------------------------- /spec/exemplos_spec.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | 3 | require 'spec_helper' 4 | require 'limarka' 5 | require 'limarka/cli' 6 | require 'yaml' 7 | 8 | describe 'Exemplo1', :exemplos do 9 | 10 | 11 | let(:tex_file){Limarka::Conversor.tex_file} 12 | let(:texto) {<<-END 13 | # Introdução 14 | 15 | Texto da introdução \\cite{ABNT-citacao}. 16 | 17 | END 18 | } 19 | 20 | let (:referencias_bib) {<<-REFERENCIAS 21 | @manual{ABNT-citacao, 22 | Address = {Rio de Janeiro}, 23 | Date-Added = {2012-12-15 21:43:38 +0000}, 24 | Date-Modified = {2013-01-12 22:17:20 +0000}, 25 | Month = {ago.}, 26 | Org-Short = {ABNT}, 27 | Organization = {Associa{\\c c}\\~ao Brasileira de Normas T\\'ecnicas}, 28 | Pages = 7, 29 | Subtitle = {Informa{\\c c}\\~ao e documenta{\\c c}\\~ao --- Apresenta{\\c c}\\~ao de cita{\\c c}\\~oes em documentos}, 30 | Title = {{NBR} 10520}, 31 | Year = 2002} 32 | 33 | REFERENCIAS 34 | } 35 | 36 | let(:anexos){<<-END 37 | # Primeiro anexo 38 | 39 | Texto do anexo 40 | END 41 | } 42 | 43 | let(:apendices){<<-END 44 | # Primeiro apêndice 45 | 46 | Texto do apêndice 47 | END 48 | } 49 | 50 | let(:errata){<<-END 51 | A aranha arranha a rã. A rã arranha a aranha. **Nem a aranha arranha a rã**. Nem a rã arranha a aranha. 52 | 53 | Folha| Linha| Onde se lê | Leia-se 54 | -----|------|----------------|---------------- 55 | 10 |12 |aranhaarranha | aranha arranha 56 | END 57 | } 58 | 59 | 60 | let!(:templates_dir){modelo_dir} 61 | let(:t){Limarka::Trabalho.new(configuracao: configuracao_padrao, texto: texto, anexos: anexos, referencias_bib: referencias_bib, apendices: apendices, errata: errata)} 62 | 63 | before do 64 | FileUtils.rm_rf test_dir 65 | FileUtils.mkdir_p test_dir 66 | t.save test_dir # Salva os arquivos que serão lidos 67 | end 68 | 69 | context "exec -y configuracao.yaml -t templates_dir (invocação)" do 70 | let(:test_dir){'tmp/exemplos/exemplo1'} 71 | before do 72 | expect_any_instance_of(Limarka::Cli).to receive(:exec) 73 | end 74 | it "invoca Limarka::Cli#exec" do 75 | Dir.chdir test_dir do 76 | Limarka::Cli.start(["exec","-y","configuracao.yaml", '-t', templates_dir]) 77 | end 78 | end 79 | end 80 | 81 | context "exec -y configuracao.yaml -t templates_dir" do 82 | let(:test_dir){'tmp/exemplos/exemplo2'} 83 | before do 84 | Dir.chdir test_dir do 85 | Limarka::Cli.start(["exec","-y", '-t', templates_dir]) 86 | end 87 | #@tex = File.open(tex_file, 'r'){|f| f.read} 88 | end 89 | 90 | it "gera arquivo latex" do 91 | #expect(File).to exist(tex_file) 92 | expect(Limarka::Cli.cv.texto_tex).to include("\\cite{ABNT-citacao}") # Citação 93 | expect(Limarka::Cli.cv.texto_tex).to include("Primeiro anexo") 94 | expect(Limarka::Cli.cv.texto_tex).to include("Primeiro apêndice") 95 | expect(Limarka::Cli.cv.texto_tex).to include("A aranha arranha a rã") 96 | end 97 | end 98 | 99 | context "Quando solicita ler de configuracao.pdf e o arquivo não existe", :diretorio_invalido, :configuracao_pdf do 100 | let(:test_dir){'tmp/exemplos/sem-configuracao-pdf'} 101 | before do 102 | FileUtils.rm_rf test_dir 103 | FileUtils.mkdir_p test_dir 104 | end 105 | 106 | it "lança erro indicando mensagem sugestiva" do 107 | Dir.chdir test_dir do 108 | expect{Limarka::Cli.start(["exec","-y", '-t', templates_dir])}.to raise_error(IOError, "Arquivo configuracao.yaml não foi encontrado, talvez esteja executando dentro de um diretório que não contém um projeto válido?") 109 | end 110 | end 111 | end 112 | 113 | end 114 | -------------------------------------------------------------------------------- /bin/instalador.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | dependencias= 4 | pandoc= 5 | tex= 6 | codename=$(lsb_release -c -s) 7 | pacotes= 8 | dry= 9 | cache= 10 | 11 | # Documentação de ajuda: 12 | # https://wiki.bash-hackers.org/howto/getopts_tutorial 13 | # http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html 14 | # http://robertmuth.blogspot.com/2012/08/better-bash-scripting-in-15-minutes.html 15 | # https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html 16 | 17 | while getopts "Dcdtpn" opt; do 18 | case $opt in 19 | p) 20 | pandoc=1 21 | ;; 22 | D) 23 | # Dry-run: não executa os comandos 24 | # https://unix.stackexchange.com/questions/433801/add-some-dry-run-option-to-script 25 | dry="echo " 26 | ;; 27 | c) 28 | # Não instala o TinyTeX se existir no cache 29 | cache=1 30 | ;; 31 | d) 32 | dependencias=1 33 | ;; 34 | t) 35 | tex=1 36 | ;; 37 | n) 38 | codename="$OPTARG" 39 | ;; 40 | \?) 41 | echo "Opção inválida: -$OPTARG" >&2 42 | exit 1 43 | ;; 44 | :) 45 | echo "Opção -$OPTARG requer argumento." >&2 46 | exit 1 47 | ;; 48 | esac 49 | done 50 | 51 | # ler distribuição: lsb_release -c -s 52 | if [ "$codename" = "bionic" ]; then 53 | 54 | if [ -n "$dependencias" ]; then 55 | $dry sudo apt-get install -y -qq --no-install-recommends \ 56 | language-pack-pt \ 57 | locales \ 58 | pdfgrep \ 59 | poppler-utils \ 60 | ruby-bundler \ 61 | ruby-json \ 62 | ruby-ffi \ 63 | libffi-dev \ 64 | unzip \ 65 | wget \ 66 | perl \ 67 | luajit \ 68 | python 69 | fi 70 | 71 | if [ -n "$tex" ]; then 72 | tex_em_cache=0 73 | if [ -n "$cache" ]; then 74 | if command -v tlmgr > /dev/null; then 75 | tex_em_cache=1 76 | echo TinyTeX não será instalado pois foi encontrado no cache. 77 | fi 78 | fi 79 | 80 | if [ $tex_em_cache -eq 1 ]; then 81 | : #echo TinyTeX não será instalado. 82 | else 83 | if [ -z "$dry" ]; then 84 | wget -qO- "https://yihui.name/gh/tinytex/tools/install-unx.sh" | sh 85 | tlmgr install \ 86 | abntex2 \ 87 | babel-portuges \ 88 | bookmark \ 89 | caption \ 90 | enumitem \ 91 | epstopdf-pkg \ 92 | lastpage \ 93 | lipsum \ 94 | listings \ 95 | memoir \ 96 | microtype \ 97 | pdflscape \ 98 | pdfpages \ 99 | psnfss \ 100 | shipunov \ 101 | texliveonfly \ 102 | textcase \ 103 | xcolor 104 | 105 | tlmgr option -- autobackup 0 106 | else 107 | $dry wget -qO- "https://yihui.name/gh/tinytex/tools/install-unx.sh" \| sh 108 | $dry tlmgr install \ 109 | abntex2 \ 110 | babel-portuges \ 111 | bookmark \ 112 | caption \ 113 | enumitem \ 114 | epstopdf-pkg \ 115 | lastpage \ 116 | lipsum \ 117 | listings \ 118 | memoir \ 119 | microtype \ 120 | pdflscape \ 121 | pdfpages \ 122 | psnfss \ 123 | shipunov \ 124 | texliveonfly \ 125 | textcase \ 126 | xcolor 127 | $dry tlmgr option -- autobackup 0 128 | fi 129 | 130 | fi 131 | 132 | 133 | fi #tex 134 | 135 | fi # 136 | 137 | if [ -n "$pandoc" ]; 138 | then 139 | $dry wget -nv https://github.com/jgm/pandoc/releases/download/2.9.2.1/pandoc-2.9.2.1-1-amd64.deb 140 | $dry sudo dpkg -i pandoc-*.deb && $dry rm pandoc-*.deb 141 | fi 142 | -------------------------------------------------------------------------------- /spec/referencias_spec.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | 3 | require 'spec_helper' 4 | require 'limarka/conversor' 5 | 6 | describe 'Referências', :referencias do 7 | 8 | 9 | let (:seed) {Random.new_seed} 10 | let!(:options) {{output_dir: output_dir, templates_dir: modelo_dir}} 11 | 12 | context 'quando configurada para ler de referencias.bib', :referencias, :referencias_bib do 13 | let (:configuracao) {configuracao_padrao.merge({'referencias_caminho' => 'referencias.bib', 'referencias_sistema'=>'alf'})} 14 | let (:output_dir) {"tmp/referencias_bib"} 15 | 16 | let (:texto) {s = <<-TEXTO 17 | # Introdução 18 | 19 | Citação no texto: \\citeonline{ABNT-citacao}. 20 | 21 | > No final da citação direta \\cite{ABNT-citacao}. 22 | 23 | Citando o ano: \\citeyear{ABNT-citacao}. 24 | 25 | TEXTO 26 | s + "\nSeed: #{@seed}\n"} 27 | 28 | let (:referencias_bib) {<<-REFERENCIAS 29 | @manual{ABNT-citacao, 30 | Address = {Rio de Janeiro}, 31 | Date-Added = {2012-12-15 21:43:38 +0000}, 32 | Date-Modified = {2013-01-12 22:17:20 +0000}, 33 | Month = {ago.}, 34 | Org-Short = {ABNT}, 35 | Organization = {Associa{\\c c}\\~ao Brasileira de Normas T\\'ecnicas}, 36 | Pages = 7, 37 | Title = {{NBR} 10520: meu subtitulo}, 38 | Year = 2002} 39 | 40 | REFERENCIAS 41 | } 42 | let (:trabalho) {Limarka::Trabalho.new(texto: texto, referencias_bib: referencias_bib, configuracao: configuracao)} 43 | before do 44 | FileUtils.rm_rf output_dir 45 | FileUtils.mkdir_p output_dir 46 | 47 | @cv = Limarka::Conversor.new(trabalho, options) 48 | @cv.convert 49 | end 50 | 51 | it "utiliza pacote abntex2cite para citação no preambulo" do 52 | expect(@cv.texto_tex).to include("\\usepackage[alf]{abntex2cite}") 53 | end 54 | it "cria arquivo tex para compilação" do 55 | expect(File).to exist(@cv.texto_tex_file) 56 | end 57 | it "bibliografia é criada em xxx-referencias.bib", :xxx_referencias do 58 | expect(File).to exist(@cv.referencias_bib_file) 59 | end 60 | it "title é dividido em title e subtitle se tittle contém :" , :titulo, :subtitulo do 61 | expect(File).to exist(@cv.referencias_bib_file) 62 | expect(File.open(@cv.referencias_bib_file, 'r'){|f| f.read}).to include("title = {{NBR} 10520}") 63 | expect(File.open(@cv.referencias_bib_file, 'r'){|f| f.read}).to include("subtitle = {meu subtitulo}") 64 | end 65 | 66 | it "referências será produzida a partir de xxx-referencias.bib" do 67 | expect(@cv.texto_tex).to include('\\bibliography{xxx-referencias}') 68 | end 69 | it "podemos utilizar \\cite para citação", :tecnico , :e1 do 70 | citacao = <<-CITACAO 71 | \\begin{quote} 72 | No final da citação direta \\cite{ABNT-citacao}. 73 | \\end{quote} 74 | CITACAO 75 | expect(@cv.texto_tex).to include(citacao) 76 | end 77 | it "podemos utilizar \\citeonline para citação", :tecnico do 78 | expect(@cv.texto_tex).to include("Citação no texto: \\citeonline{ABNT-citacao}.") 79 | end 80 | it "podemos utilizar \\citeyear para citação", :tecnico do 81 | expect(@cv.texto_tex).to include("Citando o ano: \\citeyear{ABNT-citacao}.") 82 | end 83 | 84 | describe 'o pdf', :compilacao, :lento do 85 | before do 86 | @cv.compila 87 | end 88 | it "é gerado apropriadamente" do 89 | expect(File).to exist(@cv.pdf_file) 90 | expect(@cv.txt).to include("Referências\n") 91 | expect(@cv.txt).to include("Citação no texto: ABNT (2002).") 92 | expect(@cv.txt).to include("No final da citação direta (ABNT, 2002).") 93 | expect(@cv.txt).to include("Citando o ano: 2002.") 94 | end 95 | end 96 | end 97 | 98 | 99 | 100 | end 101 | -------------------------------------------------------------------------------- /spec/siglas_spec.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | 3 | require 'spec_helper' 4 | require 'limarka/conversor' 5 | 6 | describe 'Lista de Siglas', :siglas do 7 | 8 | let!(:options) {{output_dir: output_dir, templates_dir: modelo_dir}} 9 | let(:tex_file) {Limarka::Conversor.tex_file} 10 | let (:texto) {<<-TEXTO 11 | # Primeiro Capítulo 12 | 13 | Texto1 14 | 15 | TEXTO 16 | } 17 | 18 | 19 | before do 20 | FileUtils.rm_rf output_dir 21 | FileUtils.mkdir_p output_dir 22 | end 23 | 24 | context 'em sua configuração padrão', :siglas => "padrao" do 25 | let (:output_dir) {"tmp/siglas/padrao"} 26 | let (:t) {Limarka::Trabalho.new(configuracao: configuracao_padrao, texto: texto)} 27 | 28 | before do 29 | @cv = Limarka::Conversor.new(t, options) 30 | @cv.convert 31 | end 32 | 33 | it 'imprime a lista de siglas com uma única sigla' do 34 | expect(@cv.texto_tex).to include("\\begin{siglas}") 35 | expect(@cv.texto_tex).to include("ABNT") 36 | expect(@cv.texto_tex).to include("Associação Brasileira de Normas Técnicas") 37 | expect(@cv.texto_tex).to include("\\end{siglas}") 38 | end 39 | 40 | describe "no pdf", :compilacao do 41 | 42 | before do 43 | @cv.compila 44 | end 45 | 46 | it "a página com lista de siglas é apresentada conforme a ABNT" do 47 | expect(@cv.txt).to include(<<-TXT) 48 | Lista de abreviaturas e siglas 49 | ABNT 50 | 51 | Associação Brasileira de Normas Técnicas 52 | TXT 53 | end 54 | end 55 | 56 | 57 | end 58 | 59 | context 'quando siglas forem especificadas' do 60 | let (:output_dir) {"tmp/siglas/especificadas"} 61 | let (:siglas){{'siglas' => [{'s'=>"SQN",'d'=>'Só que não.'}, {'s'=>'OMG', 'd'=>'Oh My God!'}]}} 62 | let (:t) {Limarka::Trabalho.new(configuracao: configuracao_padrao.merge(siglas), texto: texto)} 63 | 64 | before do 65 | @cv = Limarka::Conversor.new(t, options) 66 | @cv.convert 67 | end 68 | 69 | it 'seu código é gerado' do 70 | expect(@cv.texto_tex).to include("\\begin{siglas}") 71 | expect(@cv.texto_tex).to include("\\end{siglas}") 72 | expect(@cv.texto_tex).to include("\\item[OMG] Oh My God!") 73 | expect(@cv.texto_tex).to include("\\item[SQN] Só que não.") 74 | end 75 | 76 | describe 'no pdf', :compilacao, :lento do 77 | before do 78 | @cv.compila 79 | end 80 | it "são geradas segundo as Normas da ABNT" do 81 | expect(File).to exist(@cv.pdf_file) 82 | expect(@cv.txt).to include("Lista de abreviaturas e siglas") 83 | expect(@cv.txt).to include("SQN") 84 | expect(@cv.txt).to include("OMG") 85 | expect(@cv.txt).to include(<<-TXT) 86 | Lista de abreviaturas e siglas 87 | SQN 88 | 89 | Só que não. 90 | 91 | OMG 92 | 93 | Oh My God! 94 | TXT 95 | end 96 | end 97 | end 98 | 99 | context 'quando siglas for nil' do 100 | let (:output_dir) {"tmp/siglas/siglas-nil"} 101 | let (:t) {Limarka::Trabalho.new(configuracao: configuracao_padrao.merge({'siglas'=>nil}), texto: texto)} 102 | 103 | before do 104 | @cv = Limarka::Conversor.new(t, options) 105 | @cv.convert 106 | end 107 | 108 | it 'nenhuma sigla é incluída' do 109 | expect(@cv.texto_tex).not_to include("\\begin{siglas}") 110 | expect(@cv.texto_tex).not_to include("\\end{siglas}") 111 | end 112 | end 113 | 114 | 115 | context 'quando não for especificado siglas' do 116 | let (:output_dir) {"tmp/siglas/siglas-vazio"} 117 | let (:t) {Limarka::Trabalho.new(configuracao: configuracao_padrao.merge({'siglas'=>{}}), texto: texto)} 118 | 119 | before do 120 | @cv = Limarka::Conversor.new(t, options) 121 | @cv.convert 122 | end 123 | 124 | it 'nenhuma sigla é incluída' do 125 | expect(@cv.texto_tex).not_to include("\\begin{siglas}") 126 | expect(@cv.texto_tex).not_to include("\\end{siglas}") 127 | end 128 | end 129 | 130 | end 131 | -------------------------------------------------------------------------------- /spec/folha_aprovacao_spec.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | 3 | require 'spec_helper' 4 | require 'limarka/conversor' 5 | require 'open3' 6 | 7 | describe 'Folha de Aprovação', :folha_aprovacao do 8 | 9 | let!(:options) {{output_dir: output_dir, templates_dir: modelo_dir}} 10 | let(:tex_file) {Limarka::Conversor.tex_file} 11 | let (:t) {Limarka::Trabalho.new(configuracao: configuracao_padrao.merge(configuracao_especifica), texto: texto)} 12 | let (:texto) {<<-TEXTO 13 | # Primeiro Capítulo 14 | 15 | texto. 16 | 17 | TEXTO 18 | } 19 | 20 | 21 | 22 | before do 23 | FileUtils.rm_rf output_dir 24 | FileUtils.mkdir_p output_dir 25 | end 26 | 27 | context 'quando geração ativada', :compilacao, :lento, :folha_aprovacao => 'ativada' do 28 | let (:output_dir) {"tmp/folha_aprovacao/geracao"} 29 | let (:avalidor1) {"Nome-do-Avaliador1"} 30 | let (:area_de_concentracao) {"MinhaÁrea"} 31 | let (:linha_de_pesquisa) {"BoaLinha"} 32 | let (:configuracao_especifica) {{"folha_de_aprovacao" => true, "avaliador1"=>avalidor1, "area_de_concentracao" => area_de_concentracao, "linha_de_pesquisa" => linha_de_pesquisa}} 33 | 34 | 35 | before do 36 | @cv = Limarka::Conversor.new(t, options) 37 | @cv.convert 38 | @cv.compila 39 | end 40 | 41 | it "é gerada segundo as Normas da ABNT no PDF", :area_de_concentracao, :linha_de_pesquisa do 42 | expect(File).to exist(@cv.pdf_file) 43 | expect(@cv.txt).to include("Monografia aprovada.") 44 | expect(@cv.txt).to include("#{avalidor1}\nConvidado") 45 | expect(@cv.txt).to include("Área de concentração: #{area_de_concentracao}") 46 | expect(@cv.txt).to include("Linha de pesquisa: #{linha_de_pesquisa}") 47 | end 48 | 49 | context "e propósito personalizado", :proposito do 50 | let (:output_dir) {"tmp/folha_aprovacao/geracao-proposito-personalizado"} 51 | let (:proposito) {"Propósito personalizado"} 52 | let (:configuracao_especifica) {{"folha_de_aprovacao" => true, "proposito" => proposito}} 53 | 54 | it "é gerada com propósito personalizado" do 55 | expect(File).to exist(@cv.pdf_file) 56 | expect(@cv.txt).to include(proposito) 57 | end 58 | end 59 | end 60 | 61 | 62 | 63 | context 'quando geração desativada', :compilacao, :lento, :folha_aprovacao => 'desativada' do 64 | let (:output_dir) {"tmp/folha_aprovacao/desativada"} 65 | let (:avalidor1) {"Nome-do-Avaliador1"} 66 | let (:configuracao_especifica) {{"folha_de_aprovacao" => false, "avaliador1"=>avalidor1}} 67 | 68 | before do 69 | @cv = Limarka::Conversor.new(t, options) 70 | @cv.convert 71 | @cv.compila 72 | end 73 | 74 | it "não é gerada no PDF" do 75 | expect(File).to exist(@cv.pdf_file) 76 | expect(@cv.txt).not_to include("Monografia aprovada.") 77 | expect(@cv.txt).not_to include("#{avalidor1}\nConvidado") 78 | end 79 | end 80 | 81 | context 'quando inclusão de escaneada ativada', :compilacao, :lento, :folha_aprovacao => 'escaneada' do 82 | let (:output_dir) {"tmp/folha_aprovacao/inclusao"} 83 | let (:avalidor1) {"Nome-do-Avaliador1"} 84 | let (:configuracao_especifica) {{"incluir_folha_de_aprovacao" => true}} 85 | let (:imagens_dir) {"#{output_dir}/imagens"} 86 | 87 | before do 88 | FileUtils.mkdir_p imagens_dir 89 | Open3.popen3("pandoc -f markdown -t latex -s -o #{imagens_dir}/folha-de-aprovacao-escaneada.pdf") {|stdin, stdout, stderr, wait_thr| 90 | stdin.write("#Folha de Aprovação\n\nMinha folha de aprovação personalizada\n") 91 | stdin.close 92 | @texto_tex = stdout.read 93 | exit_status = wait_thr.value # Process::Status object returned. 94 | if(exit_status!=0) then puts ("Erro: " + stderr.read).red end 95 | } 96 | 97 | @cv = Limarka::Conversor.new(t, options) 98 | @cv.convert 99 | @cv.compila 100 | end 101 | 102 | it "imagens/folha-de-aprovacao-escaneada.pdf será incluído no PDF" do 103 | expect(File).to exist(@cv.pdf_file) 104 | expect(@cv.txt).to include("Folha de Aprovação") 105 | expect(@cv.txt).to include("Minha folha de aprovação personalizada") 106 | end 107 | end 108 | 109 | 110 | end 111 | -------------------------------------------------------------------------------- /docs/paper/generate: -------------------------------------------------------------------------------- 1 | #!/usr/bin/ruby 2 | 3 | # For an OO language, this is distinctly procedural. Should probably fix that. 4 | require 'json' 5 | 6 | details = Hash.new({}) 7 | 8 | capture_params = [ 9 | { :name => "title", :message => "Enter project name." }, 10 | { :name => "url", :message => "Enter the URL of the project repository." }, 11 | { :name => "description", :message => "Enter the (short) project description." }, 12 | { :name => "license", :message => "Enter the license this software shared under. (hit enter to skip)\nFor example MIT, BSD, GPL v3.0, Apache 2.0" }, 13 | { :name => "doi", :message => "Enter the DOI of the archived version of this code. (hit enter to skip)\nFor example http://dx.doi.org/10.6084/m9.figshare.828487" }, 14 | { :name => "keywords", :message => "Enter keywords that should be associated with this project (hit enter to skip)\nComma-separated, for example: turkey, chicken, pot pie" }, 15 | { :name => "version", :message => "Enter the version of your software (hit enter to skip)\nSEMVER preferred: http://semver.org e.g. v1.0.0" } 16 | ] 17 | 18 | puts "I'm going to try and help you prepare some things for your JOSS submission" 19 | puts "If all goes well then we'll have a nice codemeta.json file soon..." 20 | puts "" 21 | puts "************************************" 22 | puts "* First, some basic details *" 23 | puts "************************************" 24 | puts "" 25 | 26 | # Loop through the desired captures and print out for clarity 27 | capture_params.each do |param| 28 | puts param[:message] 29 | print "> " 30 | input = gets 31 | 32 | details[param[:name]] = input.chomp 33 | 34 | puts "" 35 | puts "OK, your project has #{param[:name]}: #{input}" 36 | puts "" 37 | end 38 | 39 | puts "" 40 | puts "************************************" 41 | puts "* Experimental stuff *" 42 | puts "************************************" 43 | puts "" 44 | 45 | puts "Would you like me to try and build a list of authors for you?" 46 | puts "(You need to be running this script in a git repository for this to work)" 47 | print "> (Y/N)" 48 | answer = gets.chomp 49 | 50 | case answer.downcase 51 | when "y", "yes" 52 | 53 | # Use git shortlog to extract a list of author names and commit counts. 54 | # Note we don't extract emails here as there's often different emails for 55 | # each user. Instead we capture emails at the end. 56 | 57 | git_log = `git shortlog --summary --numbered --no-merges` 58 | 59 | # ["252\tMichael Jackson", "151\tMC Hammer"] 60 | authors_and_counts = git_log.split("\n").map(&:strip) 61 | 62 | authors_and_counts.each do |author_count| 63 | count, author = author_count.split("\t").map(&:strip) 64 | 65 | puts "Looks like #{author} made #{count} commits" 66 | puts "Add them to the output?" 67 | print "> (Y/N)" 68 | answer = gets.chomp 69 | 70 | # If a user chooses to add this author to the output then we ask for some 71 | # additional information including their email, ORCID and affiliation. 72 | case answer.downcase 73 | when "y", "yes" 74 | puts "What is #{author}'s email address? (hit enter to skip)" 75 | print "> " 76 | email = gets.chomp 77 | 78 | puts "What is #{author}'s ORCID? (hit enter to skip)" 79 | puts "For example: http://orcid.org/0000-0000-0000-0000" 80 | print "> " 81 | orcid = gets.chomp 82 | 83 | puts "What is #{author}'s affiliation? (hit enter to skip)" 84 | print "> " 85 | affiliation = gets.chomp 86 | 87 | 88 | details['authors'].merge!(author => { 'commits' => count, 89 | 'email' => email, 90 | 'orcid' => orcid, 91 | 'affiliation' => affiliation }) 92 | 93 | when "n", "no" 94 | puts "OK boss..." 95 | puts "" 96 | end 97 | end 98 | when "n", "no" 99 | puts "OK boss..." 100 | puts "" 101 | end 102 | 103 | puts "Reticulating splines" 104 | 105 | 5.times do 106 | print "." 107 | sleep 0.5 108 | end 109 | 110 | puts "" 111 | puts "Generating some JSON goodness..." 112 | 113 | # TODO: work out how to use some kind of JSON template here. 114 | # Build the output list of authors from the inputs we've collected. 115 | output_authors = [] 116 | 117 | details['authors'].each do |author_name, values| 118 | entry = { 119 | "@id" => values['orcid'], 120 | "@type" => "Person", 121 | "email" => values['email'], 122 | "name" => author_name, 123 | "affiliation" => values['affiliation'] 124 | } 125 | output_authors << entry 126 | end 127 | 128 | # TODO: this is currently a static template (written out here). It would be good 129 | # to do something smarter here. 130 | output = { 131 | "@context" => "https://raw.githubusercontent.com/mbjones/codemeta/master/codemeta.jsonld", 132 | "@type" => "Code", 133 | "author" => output_authors, 134 | "identifier" => details['doi'], 135 | "codeRepository" => details['url'], 136 | "datePublished" => Time.now.strftime("%Y-%m-%d"), 137 | "dateModified" => Time.now.strftime("%Y-%m-%d"), 138 | "dateCreated" => Time.now.strftime("%Y-%m-%d"), 139 | "description" => details['description'], 140 | "keywords" => details['keywords'], 141 | "license" => details['license'], 142 | "title" => details['title'], 143 | "version" => details['version'] 144 | } 145 | 146 | File.open('codemeta.json', 'w') {|f| f.write(JSON.pretty_generate(output)) } 147 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![logo](https://raw.githubusercontent.com/wiki/abntex/limarka/imagens/limarka-logo.png) 2 | 3 | [![Build Status](https://travis-ci.org/abntex/limarka.svg?branch=master)](https://travis-ci.org/abntex/limarka) [![Coverage Status](https://coveralls.io/repos/github/abntex/limarka/badge.svg?branch=master)](https://coveralls.io/github/abntex/limarka?branch=master) [![Gem Version](https://badge.fury.io/rb/limarka.svg)](https://badge.fury.io/rb/limarka) [![Join the chat at https://gitter.im/abntex/limarka](https://badges.gitter.im/abntex/limarka.svg)](https://gitter.im/abntex/limarka?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) 4 | 5 | ![Normas da ABNT em 2017: Atualizadas](https://img.shields.io/badge/Normas%20da%20ABNT%20em%202017-Atualizadas-brightgreen.svg) 6 | ![NBR 14724:2011 100%](https://img.shields.io/badge/NBR%202014724%3A2011-100%25-brightgreen.svg) 7 | 8 | Olá! Bem vindo ao limarka! 9 | 10 | 11 | 12 | O limarka é uma ferramenta que possibilita seus usuários escreverem relatórios ou trabalhos de conclusão de curso (Monografia, TCC, Dissertação ou Tese) em arquivos somente texto e **produzir PDFs em conformidades com as Normas da ABNT**. A produção desse tipo de trabalho é um momento sensível na vida dos estudantes, que pode contribuir para evasão no ensino superior. O objetivo do limarka é liberar dos estudantes os esforços de formatação e adequação às Normas da ABNT, deixando-os concentrar-se no planejamento, execução e escrita de seus trabalhos. 13 | 14 | # Quem utiliza o limarka diz que ele é fácil e prazeroso, descubra o porquê! 15 | 16 | 17 | 18 | * Exige conhecimentos mínimos sobre as Normas da ABNT 19 | * Utiliza modelo com estilos pré-configurados com as normas e de fácil utilização 20 | * Utiliza sistema para gerenciamento de citações e elaboração das referências automaticamente 21 | * Gera o sumário automaticamente, sem esforço adicional 22 | * Permite a escrita do trabalho em arquivos somente texto, utilizando Markdown 23 | * As configurações são realizadas em um arquivo de formulário em PDF 24 | 25 | ## Exemplo de utilização do limarka 26 | 27 | ![logo](https://raw.githubusercontent.com/wiki/abntex/limarka/imagens/escrevendo-objetivos-em-markdown.gif) 28 | 29 | # Como iniciar utilização 30 | 31 | 32 | 33 | - [Para começar a utilizar a ferramenta siga as instruções no wiki do projeto](https://github.com/abntex/limarka/wiki) 34 | - Lembre-se de acessar o [chat no gitter](http://gitter.im/abntex/limarka) para tirar suas dúvidas sobre a ferramenta. 35 | 36 | # Contribuindo com o projeto 37 | 38 | 39 | 40 | Veja como é fácil contribuir! 41 | 42 | [![OpenCollective](https://opencollective.com/limarka/backers/badge.svg)![OpenCollective](https://opencollective.com/limarka/sponsors/badge.svg)](https://opencollective.com/limarka/donate) 43 | 44 | ## Professor 45 | 46 | - Atualize sua página pessoal/institucional adicionando uma [matéria ou link sobre o limarka](https://github.com/abntex/limarka/wiki/Imprensa) 47 | - Solicite incluir o limarka como uma alternativa nos materiais de instruções de produção de trabalhos de conclusão, ou nas disciplinas de Metodologia. 48 | - Ao solicitar relatórios de atividades aos alunos, sugira a utilização do limarka. 49 | - Divulgue um notícia sobre o limarka nas listas de professores ou alunos. 50 | - Recomende a veiculação de uma matéria sobre o limarka na agência de noticias de sua instituição. 51 | - Sugira seus orientandos experimentarem o limarka. 52 | - Clique na estrela no repositório do projeto (equivale a um *like*) 53 | 54 | ## Estudante 55 | 56 | - Utilize o limarka para elaboração de relatórios 57 | - Participe do [experimente de uso da ferramenta](https://github.com/abntex/limarka/wiki/Experimentos) - NECESSITA-SE URGENTEMENTE! 58 | - Compartilhe alguma notícia do limarka em suas redes sociais ou lista de alunos 59 | - Escreva seu trabalho de conclusão com o limarka e compartilhe sua experiência 60 | - Clique na estrela no repositório do projeto (equivale a um *like*) 61 | 62 | ## Usuário Latex 63 | 64 | - Auxilie na criação de templates latex customizados para as instituições 65 | 66 | ## Desenvolvedor Ruby 67 | 68 | [![GitHub issues](https://img.shields.io/github/issues/abntex/limarka.svg)](https://github.com/abntex/limarka/issues) 69 | 70 | - [Escolha uma das funcionalidades para implementar](https://github.com/abntex/limarka/issues) 71 | - Notifique ou corrija um Bug 72 | 73 | Acesse o [chat no gitter](http://gitter.im/abntex/limarka) e fale conosco! 74 | 75 | ## Desenvolvedor Web 76 | 77 | Nós desejamos melhorar a experiência de utilização da ferramenta implementando 78 | um site que gere conteúdos dinâmicos, gostaria de contribuir? 79 | 80 | Acesse o [chat no gitter](http://gitter.im/abntex/limarka) e fale conosco! 81 | 82 | ## Todas as formas de contribuição 83 | 84 | Consulte o arquivo [CONTRIBUTING.md](CONTRIBUTING.md) para verificar todas as formas de contribuições. 85 | 86 | 87 | 88 | ## Deseja entrar em contato? 89 | 90 | O meio de comunicação oficial do limarka é uma sala de bate papo no gitter: [![Join the chat at https://gitter.im/abntex/limarka](https://badges.gitter.im/abntex/limarka.svg)](https://gitter.im/abntex/limarka) 91 | 92 | # Links 93 | 94 | - A documentação do limarka será mantida no [wiki do projeto](https://github.com/abntex/limarka/wiki). 95 | - [Vídeos](https://www.youtube.com/playlist?list=PLTnAY6TvPRKK6OgGYy3UA0oFdfCfRZesY) -- recomendo assistir em velocidade rápida 96 | - [Convite para realização de experimento de utilização](https://github.com/abntex/limarka/wiki/Experimentos) 97 | 98 | # Funcionalidades do limarka 99 | 100 | - Utilização da linguagem Markdown para escrita do texto; 101 | - Configurações através de formulário PDF ou arquivo YAML; 102 | - Possibilidade de inclusão de códigos Latex; 103 | - Facilidade para geração de códigos para inclusão de Figuras, Quadros, Tabelas, Referências e Citações; 104 | - Facilidade em edição ou personalização de templates; 105 | - Facilidade de obter suporte ao código Latex gerado (compatível com o estilo do abnTeX2); 106 | 107 | # License 108 | 109 | Esse gem é disponibilizado como software livre através da [Licença MIT](http://opensource.org/licenses/MIT). 110 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contribuindo com o projeto 2 | 3 | No momento, as maiores contribuições são: utilizar a ferramenta, [realizar o experimento] 4 | e [divulgá-la](https://github.com/abntex/limarka/wiki/Imprensa). 5 | 6 | [realizar o experimento]: https://github.com/abntex/limarka/wiki/Experimentos 7 | 8 | Pull requests são sempre bem vindos. Ao participar desse projeto você está de 9 | acordo com o [código de conduda]. 10 | 11 | O projeto tem como origem uma pesquisa científica (em andamento) sobre utilização de linguagem de marcação de texto para elaboração de monografias. 12 | 13 | - [Realize o experimento de utilização](https://github.com/abntex/limarka/wiki/Experimentos) 14 | 15 | Acesse o [chat no gitter](http://gitter.im/abntex/limarka) e fale conosco, independente do seu perfil. 16 | 17 | # Professor 18 | 19 | Como professor você pode contribuir com o limarka divulgando-o e ofertando o limarka como uma opção para seus alunos realizarem tarefas. 20 | 21 | - Ao solicitar relatórios de atividades aos alunos, sugira a utilização do limarka. Embora o limarka tenha o propósito de produzir trabalhos de conclusão de curso, ele pode ser facilmente utilizado para elaboração de relatórios. 22 | 23 | - Sugira seus orientandos experimentarem o limarka. O limarka é gratuito e livre, pode ser utilizado no Linux, OS X e Windows. Não recomendamos utilizar o limarka em trabalhos de conclusão que exigam bastante fórmulas, teoremas ou provas. Os editores Latex oferecem melhor suporte para isso. 24 | 25 | - Atualize sua página pessoal/institucional adicionando uma [matéria ou link sobre o limarka](https://github.com/abntex/limarka/wiki/Imprensa). Seus alunos e outras pessoas poderão conhecer a ferramenta dessa forma. 26 | 27 | - Solicite incluir o limarka como uma alternativa nos materiais de instruções de produção de trabalhos de conclusão, ou nas disciplinas de Metodologia. O momento ideal para apresentar aos alunos a ferramenta são nas aulas de Metodologia. Por enquanto o foco da ferramenta são trabalho de conclusão, mas em breve também será possível realizar artigos. 28 | 29 | - Divulgue um notícia sobre o limarka nas listas de professores ou alunos. O público alvo da ferramenta são os estudantes, essas listas propocionam encontrá-los. 30 | 31 | - Recomende a veiculação de uma matéria sobre o limarka na agência de noticias de sua instituição. As agências de notícias das instituições são um ótimo meio para divulgação, verifique como contactar agência e recomende uma matéria para ser veiculada. 32 | 33 | - Clique na estrela [no repositório do projeto](https://github.com/abntex/limarka) (equivale a um *like*) no github. 34 | 35 | # Estudante 36 | 37 | - Utilize o limarka para elaboração de relatórios 38 | - Participe do [experimente de uso da ferramenta](https://github.com/abntex/limarka/wiki/Experimentos) - NECESSITA-SE URGENTEMENTE! 39 | - Compartilhe alguma notícia do limarka em suas redes sociais ou lista de alunos ou de laboratórios 40 | - Escreva seu trabalho de conclusão ou sua proposta/projeto com o limarka e compartilhe sua experiência 41 | - Clique na estrela [no repositório do projeto](https://github.com/abntex/limarka) (equivale a um *like*) no github. 42 | 43 | # Usuário Latex 44 | 45 | Gostaríamos de converter as [customizações conhecidas do abnTeX2](https://github.com/abntex/abntex2/wiki/CustomizacoesConhecidas) para utilização com o limarka. 46 | 47 | # Desenvolvedor Ruby 48 | 49 | Deseja participar do desenvolvimento do limarka? Considere os [issues marcados com o label help needed](https://github.com/abntex/limarka/labels/help%20wanted) como um convite para contribuir conosco. 50 | 51 | Correção de bugs e implementação de novas funcionalidades através de Pull requests são sempre bem vindos. 52 | 53 | Ao participar desse projeto você está de acordo com o [código de conduda]. 54 | 55 | [código de conduda]: https://github.com/abntex/limarka/blob/master/CODE_OF_CONDUCT.md 56 | 57 | # Desenvolvedor WEB 58 | 59 | Nós desejamos melhorar a experiência de utilização da ferramenta implementando 60 | um site que gere conteúdos dinâmicos. 61 | 62 | Suponha que um usuário deseja adicionar uma referência de um artigo, gostaria 63 | que o usuário clicasse em "Artigo" e um formulário fosse apresentado para 64 | preenchimento e acordo com os campos bib desse tipo de entrada. Quando o usuário 65 | vai preenchendo o código bib é gerado automaticamente para inserção no arquivo 66 | de referências. 67 | 68 | Para compreender a funcionalidade veja o site [http://shields.io](http://shields.io/) e clique em algum dos badges. 69 | 70 | 71 | ## Implementando uma nova funcionalidade 72 | 73 | [Crie um issue](https://github.com/abntex/limarka/issues/new) descrevendo a nova funcionalidade. 74 | 75 | Realize um fork no projeto, depois faça o clone do seu fork: 76 | 77 | git clone git@github.com:your-username/limarka.git 78 | 79 | Configure sua máquina: 80 | 81 | ./bin/setup 82 | 83 | Certifique-se que os testes estão passando: 84 | 85 | rake 86 | 87 | Escreva [o codelog](https://github.com/codus/codelog) da funcionalidade que deseja implementar: 88 | 89 | rake codelog:new[nome-da-funcionalidade] 90 | 91 | NOTE: Atualize o arquivo `[changelogs/unreleased/XXXXXXXXXXXXXXXXX_nome-da-funcionalidade.yml` incluindo texto para release notes. 92 | 93 | Realize as alterações. Adicione testes (opicional, mas desejado) para as suas mudanças. Faça os testes passarem: 94 | 95 | rake 96 | git add arquivo-modificado1 arquivo-modificado2 97 | git commit 98 | 99 | Se existir um Issue referente a funcionalidade implementada [utilize o número do issue na mensagem de commit](https://help.github.com/articles/closing-issues-via-commit-messages/) para manter rastreabilidade. 100 | 101 | Faça um Push para o seu fork: 102 | 103 | git push origin 104 | 105 | [Submeta um pull request](https://github.com/abntex/limarka/compare/). Altere o título do issue/PR para o texto que deseja ser adicionado ao [CHANGELOG](https://github.com/abntex/limarka/blob/master/CHANGELOG.md) 106 | 107 | ## Desenvolvimento 108 | 109 | Talvez você deseje consulta a página sobre o [desenvolvimento da ferramenta](https://github.com/abntex/limarka/wiki/Desenvolvimento). 110 | 111 | # Testes de aceitação 112 | 113 | - [https://cucumber.io/docs/gherkin/reference/](https://cucumber.io/docs/gherkin/reference/) 114 | - [aruba](https://app.cucumber.pro/projects/aruba) 115 | - [aruba/matchers](https://github.com/cucumber/aruba/tree/master/spec/aruba/matchers) 116 | - [cucumber-ruby API](https://www.rubydoc.info/github/cucumber/cucumber-ruby/) 117 | -------------------------------------------------------------------------------- /imagens/configuracao/mapa-arquivos.mm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 |

80 | exportados para 81 |

82 |

83 | configuracao.yaml 84 |

85 | 86 | 87 |
88 | 89 |
90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 |
131 | -------------------------------------------------------------------------------- /lib/limarka/pdfconf_remover.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | require "thor" 3 | require 'pdf_forms' 4 | require 'yaml' 5 | require 'colorize' 6 | require 'open3' 7 | 8 | module Limarka 9 | 10 | # Essa classe é responsável por ler os valores salvos em um formulário PDF 11 | # e gerar um hash compatível com configuração de um {Trabalho}. 12 | # @see Trabalho#configuracao 13 | class Pdfconf 14 | 15 | 16 | # @return [PdfForms::Pdf] 17 | attr_reader :pdf 18 | 19 | # @param pdf [PdfForms::Pdf] 20 | def initialize(pdf: nil) 21 | @pdf = pdf 22 | end 23 | 24 | # Atualiza um campo do formulário. Útil para execução de testes. 25 | def update(field, value) 26 | pdf.field(field).instance_variable_set(:@value, value) 27 | end 28 | 29 | # Ler valor do campo. Converte o final de linha para utilizar `universal_newline`. 30 | def ler_campo(campo) 31 | value = pdf.field(campo).value 32 | value = value.encode(:universal_newline => true) if value 33 | value 34 | end 35 | 36 | # Exporta um hash que será utilizado como configuração. 37 | # @return [Hash] que é utilizado como configuração 38 | # @see {Trabalho#configuracao} 39 | def exporta(valida=true) 40 | h = {} 41 | h.merge! caixas_de_texto 42 | h.merge! nivel_educacao 43 | h.merge! ficha_catalografica 44 | h.merge! folha_de_aprovacao 45 | h.merge! projeto 46 | h.merge! apendices 47 | h.merge! anexos 48 | h.merge! errata 49 | h.merge! referencias 50 | h.merge! lista_ilustracoes 51 | h.merge! lista_quadros 52 | h.merge! lista_tabelas 53 | h.merge! lista_siglas 54 | 55 | 56 | # TODO: converter para chaves? 57 | valida_campos(h) if valida 58 | h 59 | end 60 | 61 | private 62 | 63 | def valida_campos(h) 64 | arquivo_de_referencias = h['referencias_caminho'] 65 | raise ArgumentError, "Arquivo de referências configurado não foi encontrado: #{arquivo_de_referencias}" unless File.exist?(arquivo_de_referencias) 66 | 67 | end 68 | 69 | def apendices 70 | {'apendices' => !desativado?('apendices_combo')} 71 | end 72 | def anexos 73 | {'anexos' => !desativado?('anexos_combo')} 74 | end 75 | 76 | def errata 77 | {'errata' => !desativado?('errata_combo')} 78 | end 79 | 80 | def lista_quadros 81 | campo = 'lista_quadros_combo' 82 | {'lista_quadros' => ler_campo(campo).include?('Gerar')} 83 | end 84 | 85 | def lista_ilustracoes 86 | campo = 'lista_ilustracoes_combo' 87 | {'lista_ilustracoes' => ler_campo(campo).include?('Gerar')} 88 | end 89 | 90 | def lista_tabelas 91 | campo = 'lista_tabelas_combo' 92 | {'lista_tabelas' => ler_campo(campo).include?('Gerar')} 93 | end 94 | 95 | def lista_siglas 96 | h = {} 97 | ['siglas','simbolos'].each do |campo| 98 | str = ler_campo(campo) 99 | if (str) then 100 | sa = [] # sa: s-array 101 | str.each_line do |linha| 102 | s,d = linha.split(":") 103 | sa << { 's' => s.strip, 'd' => d ? d.strip : ""} if s 104 | end 105 | h[campo] = sa.empty? ? nil : sa 106 | end 107 | end 108 | h 109 | end 110 | 111 | def referencias 112 | value = ler_campo('referencias_sistema_combo') 113 | if value.include?('Numérica') then 114 | {'referencias_sistema' => 'num'} 115 | elsif value.include?('Alfabética') then 116 | {'referencias_sistema' => 'alf'} 117 | else 118 | raise ArgumentError, "Caixa referencias_sistema_combo com valor inválido" 119 | end 120 | end 121 | 122 | def projeto 123 | campo = 'projeto_combo' 124 | value = ler_campo(campo) 125 | 126 | if value.include?('Projeto') then 127 | {'projeto' => true} 128 | elsif value.include?('final') then 129 | {'projeto' => false} 130 | else 131 | raise ArgumentError, "Caixa #{campo} com valor inválido" 132 | end 133 | end 134 | 135 | def ficha_catalografica 136 | campo = 'ficha_catalografica_combo' 137 | value = ler_campo(campo) 138 | 139 | if value.include?('Sem ficha') then 140 | {'incluir_ficha_catalografica' => false} 141 | elsif value.include?('Incluir ficha') then 142 | {'incluir_ficha_catalografica' => true} 143 | else 144 | raise ArgumentError, "Caixa #{campo} com valor inválido" 145 | end 146 | end 147 | 148 | 149 | def nivel_educacao 150 | campo = 'nivel_educacao_combo' 151 | value = ler_campo(campo) 152 | 153 | if value.include?('Graduação') then 154 | {'graduacao' => true, 'especializacao' => false, 'mestrado' => false, 'doutorado' => false, 'tipo_do_trabalho'=>'Monografia'} 155 | elsif value.include?('Especialização') then 156 | {'graduacao' => false, 'especializacao' => true, 'mestrado' => false, 'doutorado' => false, 'tipo_do_trabalho'=>'Trabalho de final de curso'} 157 | elsif value.include?('Mestrado') then 158 | {'graduacao' => false, 'especializacao' => false, 'mestrado' => true, 'doutorado' => false, 'tipo_do_trabalho'=>'Dissertação'} 159 | elsif value.include?('Doutorado') then 160 | {'graduacao' => false, 'especializacao' => false, 'mestrado' => false, 'doutorado' => true, 'tipo_do_trabalho'=>'Tese'} 161 | else 162 | raise ArgumentError, "Caixa #{campo} com valor inválido" 163 | end 164 | end 165 | 166 | def folha_de_aprovacao 167 | campo = 'folha_de_aprovacao_combo' 168 | value = ler_campo(campo) 169 | 170 | if value.include?('Não gerar') then 171 | {'folha_de_aprovacao' => false} 172 | elsif value.include?('Gerar folha') then 173 | {'folha_de_aprovacao' => true, 'aprovacao_mes' => ler_campo('aprovacao_mes')} 174 | elsif value.include?('escaneada') then 175 | {'incluir_folha_de_aprovacao' => true} 176 | else 177 | raise ArgumentError, "Caixa #{campo} com valor inválido" 178 | end 179 | end 180 | 181 | 182 | def desativado?(campo) 183 | ler_campo(campo).include?('Desativad') # a(o) 184 | end 185 | 186 | # Substitui ',' e ';' por '.' 187 | def atualiza_palavras_chave(h) 188 | ['palavras_chave', 'palabras_clave', 'keywords', 'mots_cles'].each do |p| 189 | if(h[p]) 190 | h[p] = h[p].gsub(/[;,]/, '.') 191 | end 192 | end 193 | end 194 | 195 | def caixas_de_texto 196 | h = {} 197 | pdf.fields.each do |f| 198 | if (f.type == "Text") then 199 | h[f.name] = ler_campo(f.name) 200 | end 201 | end 202 | atualiza_palavras_chave(h) 203 | h 204 | end 205 | end 206 | 207 | end 208 | 209 | 210 | -------------------------------------------------------------------------------- /lib/limarka/trabalho.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | 3 | module Limarka 4 | 5 | # Esta classe representa o seu trabalho acadêmico. 6 | # @author Eduardo de Sanana Medeiros Alexandre 7 | class Trabalho 8 | # Todas as chaves de configuração devem ser string (não utilizar simbolos!) 9 | # @return [Hash] a configuração desse trabalho. 10 | attr_accessor :configuracao 11 | attr_accessor :texto, :anexos, :apendices, :errata 12 | attr_reader :referencias 13 | 14 | def initialize(configuracao: {}, texto: nil, anexos: nil, apendices: nil, referencias_bib: nil, errata: nil) 15 | self.configuracao = configuracao 16 | self.texto = texto 17 | self.anexos = anexos 18 | self.apendices = apendices 19 | self.referencias_bib = referencias_bib 20 | self.errata = errata 21 | end 22 | 23 | # def configuracao=(c) 24 | # # http://stackoverflow.com/questions/800122/best-way-to-convert-strings-to-symbols-in-hash 25 | # @configuracao = c.inject({}){|h,(k,v)| h[k.to_s] = v; h} # convert to strings 26 | # end 27 | 28 | 29 | # Atualiza a configuração do trabalho. 30 | # @param configuracao [Hash] 31 | def configuracao=(configuracao) 32 | @configuracao = configuracao or {} 33 | siglas = @configuracao['siglas'] 34 | if siglas and siglas.empty? then 35 | @configuracao['siglas'] = nil 36 | end 37 | end 38 | 39 | 40 | 41 | def anexos=(a) 42 | @anexos = a 43 | if (a) then 44 | @configuracao.merge!('anexos' => true) 45 | else 46 | @configuracao.merge!('anexos' => false) 47 | end 48 | end 49 | 50 | # @return o valor de `anexos` na configuração. 51 | def anexos? 52 | @configuracao['anexos'] 53 | end 54 | 55 | # @return o valor de `errata` na configuração. 56 | def errata? 57 | @configuracao['errata'] 58 | end 59 | 60 | # Atualiza errata na configuração 61 | def errata=(e) 62 | @errata = e 63 | if (e) then 64 | @configuracao.merge!('errata' => true) 65 | else 66 | @configuracao.merge!('errata' => false) 67 | end 68 | end 69 | 70 | 71 | def apendices=(a) 72 | @apendices = a 73 | if (a) then 74 | @configuracao.merge!('apendices' => true) 75 | else 76 | @configuracao.merge!('apendices' => false) 77 | end 78 | end 79 | 80 | def apendices? 81 | @configuracao['apendices'] 82 | end 83 | 84 | def anexos? 85 | @configuracao['anexos'] 86 | end 87 | 88 | def referencias_bib? 89 | @referencias 90 | end 91 | 92 | def referencias_bib=(ref) 93 | @referencias = ref 94 | end 95 | 96 | def self.default_texto_file 97 | "trabalho-academico.md" 98 | end 99 | def self.default_errata_file 100 | "errata.md" 101 | end 102 | def self.default_anexos_file 103 | "anexos.md" 104 | end 105 | def self.default_apendices_file 106 | "apendices.md" 107 | end 108 | 109 | def self.default_referencias_bib_file 110 | "referencias.bib" 111 | end 112 | 113 | def self.default_configuracao_file 114 | 'configuracao.yaml' 115 | end 116 | 117 | # Ler os arquivos e atualiza a configuração, texto, referências, apendices e anexos. 118 | # @param options opção criada em {Cli} 119 | def atualiza_de_arquivos(options) 120 | self.configuracao = ler_configuracao(options) 121 | puts "Configuração lida: #{configuracao}" if options[:verbose] 122 | # transforma os simbolos em string: http://stackoverflow.com/questions/8379596/how-do-i-convert-a-ruby-hash-so-that-all-of-its-keys-are-symbols?noredirect=1&lq=1 123 | # @configuracao.inject({}){|h,(k,v)| h[k.intern] = v; h} 124 | self.texto = ler_texto(options[:rascunho_file]) 125 | self.referencias_bib = ler_referencias(self.configuracao) 126 | self.apendices = ler_apendices if apendices? 127 | self.anexos = ler_anexos if anexos? 128 | end 129 | 130 | # Ler a configuração. A origem da configuração é determinada pelo valor de `options[:configuracao_yaml]`. 131 | # Se contém valor verdadeiro, ler do arquivo `configuracao.yaml`, caso contrário ler de `configuracao.pdf`. 132 | # @param options [Hash] criado na classe {Cli} 133 | # @return configuracao 134 | # @see {Cli} 135 | def ler_configuracao(options) 136 | if options and options[:configuracao_yaml] then 137 | raise IOError, "Arquivo configuracao.yaml não foi encontrado, talvez esteja executando dentro de um diretório que não contém um projeto válido?" unless File.exist?('configuracao.yaml') 138 | File.open('configuracao.yaml', 'r') {|f| YAML.load(f.read)} 139 | else 140 | raise IOError, "Arquivo configuracao.pdf não foi encontrado, talvez esteja executando dentro de um diretório que não contém um projeto válido?" unless File.exist?('configuracao.pdf') 141 | ler_configuracao_pdf 'configuracao.pdf' 142 | end 143 | end 144 | 145 | # Ler configuração do arquivo pdf 146 | # @param file arquivo pdf 147 | # @return [Hash] configuração exportada a partir da leitura do arquivo pdf 148 | # @see Pdfconf#exporta 149 | def ler_configuracao_pdf(file) 150 | raise IOError, 'Arquivo não encontrado: ' + file unless File.exist? (file) 151 | pdf = PdfForms::Pdf.new file, (PdfForms.new 'pdftk'), utf8_fields: true 152 | pdfconf = Limarka::Pdfconf.new(pdf: pdf) 153 | pdfconf.exporta 154 | end 155 | 156 | def ler_apendices 157 | File.open('apendices.md', 'r') {|f| f.read} if apendices? 158 | end 159 | 160 | def ler_anexos 161 | File.open('anexos.md', 'r') {|f| f.read} if anexos? 162 | end 163 | 164 | def ler_texto(rascunho_file) 165 | # Ficou estranho esse código, merece um refactory. 166 | if (rascunho_file) then 167 | File.open(rascunho_file, 'r') {|f| f.read} 168 | else 169 | File.open('trabalho-academico.md', 'r') {|f| f.read} 170 | end 171 | end 172 | 173 | # Ler referências do arquivo de referências. 174 | # @return [String] conteúdo do arquivo de referências 175 | def ler_referencias(configuracao) 176 | arquivo_de_referencias = configuracao['referencias_caminho'] 177 | if File.exist?(arquivo_de_referencias) 178 | return File.open(arquivo_de_referencias, 'r') {|f| f.read} 179 | else 180 | return "" 181 | end 182 | end 183 | 184 | # Salva o hash no formato yaml no caminho especificado. Adiciona o `\n---\n` 185 | # para manter compatível com o leitor pandoc. 186 | # @param hash que será exportado. 187 | # @param caminho [String] aonde será salvo o arquivo 188 | def self.save_yaml(hash, caminho) 189 | File.open(caminho, 'w') do |f| 190 | f.write YAML.dump(hash) 191 | f.write "\n---\n" 192 | end 193 | end 194 | 195 | # Salva os conteúdos do trabalho em arquivos no diretórios especificado. 196 | def save(dir) 197 | Dir.chdir(dir) do 198 | File.open(Trabalho.default_texto_file, 'w'){|f| f.write texto} if texto 199 | File.open(configuracao['referencias_caminho'], 'w'){|f| f.write referencias} if referencias_bib? 200 | File.open(Trabalho.default_anexos_file, 'w'){|f| f.write anexos} if anexos? 201 | File.open(Trabalho.default_apendices_file, 'w'){|f| f.write apendices} if apendices? 202 | File.open(Trabalho.default_errata_file, 'w'){|f| f.write errata} if errata? 203 | Limarka::Trabalho.save_yaml(configuracao, Trabalho.default_configuracao_file) 204 | end 205 | 206 | end 207 | 208 | def self.formato_padrao 209 | "markdown+raw_tex" 210 | end 211 | 212 | def formato 213 | result = Trabalho.formato_padrao 214 | unless @configuracao["formato"].nil? then 215 | result << @configuracao["formato"] 216 | end 217 | result 218 | end 219 | 220 | end 221 | end 222 | -------------------------------------------------------------------------------- /lib/limarka/conversor.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | require "thor" 3 | require 'yaml' 4 | require 'colorize' 5 | require 'open3' 6 | require 'fileutils' 7 | require 'bibtex' 8 | require 'tempfile' 9 | 10 | 11 | module Limarka 12 | 13 | # Essa class é responsável por ser a abstração de converter o arquivo 14 | # em Markdown para Latex. 15 | class Conversor 16 | # o trabalho 17 | attr_accessor :t 18 | # opções de execução 19 | # @see Cli 20 | attr_accessor :options 21 | attr_accessor :pretextual_tex 22 | attr_accessor :postextual_tex 23 | attr_accessor :texto_tex 24 | attr_accessor :txt 25 | attr_accessor :usa_pdftotext 26 | 27 | # @param trabalho [Trabalho] 28 | def initialize(trabalho, options) 29 | self.t = trabalho 30 | self.options = options 31 | self.usa_pdftotext = true 32 | end 33 | 34 | 35 | ## Converte o trabalho para Latex 36 | def convert() 37 | FileUtils.mkdir_p(options[:output_dir]) 38 | 39 | # A invocação de pandoc passando parâmetro como --before-body necessita 40 | # de ser realizado através de arquivos, portanto, serão criados arquivos 41 | # temporários para sua execução 42 | pretextual_tempfile = Tempfile.new('pretextual') 43 | postextual_tempfile = Tempfile.new('postextual') 44 | begin 45 | pretextual(pretextual_tempfile) 46 | postextual(postextual_tempfile) 47 | textual(pretextual_tempfile,postextual_tempfile) 48 | 49 | ensure 50 | pretextual_tempfile.close 51 | pretextual_tempfile.unlink 52 | postextual_tempfile.close 53 | postextual_tempfile.unlink 54 | end 55 | end 56 | 57 | 58 | ## Compila tex_file no diretorio atual, retorna o conteudo somente texto do PDF 59 | def compila 60 | Dir.chdir(options[:output_dir]) do 61 | basename = File.basename(texto_tex_file, '.tex') 62 | if system ("whereis texliveonfly") 63 | system "texliveonfly -c xelatex -f #{basename}", :out=>'xxx-texliveonfly-std.txt' 64 | end 65 | system "latexmk --quiet --xelatex -f #{basename}", :out=>'xxx-latexmk-std.txt', :err=>'xxx-latexmk-erros.txt' 66 | if (usa_pdftotext) then 67 | system "pdftotext -enc UTF-8 #{basename}.pdf" 68 | # Comando sed para corrigir junção do fi (ligatures) 69 | # https://superuser.com/questions/220363/cleaning-up-pdftotext-font-issues/231637#231637 70 | system "sed -i -e 's/ffi/ffi/g' -e 's/fi/fi/g' -e 's/ff/ff/g' -e 's/fl/fl/g' -e 's/ffl/ffl/g' #{basename}.txt" 71 | File.open("#{basename}.txt", 'r') {|f| @txt = f.read} 72 | end 73 | end 74 | end 75 | 76 | def hash_to_yaml(h) 77 | s = StringIO.new 78 | s << h.to_yaml 79 | s << "---\n\n" 80 | s.string 81 | end 82 | 83 | 84 | 85 | PRETEXTUAL = "templates/pretextual.tex" 86 | 87 | # Escreve no arquivo o conteúdo gerado referente ao pretextual do documento. 88 | # @param tempfile arquivo onde será escrito 89 | def pretextual(tempfile) 90 | s = StringIO.new 91 | necessita_de_arquivo_de_texto = ["errata"] 92 | ["folha_de_rosto", "errata", "folha_de_aprovacao", "dedicatoria", "agradecimentos", 93 | "epigrafe", "resumo", "abstract", "lista_ilustracoes", "lista_tabelas", 94 | "lista_siglas", "lista_simbolos", "sumario"].each_with_index do |secao,indice| 95 | template = "pretextual#{indice+1}-#{secao}" 96 | Open3.popen3("pandoc -f #{@t.formato} \"--data-dir=#{options[:templates_dir]}\" --template=#{template} -t latex --filter #{pandoc_abnt_path}") {|stdin, stdout, stderr, wait_thr| 97 | stdin.write(hash_to_yaml(t.configuracao)) 98 | stdin.write("\n") 99 | if t.errata? and necessita_de_arquivo_de_texto.include?(secao) then 100 | arquivo_de_entrada = "#{secao}.md" 101 | conteudo = File.read(arquivo_de_entrada) 102 | stdin.write(conteudo) 103 | end 104 | stdin.close 105 | s << stdout.read 106 | exit_status = wait_thr.value # Process::Status object returned. 107 | if(exit_status!=0) then puts ("Erro: " + stderr.read).red end 108 | } 109 | end 110 | @pretextual_tex = s.string 111 | File.open(tempfile, 'w') { |file| file.write(pretextual_tex) } 112 | # puts "#{PRETEXTUAL} criado".green 113 | end 114 | 115 | POSTEXTUAL = "templates/postextual.tex" 116 | # Escreve no arquivo o conteúdo gerado referente ao pós-textual do documento. 117 | # @param tempfile arquivo onde será escrito 118 | def postextual(tempfile) 119 | # Referências (obrigatório) 120 | # Glossário (opcional) 121 | # Apêndice (opcional) 122 | # Anexo (opcional) 123 | # Índice (opcional) 124 | 125 | s = StringIO.new 126 | 127 | s << secao_referencias 128 | s << secao_glossario 129 | s << secao_apendices 130 | s << secao_anexos 131 | s << secao_indice 132 | 133 | cria_xxx_referencias 134 | 135 | @postextual_tex = s.string 136 | File.open(tempfile, 'w') { |file| file.write(postextual_tex) } 137 | end 138 | 139 | # Cria arquivo temporário de referencias. 140 | # 141 | # Separa o título em subtítulo quando contém `:`. 142 | def cria_xxx_referencias 143 | referencias_tempfile = Tempfile.new('referencias') 144 | File.open(referencias_tempfile, 'w') {|file| file.write(t.referencias)} 145 | b = BibTeX.open(referencias_tempfile.path) 146 | b.each do |entry| 147 | if entry.title.include?(':') then 148 | s = entry.title.split(':') 149 | if entry.title.start_with?("{") and entry.title.end_with?("}") then 150 | s[0] = s[0][1..-1] # remove { 151 | s[1] = s[1][1..-1] # remove } 152 | end 153 | entry['title'] = s[0].strip 154 | entry['subtitle'] = s[1].strip 155 | end 156 | end 157 | 158 | b.save_to referencias_bib_file 159 | end 160 | 161 | def secao_referencias 162 | secao("postextual1-referencias", false, t.referencias) 163 | end 164 | 165 | def secao_apendices 166 | secao("postextual3-apendices", t.apendices?, t.apendices) 167 | end 168 | 169 | def secao_anexos 170 | secao("postextual4-anexos", t.anexos?, t.anexos) 171 | end 172 | 173 | # @note Ainda não implementado 174 | def secao_glossario 175 | end 176 | 177 | # @note Ainda não implementado 178 | def secao_indice 179 | end 180 | 181 | def filtros_lua 182 | result = "" 183 | if options[:filtros_lua] 184 | result = options[:filtros_lua].reduce("") { |cmd, filtro| "#{cmd} --lua-filter #{filtro}" } 185 | end 186 | result 187 | end 188 | 189 | def filtros 190 | result = "" 191 | if options[:filtros] 192 | result = options[:filtros].reduce("") { |cmd, filtro| "#{cmd} --filter #{filtro}" } 193 | end 194 | result 195 | end 196 | 197 | def textual(pretextual_tempfile, postextual_tempfile) 198 | valida_yaml 199 | Open3.popen3("pandoc -f #{@t.formato} -t latex -s \"--data-dir=#{options[:templates_dir]}\" --template=trabalho-academico --top-level-division=chapter --include-before-body=#{pretextual_tempfile.path} --include-after-body=#{postextual_tempfile.path} #{filtros_lua} #{filtros} --filter #{pandoc_abnt_path}") {|stdin, stdout, stderr, wait_thr| 200 | stdin.write(File.read(options[:templates_dir] + '/templates/configuracao-tecnica.yaml')) 201 | stdin.write("\n") 202 | stdin.write(hash_to_yaml(t.configuracao)) 203 | stdin.write("\n") 204 | stdin.write(t.texto) 205 | stdin.close 206 | @texto_tex = stdout.read 207 | exit_status = wait_thr.value # Process::Status object returned. 208 | if(exit_status!=0) then puts ("Erro: " + stderr.read).red end 209 | } 210 | File.open(texto_tex_file, 'w') { |f| f.write(@texto_tex)} 211 | end 212 | 213 | def pretextual_tex_file 214 | "#{options[:output_dir]}/xxx-pretextual.tex" 215 | end 216 | def postextual_tex_file 217 | "#{options[:output_dir]}/xxx-postextual.tex" 218 | end 219 | 220 | def texto_tex_file 221 | "#{options[:output_dir]}/#{Conversor.tex_file}" 222 | end 223 | def pdf_file 224 | texto_tex_file.sub('.tex','.pdf') 225 | end 226 | 227 | def referencias_bib_file 228 | "#{options[:output_dir]}/xxx-referencias.bib" 229 | end 230 | 231 | def valida_yaml 232 | # não faz nada por enquanto 233 | end 234 | 235 | def self.tex_file() 236 | "xxx-trabalho-academico.tex" 237 | end 238 | 239 | private 240 | 241 | # Utilizado para gerar seções específicas do documento 242 | def secao(template, condicao_para_conteudo, conteudo_externo) 243 | s = StringIO.new 244 | 245 | Open3.popen3("pandoc -f #{@t.formato} \"--data-dir=#{options[:templates_dir]}\" --template=#{template} --top-level-division=chapter -t latex --filter #{pandoc_abnt_path}") {|stdin, stdout, stderr, wait_thr| 246 | stdin.write(hash_to_yaml(t.configuracao)) 247 | stdin.write("\n") 248 | if (condicao_para_conteudo) then 249 | stdin.write(conteudo_externo) 250 | stdin.write("\n") 251 | end 252 | stdin.close 253 | s << stdout.read 254 | exit_status = wait_thr.value # Process::Status object returned. 255 | if(exit_status!=0) then puts ("Erro: " + stderr.read).red end 256 | } 257 | s.string 258 | end 259 | 260 | def pandoc_abnt_path 261 | ENV["PANDOC_ABNT_BAT"] or "pandoc_abnt" 262 | end 263 | 264 | end 265 | end 266 | -------------------------------------------------------------------------------- /spec/latex/exemplo-minimo/xxx-Monografia.tex: -------------------------------------------------------------------------------- 1 | %%%%%%%%%%%%%%%%%%%%%%%%%5 2 | %% abtex2-modelo-trabalho-academico.tex, v laurocesar 3 | %% Copyright 2012- by abnTeX2 group at http://www.abntex.net.br/ 4 | %% 5 | %% This work may be distributed and/or modified under the 6 | %% conditions of the LaTeX Project Public License, either version 1.3 7 | %% of this license or (at your option) any later version. 8 | %% The latest version of this license is in 9 | %% http://www.latex-project.org/lppl.txt 10 | %% and version 1.3 or later is part of all distributions of LaTeX 11 | %% version 2005/12/01 or later. 12 | %% 13 | %% This work has the LPPL maintenance status `maintained'. 14 | %% 15 | %% The Current Maintainer of this work is the abnTeX2 team, led 16 | %% by Lauro César Araujo. Further information are available on 17 | %% http://www.abntex.net.br/ 18 | %% 19 | %% This work consists of the files abntex2-modelo-trabalho-academico.tex, 20 | %% abntex2-modelo-include-comandos and abntex2-modelo-references.bib 21 | %% 22 | 23 | % ------------------------------------------------------------------------ 24 | % ------------------------------------------------------------------------ 25 | % abnTeX2: Modelo de Trabalho Academico (tese de doutorado, dissertacao de 26 | % mestrado e trabalhos monograficos em geral) em conformidade com 27 | % ABNT NBR 14724:2011: Informacao e documentacao - Trabalhos academicos - 28 | % Apresentacao 29 | % ------------------------------------------------------------------------ 30 | % ------------------------------------------------------------------------ 31 | 32 | \documentclass[ 33 | % -- opções da classe memoir -- 34 | 12pt, % tamanho da fonte 35 | openright, % capítulos começam em pág ímpar (insere página vazia caso preciso) 36 | twoside, % para impressão em recto e verso. Oposto a oneside 37 | a4paper, % tamanho do papel. 38 | % -- opções da classe abntex2 -- 39 | %chapter=TITLE, % títulos de capítulos convertidos em letras maiúsculas 40 | %section=TITLE, % títulos de seções convertidos em letras maiúsculas 41 | %subsection=TITLE, % títulos de subseções convertidos em letras maiúsculas 42 | %subsubsection=TITLE,% títulos de subsubseções convertidos em letras maiúsculas 43 | % -- opções do pacote babel -- 44 | english, % idioma adicional para hifenização 45 | french, % idioma adicional para hifenização 46 | spanish, % idioma adicional para hifenização 47 | brazil % o último idioma é o principal do documento 48 | ]{abntex2} 49 | 50 | % --- 51 | % Pacotes básicos 52 | % --- 53 | \usepackage{lmodern} % Usa a fonte Latin Modern 54 | \usepackage[T1]{fontenc} % Selecao de codigos de fonte. 55 | \usepackage[utf8]{inputenc} % Codificacao do documento (conversão automática dos acentos) 56 | \usepackage{lastpage} % Usado pela Ficha catalográfica 57 | \usepackage{indentfirst} % Indenta o primeiro parágrafo de cada seção. 58 | \usepackage{color} % Controle das cores 59 | \usepackage{graphicx} % Inclusão de gráficos 60 | \usepackage{microtype} % para melhorias de justificação 61 | % --- 62 | 63 | % --- 64 | % Pacotes adicionais, usados apenas no âmbito do Modelo Canônico do abnteX2 65 | % --- 66 | \usepackage{lipsum} % para geração de dummy text 67 | % --- 68 | 69 | % --- 70 | % Pacotes de citações 71 | % --- 72 | \usepackage[brazilian,hyperpageref]{backref} % Paginas com as citações na bibl 73 | \usepackage[alf]{abntex2cite} % Citações padrão ABNT 74 | 75 | % --- 76 | % CONFIGURAÇÕES DE PACOTES 77 | % --- 78 | 79 | % --- 80 | % Configurações do pacote backref 81 | % Usado sem a opção hyperpageref de backref 82 | \renewcommand{\backrefpagesname}{Citado na(s) página(s):~} 83 | % Texto padrão antes do número das páginas 84 | \renewcommand{\backref}{} 85 | % Define os textos da citação 86 | \renewcommand*{\backrefalt}[4]{ 87 | \ifcase #1 % 88 | Nenhuma citação no texto.% 89 | \or 90 | Citado na página #2.% 91 | \else 92 | Citado #1 vezes nas páginas #2.% 93 | \fi}% 94 | % --- 95 | 96 | % --- 97 | % Informações de dados para CAPA e FOLHA DE ROSTO 98 | % --- 99 | \titulo{Apresentação do Limarka} 100 | \autor{Eduardo de Santana Medeiros Alexandre} 101 | \data{2016} 102 | \local{João Pessoa} 103 | \orientador{Fulano de tal} 104 | \coorientador{} 105 | \instituicao{% 106 | Universidade Federal da Paraíba 107 | \par 108 | Computação 109 | } 110 | \tipotrabalho{Monografia} 111 | 112 | % O preambulo deve conter o tipo do trabalho, o objetivo (propósito), 113 | % o nome da instituição e a área de concentração. 114 | % Esse texto irá compor a Folha de Rosto e Folha de Aprovação. 115 | \preambulo{ 116 | % Propósito gerado automaticamente. 117 | Monografia apresentada ao Curso de Computação da Universidade Federal da Paraíba, como requisito parcial para obtenção do grau de Bacharel em Computação. 118 | \newline\textbf{Área de concentração}: Computação. 119 | }%% fim do preambulo 120 | 121 | 122 | 123 | 124 | % --- 125 | % Configurações de aparência do PDF final 126 | 127 | % alterando o aspecto da cor azul 128 | \definecolor{blue}{RGB}{41,5,195} 129 | 130 | % informações do PDF 131 | \makeatletter 132 | \hypersetup{ 133 | %pagebackref=true, 134 | pdftitle={\@title}, 135 | pdfauthor={\@author}, 136 | pdfsubject={\imprimirpreambulo}, 137 | pdfcreator={LaTeX with abnTeX2 and Limarka}, 138 | pdfkeywords={abnt}{latex}{abntex}{abntex2}{trabalho acadêmico}, 139 | colorlinks=true, % false: boxed links; true: colored links 140 | linkcolor=blue, % color of internal links 141 | citecolor=blue, % color of links to bibliography 142 | filecolor=magenta, % color of file links 143 | urlcolor=blue, 144 | bookmarksdepth=4 145 | } 146 | \makeatother 147 | % --- 148 | 149 | % --- 150 | % Espaçamentos entre linhas e parágrafos 151 | % --- 152 | 153 | % O tamanho do parágrafo é dado por: 154 | \setlength{\parindent}{1.3cm} 155 | 156 | % Controle do espaçamento entre um parágrafo e outro: 157 | \setlength{\parskip}{0.2cm} % tente também \onelineskip 158 | 159 | % --- 160 | % compila o indice 161 | % --- 162 | \makeindex 163 | % --- 164 | 165 | %--- 166 | % CONFIGURAÇÕES EXTRA DO LIMARKA 167 | %--- 168 | 169 | % Configura citações de pandoc para 4cm à esquerda (utiliza o ambiente quote) 170 | \renewenvironment{quote} 171 | {\small\list{}{\rightmargin=0.1cm \leftmargin=4cm}% 172 | \item\relax} 173 | {\endlist} 174 | 175 | % Para incluir páginas PDF (ficha catalografica e folha de aprovação) 176 | \usepackage[dvipsnames]{xcolor} % http://tex.stackexchange.com/questions/124636/package-xcolor-error-undefined-colors-maroon-royal-blue-when-master-has-pdf 177 | \usepackage{pdfpages} 178 | \usepackage{longtable} % para as tabelas 179 | %\usepackage{floatrow} 180 | %\floatsetup[figure]{capposition=top} 181 | 182 | 183 | %% 184 | %% Esse modelo é responsável pela impressão dos seguintes elementos: 185 | %% Capa, Folha de rosto e Ficha catalográfica. 186 | 187 | 188 | % ---- 189 | % Início do documento 190 | % ---- 191 | \begin{document} 192 | 193 | % Seleciona o idioma do documento (conforme pacotes do babel) 194 | %\selectlanguage{english} 195 | \selectlanguage{brazil} 196 | 197 | % Retira espaço extra obsoleto entre as frases. 198 | \frenchspacing 199 | 200 | % ---------------------------------------------------------- 201 | % ELEMENTOS PRÉ-TEXTUAIS 202 | % ---------------------------------------------------------- 203 | % \pretextual 204 | 205 | % --- 206 | % Capa 207 | % --- 208 | \imprimircapa 209 | % --- 210 | 211 | % ---------------------------------------------------------- 212 | % ELEMENTOS PRÉ-TEXTUAIS 213 | % ---------------------------------------------------------- 214 | % \pretextual 215 | 216 | % --- 217 | % Folha de rosto: sempre será impressa 218 | % --- 219 | \imprimirfolhaderosto 220 | % --- 221 | % Sem ficha catalográfica 222 | % --- 223 | % --- 224 | 225 | 226 | % --- 227 | % ERRATA: Sem errata 228 | % --- 229 | 230 | 231 | % --- 232 | % Sem Folha de aprovação 233 | % --- 234 | % --- 235 | 236 | % --- 237 | % Dedicatória 238 | % --- 239 | % --- 240 | % Agradecimentos 241 | % --- 242 | % --- 243 | % Epígrafe 244 | % --- 245 | % --- 246 | 247 | % --- 248 | % Resumo na língua vernácula (obrigatório) 249 | % --- 250 | 251 | 252 | % --- 253 | % Resumo em língua estrangeira (obrigatório) 254 | % --- 255 | 256 | 257 | 258 | % --- 259 | 260 | % --- 261 | % Lista de ilustrações (opcional): não utilizando. 262 | % --- 263 | % --- 264 | % Lista de tabelas (opcional): não utilizando 265 | % --- 266 | 267 | % --- 268 | % Lista de abreviaturas e siglas (opcional) 269 | % --- 270 | \begin{siglas} 271 | \item[ABNT] Associação Brasileira de Normas Técnicas 272 | \end{siglas} 273 | % --- 274 | 275 | % --- 276 | % Lista de símbolos (opcional): AUSENTE 277 | % --- 278 | % --- 279 | % Sumário 280 | % --- 281 | \pdfbookmark[0]{\contentsname}{toc} 282 | \tableofcontents* 283 | \cleardoublepage 284 | % --- 285 | 286 | 287 | % ---------------------------------------------------------- 288 | % ELEMENTOS TEXTUAIS 289 | % ---------------------------------------------------------- 290 | \textual 291 | 292 | %% 293 | %% Texto será incluído aqui 294 | %% 295 | \chapter{Chapter example} 296 | 297 | Texto de introdução aqui. 298 | 299 | 300 | % ---------------------------------------------------------- 301 | % ELEMENTOS PÓS-TEXTUAIS 302 | % ---------------------------------------------------------- 303 | \postextual 304 | % ---------------------------------------------------------- 305 | 306 | % ---------------------------------------------------------- 307 | % Início dos ELEMENTOS PÓS-TEXTUAIS 308 | % ---------------------------------------------------------- 309 | \postextual 310 | % ---------------------------------------------------------- 311 | 312 | % ---------------------------------------------------------- 313 | % Referências bibliográficas 314 | % ---------------------------------------------------------- 315 | \bibliography{xxx-referencias} 316 | 317 | 318 | 319 | \end{document} 320 | 321 | -------------------------------------------------------------------------------- /spec/latex/exemplo-minimo-com-acentos/xxx-Monografia.tex: -------------------------------------------------------------------------------- 1 | %%%%%%%%%%%%%%%%%%%%%%%%%5 2 | %% abtex2-modelo-trabalho-academico.tex, v laurocesar 3 | %% Copyright 2012- by abnTeX2 group at http://www.abntex.net.br/ 4 | %% 5 | %% This work may be distributed and/or modified under the 6 | %% conditions of the LaTeX Project Public License, either version 1.3 7 | %% of this license or (at your option) any later version. 8 | %% The latest version of this license is in 9 | %% http://www.latex-project.org/lppl.txt 10 | %% and version 1.3 or later is part of all distributions of LaTeX 11 | %% version 2005/12/01 or later. 12 | %% 13 | %% This work has the LPPL maintenance status `maintained'. 14 | %% 15 | %% The Current Maintainer of this work is the abnTeX2 team, led 16 | %% by Lauro César Araujo. Further information are available on 17 | %% http://www.abntex.net.br/ 18 | %% 19 | %% This work consists of the files abntex2-modelo-trabalho-academico.tex, 20 | %% abntex2-modelo-include-comandos and abntex2-modelo-references.bib 21 | %% 22 | 23 | % ------------------------------------------------------------------------ 24 | % ------------------------------------------------------------------------ 25 | % abnTeX2: Modelo de Trabalho Academico (tese de doutorado, dissertacao de 26 | % mestrado e trabalhos monograficos em geral) em conformidade com 27 | % ABNT NBR 14724:2011: Informacao e documentacao - Trabalhos academicos - 28 | % Apresentacao 29 | % ------------------------------------------------------------------------ 30 | % ------------------------------------------------------------------------ 31 | 32 | \documentclass[ 33 | % -- opções da classe memoir -- 34 | 12pt, % tamanho da fonte 35 | openright, % capítulos começam em pág ímpar (insere página vazia caso preciso) 36 | twoside, % para impressão em recto e verso. Oposto a oneside 37 | a4paper, % tamanho do papel. 38 | % -- opções da classe abntex2 -- 39 | %chapter=TITLE, % títulos de capítulos convertidos em letras maiúsculas 40 | %section=TITLE, % títulos de seções convertidos em letras maiúsculas 41 | %subsection=TITLE, % títulos de subseções convertidos em letras maiúsculas 42 | %subsubsection=TITLE,% títulos de subsubseções convertidos em letras maiúsculas 43 | % -- opções do pacote babel -- 44 | english, % idioma adicional para hifenização 45 | french, % idioma adicional para hifenização 46 | spanish, % idioma adicional para hifenização 47 | brazil % o último idioma é o principal do documento 48 | ]{abntex2} 49 | 50 | % --- 51 | % Pacotes básicos 52 | % --- 53 | \usepackage{lmodern} % Usa a fonte Latin Modern 54 | \usepackage[T1]{fontenc} % Selecao de codigos de fonte. 55 | \usepackage[utf8]{inputenc} % Codificacao do documento (conversão automática dos acentos) 56 | \usepackage{lastpage} % Usado pela Ficha catalográfica 57 | \usepackage{indentfirst} % Indenta o primeiro parágrafo de cada seção. 58 | \usepackage{color} % Controle das cores 59 | \usepackage{graphicx} % Inclusão de gráficos 60 | \usepackage{microtype} % para melhorias de justificação 61 | % --- 62 | 63 | % --- 64 | % Pacotes adicionais, usados apenas no âmbito do Modelo Canônico do abnteX2 65 | % --- 66 | \usepackage{lipsum} % para geração de dummy text 67 | % --- 68 | 69 | % --- 70 | % Pacotes de citações 71 | % --- 72 | \usepackage[brazilian,hyperpageref]{backref} % Paginas com as citações na bibl 73 | \usepackage[alf]{abntex2cite} % Citações padrão ABNT 74 | 75 | % --- 76 | % CONFIGURAÇÕES DE PACOTES 77 | % --- 78 | 79 | % --- 80 | % Configurações do pacote backref 81 | % Usado sem a opção hyperpageref de backref 82 | \renewcommand{\backrefpagesname}{Citado na(s) página(s):~} 83 | % Texto padrão antes do número das páginas 84 | \renewcommand{\backref}{} 85 | % Define os textos da citação 86 | \renewcommand*{\backrefalt}[4]{ 87 | \ifcase #1 % 88 | Nenhuma citação no texto.% 89 | \or 90 | Citado na página #2.% 91 | \else 92 | Citado #1 vezes nas páginas #2.% 93 | \fi}% 94 | % --- 95 | 96 | % --- 97 | % Informações de dados para CAPA e FOLHA DE ROSTO 98 | % --- 99 | \titulo{Apresentação do Limarka} 100 | \autor{Eduardo de Santana Medeiros Alexandre} 101 | \data{2016} 102 | \local{João Pessoa} 103 | \orientador{Fulano de tal} 104 | \coorientador{} 105 | \instituicao{% 106 | Universidade Federal da Paraíba 107 | \par 108 | Computação 109 | } 110 | \tipotrabalho{Monografia} 111 | 112 | % O preambulo deve conter o tipo do trabalho, o objetivo (propósito), 113 | % o nome da instituição e a área de concentração. 114 | % Esse texto irá compor a Folha de Rosto e Folha de Aprovação. 115 | \preambulo{ 116 | % Propósito gerado automaticamente. 117 | Monografia apresentada ao Curso de Computação da Universidade Federal da Paraíba, como requisito parcial para obtenção do grau de Bacharel em Computação. 118 | \newline\textbf{Área de concentração}: Computação. 119 | }%% fim do preambulo 120 | 121 | 122 | 123 | 124 | % --- 125 | % Configurações de aparência do PDF final 126 | 127 | % alterando o aspecto da cor azul 128 | \definecolor{blue}{RGB}{41,5,195} 129 | 130 | % informações do PDF 131 | \makeatletter 132 | \hypersetup{ 133 | %pagebackref=true, 134 | pdftitle={\@title}, 135 | pdfauthor={\@author}, 136 | pdfsubject={\imprimirpreambulo}, 137 | pdfcreator={LaTeX with abnTeX2 and Limarka}, 138 | pdfkeywords={abnt}{latex}{abntex}{abntex2}{trabalho acadêmico}, 139 | colorlinks=true, % false: boxed links; true: colored links 140 | linkcolor=blue, % color of internal links 141 | citecolor=blue, % color of links to bibliography 142 | filecolor=magenta, % color of file links 143 | urlcolor=blue, 144 | bookmarksdepth=4 145 | } 146 | \makeatother 147 | % --- 148 | 149 | % --- 150 | % Espaçamentos entre linhas e parágrafos 151 | % --- 152 | 153 | % O tamanho do parágrafo é dado por: 154 | \setlength{\parindent}{1.3cm} 155 | 156 | % Controle do espaçamento entre um parágrafo e outro: 157 | \setlength{\parskip}{0.2cm} % tente também \onelineskip 158 | 159 | % --- 160 | % compila o indice 161 | % --- 162 | \makeindex 163 | % --- 164 | 165 | %--- 166 | % CONFIGURAÇÕES EXTRA DO LIMARKA 167 | %--- 168 | 169 | % Configura citações de pandoc para 4cm à esquerda (utiliza o ambiente quote) 170 | \renewenvironment{quote} 171 | {\small\list{}{\rightmargin=0.1cm \leftmargin=4cm}% 172 | \item\relax} 173 | {\endlist} 174 | 175 | % Para incluir páginas PDF (ficha catalografica e folha de aprovação) 176 | \usepackage[dvipsnames]{xcolor} % http://tex.stackexchange.com/questions/124636/package-xcolor-error-undefined-colors-maroon-royal-blue-when-master-has-pdf 177 | \usepackage{pdfpages} 178 | \usepackage{longtable} % para as tabelas 179 | %\usepackage{floatrow} 180 | %\floatsetup[figure]{capposition=top} 181 | 182 | 183 | %% 184 | %% Esse modelo é responsável pela impressão dos seguintes elementos: 185 | %% Capa, Folha de rosto e Ficha catalográfica. 186 | 187 | 188 | % ---- 189 | % Início do documento 190 | % ---- 191 | \begin{document} 192 | 193 | % Seleciona o idioma do documento (conforme pacotes do babel) 194 | %\selectlanguage{english} 195 | \selectlanguage{brazil} 196 | 197 | % Retira espaço extra obsoleto entre as frases. 198 | \frenchspacing 199 | 200 | % ---------------------------------------------------------- 201 | % ELEMENTOS PRÉ-TEXTUAIS 202 | % ---------------------------------------------------------- 203 | % \pretextual 204 | 205 | % --- 206 | % Capa 207 | % --- 208 | \imprimircapa 209 | % --- 210 | 211 | % ---------------------------------------------------------- 212 | % ELEMENTOS PRÉ-TEXTUAIS 213 | % ---------------------------------------------------------- 214 | % \pretextual 215 | 216 | % --- 217 | % Folha de rosto: sempre será impressa 218 | % --- 219 | \imprimirfolhaderosto 220 | % --- 221 | % Sem ficha catalográfica 222 | % --- 223 | % --- 224 | 225 | 226 | % --- 227 | % ERRATA: Sem errata 228 | % --- 229 | 230 | 231 | % --- 232 | % Sem Folha de aprovação 233 | % --- 234 | % --- 235 | 236 | % --- 237 | % Dedicatória 238 | % --- 239 | % --- 240 | % Agradecimentos 241 | % --- 242 | % --- 243 | % Epígrafe 244 | % --- 245 | % --- 246 | 247 | % --- 248 | % Resumo na língua vernácula (obrigatório) 249 | % --- 250 | 251 | 252 | % --- 253 | % Resumo em língua estrangeira (obrigatório) 254 | % --- 255 | 256 | 257 | 258 | % --- 259 | 260 | % --- 261 | % Lista de ilustrações (opcional): não utilizando. 262 | % --- 263 | % --- 264 | % Lista de tabelas (opcional): não utilizando 265 | % --- 266 | 267 | % --- 268 | % Lista de abreviaturas e siglas (opcional) 269 | % --- 270 | \begin{siglas} 271 | \item[ABNT] Associação Brasileira de Normas Técnicas 272 | \end{siglas} 273 | % --- 274 | 275 | % --- 276 | % Lista de símbolos (opcional): AUSENTE 277 | % --- 278 | % --- 279 | % Sumário 280 | % --- 281 | \pdfbookmark[0]{\contentsname}{toc} 282 | \tableofcontents* 283 | \cleardoublepage 284 | % --- 285 | 286 | 287 | % ---------------------------------------------------------- 288 | % ELEMENTOS TEXTUAIS 289 | % ---------------------------------------------------------- 290 | \textual 291 | 292 | %% 293 | %% Texto será incluído aqui 294 | %% 295 | \chapter{Introdução} 296 | 297 | Texto de introdução aqui. 298 | 299 | 300 | % ---------------------------------------------------------- 301 | % ELEMENTOS PÓS-TEXTUAIS 302 | % ---------------------------------------------------------- 303 | \postextual 304 | % ---------------------------------------------------------- 305 | 306 | % ---------------------------------------------------------- 307 | % Início dos ELEMENTOS PÓS-TEXTUAIS 308 | % ---------------------------------------------------------- 309 | \postextual 310 | % ---------------------------------------------------------- 311 | 312 | % ---------------------------------------------------------- 313 | % Referências bibliográficas 314 | % ---------------------------------------------------------- 315 | \bibliography{xxx-referencias} 316 | 317 | 318 | 319 | \end{document} 320 | 321 | -------------------------------------------------------------------------------- /spec/trabalho_spec.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | require 'spec_helper' 3 | require 'limarka' 4 | 5 | describe Limarka::Trabalho do 6 | let (:texto) {'# Texto'} 7 | let (:anexos) {'# Anexo1\nTexto'} 8 | let (:configuracao) { {'title' => 'algo'} } 9 | let (:apendices) {'# Apendice1'} 10 | let (:referencias_bib) {'@book {}'} 11 | let (:errata) {'Errata1'} 12 | let(:test_dir) {'tmp/trabalho'} 13 | 14 | describe '#new' do 15 | context 'com argumentos' do 16 | let(:t) {Limarka::Trabalho.new(configuracao: configuracao, texto: texto, anexos: anexos, apendices: apendices, referencias_bib: referencias_bib)} 17 | it 'cria trabalho com as propriedades' do 18 | expect(t.texto).to eq(texto) 19 | expect(t.anexos).to eq(anexos) 20 | expect(t.apendices).to eq(apendices) 21 | expect(t.referencias).to eq(referencias_bib) 22 | expect(t.configuracao).to include(configuracao) 23 | end 24 | end 25 | end 26 | 27 | describe '.default_texto_file' do 28 | it 'returna trabalho-academico.md' do 29 | expect(Limarka::Trabalho.default_texto_file).to eq('trabalho-academico.md') 30 | end 31 | end 32 | describe '.default_anexos_file' do 33 | it 'returna anexos.md' do 34 | expect(Limarka::Trabalho.default_anexos_file).to eq('anexos.md') 35 | end 36 | end 37 | describe '.default_apendices_file' do 38 | it 'returna apendices.md' do 39 | expect(Limarka::Trabalho.default_apendices_file).to eq('apendices.md') 40 | end 41 | end 42 | 43 | describe '.default_apendices_file' do 44 | subject {Limarka::Trabalho.default_apendices_file} 45 | it { is_expected.to eq('apendices.md') } 46 | end 47 | 48 | describe '.default_referencias_bib_file' do 49 | it 'returna referencias.bib' do 50 | expect(Limarka::Trabalho.default_referencias_bib_file).to eq('referencias.bib') 51 | end 52 | end 53 | 54 | describe '#referencias_bib=' , :erro do 55 | let (:t) {Limarka::Trabalho.new(referencias_bib: referencias_bib)} 56 | it 'atualiza referencias' do 57 | expect(t.referencias).to eq(referencias_bib) 58 | end 59 | end 60 | 61 | describe '#anexos=' do 62 | let (:t) {Limarka::Trabalho.new()} 63 | before do 64 | t.anexos=anexos 65 | end 66 | it 'atualiza valor de anexos' do 67 | expect(t.anexos).to eq(anexos) 68 | end 69 | it 'habilita anexos na configuração' do 70 | expect(t.configuracao).to include('anexos' => true) 71 | end 72 | context 'quando anexos for nil' do 73 | before do 74 | t.anexos = nil 75 | end 76 | it 'atualiza anexos' do 77 | expect(t.anexos).to be nil 78 | end 79 | it 'desabilita anexos na configuração' do 80 | expect(t.configuracao).to include('anexos' => false) 81 | end 82 | end 83 | end 84 | 85 | describe '#apendices=' do 86 | let (:t) {Limarka::Trabalho.new()} 87 | before do 88 | t.apendices=apendices 89 | end 90 | it 'atualiza valor de apendices' do 91 | expect(t.apendices).to eq(apendices) 92 | end 93 | it 'habilita apêndices na configuração' do 94 | expect(t.configuracao).to include('apendices' => true) 95 | end 96 | context 'quando apendices for nil' do 97 | before do 98 | t.apendices = nil 99 | end 100 | it 'atualiza apendices' do 101 | expect(t.apendices).to be nil 102 | end 103 | it 'desabilita apêndices na configuração' do 104 | expect(t.configuracao).to include('apendices' => false) 105 | end 106 | end 107 | end 108 | 109 | describe '#configuracao=' do 110 | let (:t) {Limarka::Trabalho.new} 111 | let (:configuracao) {{'title' => 'meu título', 'date' => 'yyyy'}} 112 | before do 113 | t.configuracao = configuracao 114 | end 115 | it 'atualiza configuração' do 116 | expect(t.configuracao).to include('title' => 'meu título') 117 | end 118 | end 119 | 120 | describe '#save', :save do 121 | let(:t) {Limarka::Trabalho.new(configuracao: {'title' => 'meu título'}, texto: texto, anexos: anexos, apendices: apendices)} 122 | before do 123 | FileUtils.rm_rf test_dir 124 | FileUtils.mkdir_p test_dir 125 | end 126 | 127 | context 'quando há apêndice' do 128 | let(:t) {Limarka::Trabalho.new(apendices: apendices)} 129 | it 'salva arquivo de apêndices' do 130 | t.save test_dir 131 | expect(File).to exist(test_dir + '/' + Limarka::Trabalho.default_apendices_file) 132 | end 133 | end 134 | 135 | context 'quando não há apêndice' do 136 | let(:t) {Limarka::Trabalho.new(apendices: nil)} 137 | it 'NÃO salva arquivo de apêndice' do 138 | t.save test_dir 139 | expect(File).not_to exist(test_dir + '/' + Limarka::Trabalho.default_apendices_file) 140 | end 141 | end 142 | 143 | context 'quando há anexos' do 144 | let(:t) {Limarka::Trabalho.new(anexos: anexos)} 145 | it 'salva arquivo de anexos' do 146 | t.save test_dir 147 | expect(File).to exist(test_dir + '/' + Limarka::Trabalho.default_anexos_file) 148 | end 149 | end 150 | 151 | context 'quando não há anexos' do 152 | let(:t) {Limarka::Trabalho.new(anexos: nil)} 153 | it 'NÃO salva arquivo de anexos' do 154 | t.save test_dir 155 | expect(File).not_to exist(test_dir + '/' + Limarka::Trabalho.default_anexos_file) 156 | end 157 | end 158 | 159 | context 'quando há texto' do 160 | it 'salva arquivo de texto' do 161 | t.save test_dir 162 | expect(File).to exist(test_dir + '/' + Limarka::Trabalho.default_texto_file) 163 | end 164 | end 165 | 166 | context 'quando não há texto' do 167 | let (:t) {Limarka::Trabalho.new} 168 | it 'não salva arquivo de texto' do 169 | t.save test_dir 170 | expect(File).not_to exist(test_dir + '/' + Limarka::Trabalho.default_texto_file) 171 | end 172 | end 173 | context 'quando há configuração' do 174 | before do 175 | t.save test_dir 176 | end 177 | it 'salva arquivo de configuração' do 178 | expect(File).to exist(test_dir + '/' + Limarka::Trabalho.default_configuracao_file) 179 | end 180 | end 181 | context 'quando há referencias_bib', :referencias, :save do 182 | let(:arquivo_de_referencias) {'meu-arquivo-de-referencias.bib'} 183 | let(:t) {Limarka::Trabalho.new(referencias_bib: referencias_bib, configuracao: {'referencias_caminho' => arquivo_de_referencias})} 184 | it 'salva referencias_bib' do 185 | t.save test_dir 186 | expect(File).to exist(test_dir + '/' + arquivo_de_referencias) 187 | end 188 | end 189 | context 'quando há errata' do 190 | let(:t) {Limarka::Trabalho.new(errata: errata)} 191 | let(:arquivo) {test_dir + '/' + Limarka::Trabalho.default_errata_file} 192 | let(:conteudo_do_arquivo) {File.open(arquivo, 'r') {|f| f.read}} 193 | it 'salva arquivo de errata' do 194 | t.save test_dir 195 | expect(File).to exist(arquivo) 196 | end 197 | it 'conteúdo do arquivo correspondeu a @errata' do 198 | t.save test_dir 199 | expect(conteudo_do_arquivo).to eq(errata) 200 | end 201 | 202 | end 203 | 204 | context 'quando não há errata' do 205 | let(:t) {Limarka::Trabalho.new(errata: nil)} 206 | it 'NÃO salva arquivo de errata' do 207 | t.save test_dir 208 | expect(File).not_to exist(test_dir + '/' + Limarka::Trabalho.default_errata_file) 209 | end 210 | end 211 | 212 | end 213 | 214 | describe '#ler_configuracao', :ler_configuracao do 215 | let (:arquivo_de_configuracao) {'configuracao.yaml'} 216 | let (:options) {{configuracao_yaml: true}} 217 | let (:configuracao_yaml) {<<-CONF 218 | --- 219 | qualquer-chave: valor da chave 220 | --- 221 | CONF 222 | } 223 | let (:t) {Limarka::Trabalho.new} 224 | context 'quando solicitado ler de configuracao.yaml e arquivo existe' do 225 | before do 226 | expect(File).to receive('exist?').with('configuracao.yaml') {true} 227 | expect(File).to receive(:open).with(arquivo_de_configuracao,'r').and_yield( 228 | StringIO.new(configuracao_yaml)) 229 | end 230 | it 'ler configuracao do arquivo' do 231 | expect(t.ler_configuracao(options)).to include('qualquer-chave' => 'valor da chave') 232 | end 233 | end 234 | context 'quando arquivo de configuração YAML especificado NÃO existe' do 235 | before do 236 | expect(File).to receive('exist?').with('configuracao.yaml') {false} 237 | end 238 | it 'erro com mensagem apropriada será lançado' do 239 | expect { t.ler_configuracao(options) }.to raise_error(IOError, "Arquivo configuracao.yaml não foi encontrado, talvez esteja executando dentro de um diretório que não contém um projeto válido?") 240 | end 241 | end 242 | 243 | end 244 | 245 | describe '#ler_referencias' do 246 | let (:t) {Limarka::Trabalho.new} 247 | context 'quando configurado para ler do arquivo referencias.bib', :referencias do 248 | let (:configuracao) {{'referencias_caminho' => 'referencias.bib'}} 249 | it 'ler o arquivo e retorna seu conteúdo' do 250 | expect(t).to receive(:ler_referencias) 251 | t.ler_referencias(configuracao) 252 | end 253 | end 254 | context 'quando configurado para ler do arquivo jabref.bib', :referencias, :referencias_caminho do 255 | let (:configuracao) {{'referencias_caminho' => 'jabref.bib'}} 256 | let (:conteudo) {"@book{mybook}"} 257 | before do 258 | allow(File).to receive(:exist?).with('jabref.bib') {true} 259 | expect(File).to receive(:open).with('jabref.bib', 'r').and_yield(StringIO.new(conteudo)) 260 | end 261 | it 'ler o arquivo e retorna seu conteúdo' do 262 | expect(t.ler_referencias(configuracao)).to eq(conteudo) 263 | end 264 | end 265 | 266 | end 267 | 268 | describe '#ler_apendices' do 269 | let (:arquivo) {'apendices.md'} 270 | context 'quando EXISTE apendices.md', :apendices do 271 | let (:configuracao) {{'apendices' => true}} 272 | let (:t) {Limarka::Trabalho.new} 273 | let (:conteudo) {apendices} 274 | before do 275 | expect(File).to receive(:open).with(arquivo,'r').and_yield( 276 | StringIO.new(conteudo)) 277 | end 278 | it 'ler o arquivo e retorna seu conteúdo' do 279 | t.configuracao = configuracao 280 | expect(t.ler_apendices).to eq(conteudo) 281 | end 282 | end 283 | end 284 | 285 | 286 | describe "#formato" do 287 | context "quando configuracao não contém propriedade 'formato'" do 288 | let(:t) {Limarka::Trabalho.new(configuracao: configuracao.merge('formato' => nil))} 289 | fit 'retorna o formato padrão: "markdown+raw_tex"' do 290 | expect(t.formato).to eq("markdown+raw_tex") 291 | end 292 | end 293 | context "quando configuracao contém propriedade 'formato'" do 294 | let(:extensao){'+abracadabra'} 295 | let(:t) {Limarka::Trabalho.new(configuracao: configuracao.merge('formato' => extensao))} 296 | fit 'retorna o valor padrão concatenado com o valor do formato' do 297 | expect(t.formato).to eq("markdown+raw_tex+abracadabra") 298 | end 299 | end 300 | end 301 | 302 | end 303 | -------------------------------------------------------------------------------- /referencias.bib: -------------------------------------------------------------------------------- 1 | %% This BibTeX bibliography file was created using BibDesk. 2 | %% http://bibdesk.sourceforge.net/ 3 | 4 | 5 | %% Created for Lauro Cesar Araujo at 2015-04-27 19:43:45 -0300 6 | 7 | 8 | %% Saved with string encoding Unicode (UTF-8) 9 | 10 | 11 | 12 | @book{ibge1993, 13 | Address = {Rio de Janeiro}, 14 | Author = {IBGE}, 15 | Date-Added = {2013-08-21 13:56:10 +0000}, 16 | Date-Modified = {2013-08-21 13:56:10 +0000}, 17 | Edition = {3}, 18 | Organization = {http://biblioteca.ibge.gov.br/visualizacao/livros/liv23907.pdf}, 19 | Publisher = {Centro de Documenta{\c c}{\~a}o e Dissemina{\c c}{\~a}o de Informa{\c c}{\~o}es. Funda{\c c}{\~a}o Intituto Brasileiro de Geografia e Estat{\'\i}stica}, 20 | Title = {Normas de apresenta{\c c}{\~a}o tabular}, 21 | Urlaccessdate = {21 ago 2013}, 22 | Year = {1993}} 23 | 24 | @misc{abntex2-wiki-como-customizar, 25 | Author = {Lauro C{\'e}sar Araujo}, 26 | Date-Added = {2013-03-23 21:39:21 +0000}, 27 | Date-Modified = {2015-04-27 22:43:06 +0000}, 28 | Howpublished = {Wiki do abnTeX2}, 29 | Keywords = {wiki}, 30 | Title = {Como customizar o abnTeX2}, 31 | Url = {https://github.com/abntex/abntex2/wiki/ComoCustomizar}, 32 | Urlaccessdate = {27 abr 2015}, 33 | Year = {2015}, 34 | Bdsk-Url-1 = {https://github.com/abntex/abntex2/wiki/ComoCustomizar}} 35 | 36 | @manual{talbot2012, 37 | Author = {Nicola L.C. Talbot}, 38 | Date-Added = {2013-03-11 12:06:04 +0000}, 39 | Date-Modified = {2013-03-11 12:06:56 +0000}, 40 | Month = {Nov.}, 41 | Title = {User Manual for glossaries.sty}, 42 | Url = {http://mirrors.ctan.org/macros/latex/contrib/glossaries/glossaries-user.pdf}, 43 | Urlaccessdate = {11 mar. 2013}, 44 | Year = {2012}, 45 | Bdsk-Url-1 = {http://mirrors.ctan.org/macros/latex/contrib/glossaries/glossaries-user.pdf}} 46 | 47 | @manual{babel, 48 | Author = {Johannes Braams}, 49 | Date-Added = {2013-02-17 13:37:14 +0000}, 50 | Date-Modified = {2013-02-17 13:38:38 +0000}, 51 | Month = {Apr.}, 52 | Title = {Babel, a multilingual package for use with LATEX's standard document classes}, 53 | Url = {http://mirrors.ctan.org/info/babel/babel.pdf}, 54 | Urlaccessdate = {17 fev. 2013}, 55 | Year = {2008}, 56 | Bdsk-Url-1 = {http://mirrors.ctan.org/info/babel/babel.pdf}} 57 | 58 | @manual{abntex2modelo-artigo, 59 | Annote = {Este documento {\'e} derivado do \cite{abnt-bibtex-doc}}, 60 | Author = {Lauro C{\'e}sar Araujo}, 61 | Date-Added = {2013-01-15 00:10:35 +0000}, 62 | Date-Modified = {2015-04-27 22:43:13 +0000}, 63 | Organization = {Equipe abnTeX2}, 64 | Title = {Modelo Can{\^o}nico de Artigo Cient{\'\i}fico com abnTeX2}, 65 | Url = {http://www.abntex.net.br/}, 66 | Year = {2015}, 67 | Bdsk-Url-1 = {http://www.abntex.net.br/}} 68 | 69 | @manual{abntex2modelo-relatorio, 70 | Annote = {Este documento {\'e} derivado do \cite{abnt-bibtex-doc}}, 71 | Author = {Lauro C{\'e}sar Araujo}, 72 | Date-Added = {2013-01-15 00:05:34 +0000}, 73 | Date-Modified = {2015-04-27 22:43:18 +0000}, 74 | Organization = {Equipe abnTeX2}, 75 | Title = {Modelo Can{\^o}nico de Relat{\'o}rio T{\'e}cnico e/ou Cient{\'\i}fico com abnTeX2}, 76 | Url = {http://www.abntex.net.br/}, 77 | Year = {2015}, 78 | Bdsk-Url-1 = {http://www.abntex.net.br/}} 79 | 80 | @manual{abntex2modelo, 81 | Annote = {Este documento {\'e} derivado do \cite{abnt-bibtex-doc}}, 82 | Author = {Lauro C{\'e}sar Araujo}, 83 | Date-Added = {2013-01-12 22:55:32 +0000}, 84 | Date-Modified = {2015-04-27 22:43:32 +0000}, 85 | Organization = {Equipe abnTeX2}, 86 | Title = {Modelo Can{\^o}nico de Trabalho Acad{\^e}mico com abnTeX2}, 87 | Url = {http://www.abntex.net.br/}, 88 | Year = {2015}, 89 | Bdsk-Url-1 = {http://www.abntex.net.br/}} 90 | 91 | @mastersthesis{araujo2012, 92 | Address = {Bras{\'\i}lia}, 93 | Author = {Lauro C{\'e}sar Araujo}, 94 | Date-Added = {2013-01-09 11:04:42 +0000}, 95 | Date-Modified = {2013-01-09 11:04:42 +0000}, 96 | Month = {mar.}, 97 | School = {Universidade de Bras{\'\i}lia}, 98 | Subtitle = {uma perspectiva de {A}rquitetura da {I}nforma{\c c}{\~a}o da {E}scola de {B}ras{\'\i}lia}, 99 | Title = {Configura{\c c}{\~a}o}, 100 | Year = {2012}} 101 | 102 | @manual{memoir, 103 | Address = {Normandy Park, WA}, 104 | Author = {Peter Wilson and Lars Madsen}, 105 | Date-Added = {2013-01-09 10:37:50 +0000}, 106 | Date-Modified = {2013-03-21 13:23:25 +0000}, 107 | Organization = {The Herries Press}, 108 | Title = {The Memoir Class for Configurable Typesetting - User Guide}, 109 | Url = {http://mirrors.ctan.org/macros/latex/contrib/memoir/memman.pdf}, 110 | Urlaccessdate = {19 dez. 2012}, 111 | Year = {2010}, 112 | Bdsk-Url-1 = {http://ctan.tche.br/macros/latex/contrib/memoir/memman.pdf}} 113 | 114 | @manual{abntex2cite-alf, 115 | Annote = {Este documento {\'e} derivado do \cite{abnt-bibtex-alf-doc}}, 116 | Author = {Lauro C{\'e}sar Araujo}, 117 | Date-Added = {2013-01-09 10:37:45 +0000}, 118 | Date-Modified = {2015-04-27 22:43:44 +0000}, 119 | Organization = {Equipe abnTeX2}, 120 | Title = {O pacote abntex2cite: t{\'o}picos espec{\'\i}ficos da ABNT NBR 10520:2002 e o estilo bibliogr{\'a}fico alfab{\'e}tico (sistema autor-data)}, 121 | Url = {http://www.abntex.net.br/}, 122 | Year = {2015}, 123 | Bdsk-Url-1 = {http://www.abntex.net.br/}} 124 | 125 | @manual{abntex2cite, 126 | Annote = {Este documento {\'e} derivado do \cite{abnt-bibtex-doc}}, 127 | Author = {Lauro C{\'e}sar Araujo}, 128 | Date-Added = {2013-01-09 10:37:45 +0000}, 129 | Date-Modified = {2015-04-27 22:43:38 +0000}, 130 | Organization = {Equipe abnTeX2}, 131 | Title = {O pacote abntex2cite: Estilos bibliogr{\'a}ficos compat{\'\i}veis com a ABNT NBR 6023}, 132 | Url = {http://www.abntex.net.br/}, 133 | Year = {2015}, 134 | Bdsk-Url-1 = {http://www.abntex.net.br/}} 135 | 136 | @manual{abntex2classe, 137 | Author = {Lauro C{\'e}sar Araujo}, 138 | Date-Added = {2013-01-09 10:37:38 +0000}, 139 | Date-Modified = {2015-04-27 22:42:47 +0000}, 140 | Organization = {Equipe abnTeX2}, 141 | Title = {A classe abntex2: Modelo can{\^o}nico de trabalhos acad{\^e}micos brasileiros compat{\'\i}vel com as normas ABNT NBR 14724:2011, ABNT NBR 6024:2012 e outras}, 142 | Url = {http://www.abntex.net.br/}, 143 | Year = {2015}, 144 | Bdsk-Url-1 = {http://www.abntex.net.br/}} 145 | 146 | @manual{NBR10520:2002, 147 | Address = {Rio de Janeiro}, 148 | Date-Added = {2012-12-15 21:43:38 +0000}, 149 | Date-Modified = {2013-01-12 22:17:20 +0000}, 150 | Month = {ago.}, 151 | Org-Short = {ABNT}, 152 | Organization = {Associa{\c c}\~ao Brasileira de Normas T\'ecnicas}, 153 | Pages = 7, 154 | Subtitle = {Informa{\c c}\~ao e documenta{\c c}\~ao --- Apresenta{\c c}\~ao de cita{\c c}\~oes em documentos}, 155 | Title = {{NBR} 10520}, 156 | Year = 2002} 157 | 158 | @manual{NBR6024:2012, 159 | Address = {Rio de Janeiro}, 160 | Date-Added = {2012-12-15 21:24:06 +0000}, 161 | Date-Modified = {2012-12-15 21:24:28 +0000}, 162 | Month = {fev.}, 163 | Org-Short = {ABNT}, 164 | Organization = {Associa{\c c}\~ao Brasileira de Normas T\'ecnicas}, 165 | Pages = 4, 166 | Subtitle = {Numera{\c c}\~ao progressiva das se{\c c}\~oes de um documento}, 167 | Title = {{NBR} 6024}, 168 | Year = 2012} 169 | 170 | @manual{NBR6028:2003, 171 | Address = {Rio de Janeiro}, 172 | Date-Added = {2012-12-15 21:02:12 +0000}, 173 | Date-Modified = {2012-12-15 21:02:50 +0000}, 174 | Month = {nov.}, 175 | Org-Short = {ABNT}, 176 | Organization = {Associa{\c c}\~ao Brasileira de Normas T\'ecnicas}, 177 | Pages = 2, 178 | Subtitle = {Resumo - Apresenta{\c c}{\~a}o}, 179 | Title = {{NBR} 6028}, 180 | Year = 2003} 181 | 182 | @manual{NBR14724:2001, 183 | Address = {Rio de Janeiro}, 184 | Date-Added = {2012-12-15 20:34:08 +0000}, 185 | Date-Modified = {2012-12-15 20:34:08 +0000}, 186 | Month = {jul.}, 187 | Org-Short = {ABNT}, 188 | Organization = {Associa{\c c}\~ao Brasileira de Normas T\'ecnicas}, 189 | Pages = 6, 190 | Subtitle = {Informa{\c c}\~ao e documenta{\c c}\~ao --- trabalhos acad\^emicos --- apresenta{\c c}\~ao}, 191 | Title = {{NBR} 14724}, 192 | Year = 2001} 193 | 194 | @manual{NBR14724:2002, 195 | Address = {Rio de Janeiro}, 196 | Date-Added = {2012-12-15 20:34:17 +0000}, 197 | Date-Modified = {2012-12-15 20:34:17 +0000}, 198 | Month = {ago.}, 199 | Org-Short = {ABNT}, 200 | Organization = {Associa{\c c}\~ao Brasileira de Normas T\'ecnicas}, 201 | Pages = 6, 202 | Subtitle = {Informa{\c c}\~ao e documenta{\c c}\~ao --- trabalhos acad\^emicos --- apresenta{\c c}\~ao}, 203 | Title = {{NBR} 14724}, 204 | Year = 2002} 205 | 206 | @manual{NBR14724:2005, 207 | Address = {Rio de Janeiro}, 208 | Date-Added = {2012-12-15 20:34:08 +0000}, 209 | Date-Modified = {2012-12-15 20:35:25 +0000}, 210 | Month = {dez.}, 211 | Org-Short = {ABNT}, 212 | Organization = {Associa{\c c}\~ao Brasileira de Normas T\'ecnicas}, 213 | Pages = 9, 214 | Subtitle = {Informa{\c c}\~ao e documenta{\c c}\~ao --- trabalhos acad\^emicos --- apresenta{\c c}\~ao}, 215 | Title = {{NBR} 14724}, 216 | Year = 2005} 217 | 218 | @manual{NBR14724:2011, 219 | Address = {Rio de Janeiro}, 220 | Date-Added = {2012-12-15 20:34:08 +0000}, 221 | Date-Modified = {2012-12-15 20:35:25 +0000}, 222 | Month = {mar.}, 223 | Note = {Substitui a Ref.~\citeonline{NBR14724:2005}}, 224 | Org-Short = {ABNT}, 225 | Organization = {Associa{\c c}\~ao Brasileira de Normas T\'ecnicas}, 226 | Pages = 15, 227 | Subtitle = {Informa{\c c}\~ao e documenta{\c c}\~ao --- trabalhos acad\^emicos --- apresenta{\c c}\~ao}, 228 | Title = {{NBR} 14724}, 229 | Year = 2011} 230 | 231 | @article{van86, 232 | Author = {{van}, Gigch, John P. and Leo L. Pipino}, 233 | Journal = {Future Computing Systems}, 234 | Number = {1}, 235 | Pages = {71-97}, 236 | Title = {In search for a paradigm for the discipline of information systems}, 237 | Volume = {1}, 238 | Year = {1986}} 239 | 240 | @phdthesis{guizzardi2005, 241 | Address = {Enschede, The Netherlands}, 242 | Author = {Giancarlo Guizzardi}, 243 | Date-Added = {2012-04-23 11:35:28 +0000}, 244 | Date-Modified = {2012-04-23 11:35:28 +0000}, 245 | School = {Centre for Telematics and Information Technology, University of Twente}, 246 | Title = {Ontological Foundations for Structural Conceptual Models}, 247 | Url = {http://www.loa.istc.cnr.it/Guizzardi/SELMAS-CR.pdf}, 248 | Urlaccessdate = {3 jul. 2011}, 249 | Year = {2005}, 250 | Bdsk-Url-1 = {http://www.loa.istc.cnr.it/Guizzardi/SELMAS-CR.pdf}} 251 | 252 | @mastersthesis{macedo2005, 253 | Author = {Fl{\'a}via L. Macedo}, 254 | Date-Added = {2012-04-23 11:35:13 +0000}, 255 | Date-Modified = {2012-04-23 11:35:13 +0000}, 256 | Keywords = {arquitetura da informa{\c c}{\~a}o}, 257 | School = {Universidade de Bras{\'\i}lia}, 258 | Title = {Arquitetura da Informa{\c c}{\~a}o: aspectos espistemol{\'o}gicos, cient{\'\i}ficos e pr{\'a}ticos.}, 259 | Type = {Disserta{\c c}{\~a}o de Mestrado}, 260 | Year = {2005}} 261 | 262 | @manual{EIA649B, 263 | Address = {EUA}, 264 | Date-Added = {2012-04-23 11:34:59 +0000}, 265 | Date-Modified = {2012-04-23 11:34:59 +0000}, 266 | Keywords = {norma}, 267 | Month = {June}, 268 | Organization = {TechAmerica}, 269 | Title = {ANSI/EIA 649-B: Configuration Management Standard}, 270 | Year = {2011}} 271 | 272 | @inproceedings{masolo2010, 273 | Author = {Claudio Masolo}, 274 | Booktitle = {Proceedings of the Twelfth International Conference on the Principles of Knowledge Representation and Reasoning (KR 2010)}, 275 | Date-Added = {2012-04-23 11:34:38 +0000}, 276 | Date-Modified = {2012-04-23 11:34:38 +0000}, 277 | Editor = {Lin, F. and Sattler, U.}, 278 | Pages = {258-268}, 279 | Publisher = {AAAI Press}, 280 | Title = {Understanding Ontological Levels}, 281 | Url = {http://wiki.loa-cnr.it/Papers/kr10v0.7.pdf}, 282 | Urlaccessdate = {2 jan. 2012}, 283 | Year = {2010}, 284 | Bdsk-Url-1 = {http://wiki.loa-cnr.it/Papers/kr10v0.7.pdf}} 285 | 286 | @inbook{guarino1995, 287 | Address = {Vienna}, 288 | Author = {Nicola Guarino}, 289 | Booktitle = {Philosophy and the Cognitive Science}, 290 | Date-Added = {2012-04-23 11:34:29 +0000}, 291 | Date-Modified = {2012-04-23 11:34:29 +0000}, 292 | Editor = {R. Casati and B. Smith and G. White}, 293 | Month = {Sept.}, 294 | Pages = {443-456}, 295 | Publisher = {Holder-Pivhler-Tempsky}, 296 | Title = {The Ontological Level}, 297 | Url = {http://wiki.loa-cnr.it/Papers/OntLev.pdf}, 298 | Urlaccessdate = {2 jan. 2012}, 299 | Year = {1995}, 300 | Bdsk-Url-1 = {http://wiki.loa-cnr.it/Papers/OntLev.pdf}} 301 | 302 | @incollection{bates2010, 303 | Address = {New York}, 304 | Author = {Marcia J. Bates}, 305 | Booktitle = {Encyclopedia of Library and Information Sciences}, 306 | Date-Added = {2012-04-23 11:34:29 +0000}, 307 | Date-Modified = {2012-04-23 11:34:29 +0000}, 308 | Edition = {3rd}, 309 | Editor = {Marcia J. Bates and Mary Niles Maack}, 310 | Pages = {2347-2360}, 311 | Publisher = {CRC Press}, 312 | Title = {Information}, 313 | Url = {http://pages.gseis.ucla.edu/faculty/bates/articles/information.html}, 314 | Urlaccessdate = {24 out. 2011}, 315 | Volume = {3}, 316 | Year = {2010}, 317 | Bdsk-Url-1 = {http://pages.gseis.ucla.edu/faculty/bates/articles/information.html}} 318 | 319 | @book{doxiadis1965, 320 | Author = {Constantinos A. Doxiadis}, 321 | Date-Added = {2012-04-23 11:34:20 +0000}, 322 | Date-Modified = {2012-04-23 11:34:20 +0000}, 323 | Publisher = {Ceira - Coimbra}, 324 | Title = {Arquitetura em Transi{\c c}{\~a}o}, 325 | Year = {1965}} 326 | 327 | @book{dewey1980, 328 | Address = {New York, NY, USA}, 329 | Author = {John Dewey}, 330 | Date-Added = {2012-04-23 11:34:16 +0000}, 331 | Date-Modified = {2012-04-23 11:34:16 +0000}, 332 | Publisher = {Perigee Books}, 333 | Title = {Art as Experience}, 334 | Year = {1980}} 335 | 336 | @misc{limarka, 337 | Author = {Eduardo de Santana Medeiros Alexandre}, 338 | Date-Added = {Seg Set 5 14:30:25 BRT 2016}, 339 | Date-Modified = {2016-09-05}, 340 | Howpublished = {Página do projeto}, 341 | Title = {Limarka}, 342 | Url = {https://github.com/abntex/limarka}, 343 | Urlaccessdate = {5 de set 2016}, 344 | Year = {2016}} 345 | --------------------------------------------------------------------------------