Blame CONTRIBUTING.md

Packit Service d2f85f
Contributing to pandoc
Packit Service d2f85f
======================
Packit Service d2f85f
Packit Service d2f85f
Have a question?
Packit Service d2f85f
----------------
Packit Service d2f85f
Packit Service d2f85f
Ask on [pandoc-discuss].
Packit Service d2f85f
Packit Service d2f85f
Packit Service d2f85f
Found a bug?
Packit Service d2f85f
------------
Packit Service d2f85f
Packit Service d2f85f
Bug reports are welcome!  Please report all bugs on pandoc's github
Packit Service d2f85f
[issue tracker].
Packit Service d2f85f
Packit Service d2f85f
Before you submit a bug report, search the [open issues] *and* [closed issues]
Packit Service d2f85f
to make sure the issue hasn't come up before. Also, check the [User's Guide] and
Packit Service d2f85f
[FAQs] for anything relevant.
Packit Service d2f85f
Packit Service d2f85f
Make sure you can reproduce the bug with the [latest released version] of pandoc
Packit Service d2f85f
(or, even better, the [development version]).
Packit Service d2f85f
Packit Service d2f85f
Your report should give detailed, *reproducible* instructions, including
Packit Service d2f85f
Packit Service d2f85f
  * the pandoc version (check using `pandoc -v`)
Packit Service d2f85f
  * the exact command line used
Packit Service d2f85f
  * the exact input used
Packit Service d2f85f
  * the output received
Packit Service d2f85f
  * the output you expected instead
Packit Service d2f85f
Packit Service d2f85f
A small test case (just a few lines) is ideal.  If your input is large,
Packit Service d2f85f
try to whittle it down to a *minimum working example*.
Packit Service d2f85f
Packit Service d2f85f
Out of scope?
Packit Service d2f85f
-------------
Packit Service d2f85f
Packit Service d2f85f
A less than perfect conversion does not necessarily mean there's
Packit Service d2f85f
a bug in pandoc.  Quoting from the MANUAL:
Packit Service d2f85f
Packit Service d2f85f
> Because pandoc's intermediate representation of a document is less
Packit Service d2f85f
> expressive than many of the formats it converts between, one should
Packit Service d2f85f
> not expect perfect conversions between every format and every other.
Packit Service d2f85f
> Pandoc attempts to preserve the structural elements of a document, but
Packit Service d2f85f
> not formatting details such as margin size.  And some document elements,
Packit Service d2f85f
> such as complex tables, may not fit into pandoc's simple document
Packit Service d2f85f
> model.  While conversions from pandoc's Markdown to all formats aspire
Packit Service d2f85f
> to be perfect, conversions from formats more expressive than pandoc's
Packit Service d2f85f
> Markdown can be expected to be lossy.
Packit Service d2f85f
Packit Service d2f85f
For example, both `docx` and `odt` formats can represent margin size, but
Packit Service d2f85f
because pandoc's internal document model does not contain a representation of
Packit Service d2f85f
margin size, this information will be lost on converting from docx
Packit Service d2f85f
to `odt`.  (You can, however, customize margin size using `--reference-doc`.)
Packit Service d2f85f
Packit Service d2f85f
So before submitting a bug report, consider whether it might be
Packit Service d2f85f
"out of scope." If it concerns a feature of documents that isn't
Packit Service d2f85f
representable in pandoc's Markdown, then it very likely is.
Packit Service d2f85f
(If in doubt, you can always ask on [pandoc-discuss].)
Packit Service d2f85f
Packit Service d2f85f
Fixing bugs from the issue tracker
Packit Service d2f85f
----------------------------------
Packit Service d2f85f
Packit Service d2f85f
Almost all the bugs on the issue tracker have one or more associated
Packit Service d2f85f
tags. These are used to indicate the *complexity* and *nature* of a
Packit Service d2f85f
bug. There is not yet a way to indicate priority. An up to date
Packit Service d2f85f
summary of issues can be found on [GitHub labels].
Packit Service d2f85f
Packit Service d2f85f
* [beginner-friendly] — The perfect starting point for new contributors. The
Packit Service d2f85f
  issue is generic and can be resolved without deep knowledge of the code
Packit Service d2f85f
  base.
Packit Service d2f85f
* [enhancement] — A feature which would be desirable. We recommend
Packit Service d2f85f
  you discuss any proposed enhancement on pandoc-discuss before
Packit Service d2f85f
  writing code.
Packit Service d2f85f
* [bug] — A problem which needs to be fixed.
Packit Service d2f85f
* [complexity:low] — The fix should only be a couple of lines.
Packit Service d2f85f
* [complexity:high] — The fix might require structural changes or in depth
Packit Service d2f85f
  knowledge of the code base.
Packit Service d2f85f
* [new:reader] — A request to add a new input format.
Packit Service d2f85f
* [new:writer] — A request to add a new output format.
Packit Service d2f85f
* [docs] — A discrepancy,  or ambiguity in the documentation.
Packit Service d2f85f
* [status:in-progress] — Someone is actively working on or planning to work on the
Packit Service d2f85f
  ticket.
Packit Service d2f85f
* [status:more-discussion-needed] — It is unclear what the correct approach
Packit Service d2f85f
  to solving the ticket is. Before starting on tickets such as this it
Packit Service d2f85f
  would be advisable to post on the ticket.
Packit Service d2f85f
* [status:more-info-needed] — We require more information from a user before
Packit Service d2f85f
  we can classify a report properly.
Packit Service d2f85f
Packit Service d2f85f
Issues related to a specific format are tagged accordingly, e.g. feature request
Packit Service d2f85f
or bug reports related to Markdown are labelled with [format:markdown].
Packit Service d2f85f
Packit Service d2f85f
Have an idea for a new feature?
Packit Service d2f85f
-------------------------------
Packit Service d2f85f
Packit Service d2f85f
First, search [pandoc-discuss] and the issue tracker (both [open issues] *and*
Packit Service d2f85f
[closed issues]) to make sure that the idea has not been discussed before.
Packit Service d2f85f
Packit Service d2f85f
Explain the rationale for the feature you're requesting.  Why would this
Packit Service d2f85f
feature be useful?  Consider also any possible drawbacks, including backwards
Packit Service d2f85f
compatibility, new library dependencies, and performance issues.
Packit Service d2f85f
Packit Service d2f85f
It is best to discuss a potential new feature on [pandoc-discuss]
Packit Service d2f85f
before opening an issue.
Packit Service d2f85f
Packit Service d2f85f
Patches and pull requests
Packit Service d2f85f
-------------------------
Packit Service d2f85f
Packit Service d2f85f
Patches and pull requests are welcome.  Before you put time into a nontrivial
Packit Service d2f85f
patch, it is a good idea to discuss it on [pandoc-discuss], especially if it is
Packit Service d2f85f
for a new feature (rather than fixing a bug).
Packit Service d2f85f
Packit Service d2f85f
Please follow these guidelines:
Packit Service d2f85f
Packit Service d2f85f
1.  Each patch (commit) should make a single logical change (fix a bug, add
Packit Service d2f85f
    a feature, clean up some code, add documentation).  Everything
Packit Service d2f85f
    related to that change should be included (including tests and
Packit Service d2f85f
    documentation), and nothing unrelated should be included.
Packit Service d2f85f
Packit Service d2f85f
2.  The first line of the commit message should be a short description
Packit Service d2f85f
    of the whole commit (ideally <= 50 characters).  Then there should
Packit Service d2f85f
    be a blank line, followed by a more detailed description of the
Packit Service d2f85f
    change.
Packit Service d2f85f
Packit Service d2f85f
3.  Follow the stylistic conventions you find in the existing
Packit Service d2f85f
    pandoc code.  Use spaces, not tabs, and wrap code to 80 columns.
Packit Service d2f85f
    Always include type signatures for top-level functions.
Packit Service d2f85f
    Consider installing [EditorConfig], this will help you to follow the
Packit Service d2f85f
    coding style prevalent in pandoc.
Packit Service d2f85f
Packit Service d2f85f
4.  Your code should compile without warnings (`-Wall` clean).
Packit Service d2f85f
Packit Service d2f85f
5.  Run the tests to make sure your code does not introduce new bugs.
Packit Service d2f85f
    (See below under [Tests](#tests).)  All tests should pass.
Packit Service d2f85f
Packit Service d2f85f
6.  It is a good idea to add test cases for the bug you are fixing.  (See
Packit Service d2f85f
    below under [Tests](#tests).)  If you are adding a new writer or reader,
Packit Service d2f85f
    you must include tests.
Packit Service d2f85f
Packit Service d2f85f
7.  If you are adding a new feature, include updates to `MANUAL.txt`.
Packit Service d2f85f
Packit Service d2f85f
8.  All code must be released under the general license governing pandoc
Packit Service d2f85f
    (GPL v2).
Packit Service d2f85f
Packit Service d2f85f
9.  It is better not to introduce new dependencies.  Dependencies on
Packit Service d2f85f
    external C libraries should especially be avoided.
Packit Service d2f85f
Packit Service d2f85f
10. We aim for compatibility with ghc versions from 7.8.3 to the
Packit Service d2f85f
    latest release.  All pull requests and commits are tested
Packit Service d2f85f
    automatically on <travis-ci.org>, using GHC versions in the
Packit Service d2f85f
    `Tested-With` stanza of `pandoc.cabal`.  We currently relax
Packit Service d2f85f
    the "`-Wall` clean" requirement for GHC 7.10.x, because
Packit Service d2f85f
    there are so many warnings relating to the addition of type
Packit Service d2f85f
    classes to the Prelude.
Packit Service d2f85f
Packit Service d2f85f
Tests
Packit Service d2f85f
-----
Packit Service d2f85f
Packit Service d2f85f
Tests can be run as follows:
Packit Service d2f85f
Packit Service d2f85f
    cabal install --only-dependencies --enable-tests
Packit Service d2f85f
    cabal configure --enable-tests
Packit Service d2f85f
    cabal build
Packit Service d2f85f
    cabal test
Packit Service d2f85f
Packit Service d2f85f
or, if you're using [stack],
Packit Service d2f85f
Packit Service d2f85f
    stack setup
Packit Service d2f85f
    stack test
Packit Service d2f85f
Packit Service d2f85f
The test program is `test/test-pandoc.hs`.
Packit Service d2f85f
Packit Service d2f85f
Benchmarks
Packit Service d2f85f
----------
Packit Service d2f85f
Packit Service d2f85f
To run benchmarks with cabal:
Packit Service d2f85f
Packit Service d2f85f
    cabal configure --enable-benchmarks
Packit Service d2f85f
    cabal build
Packit Service d2f85f
    cabal bench
Packit Service d2f85f
Packit Service d2f85f
With stack:
Packit Service d2f85f
Packit Service d2f85f
    stack bench
Packit Service d2f85f
Packit Service d2f85f
You can also build pandoc with the `weigh-pandoc` flag and
Packit Service d2f85f
run `weigh-pandoc` to get some statistics on memory usage.
Packit Service d2f85f
(Eventually this should be incorporated into the benchmark
Packit Service d2f85f
suite.)
Packit Service d2f85f
Packit Service d2f85f
Using the REPL
Packit Service d2f85f
--------------
Packit Service d2f85f
Packit Service d2f85f
With a recent version of cabal, you can do `cabal repl` and get
Packit Service d2f85f
a ghci REPL for working with pandoc.  With [stack], use
Packit Service d2f85f
`cabal ghci`.
Packit Service d2f85f
Packit Service d2f85f
We recommend using the following `.ghci` file (which can be
Packit Service d2f85f
placed in the source directory):
Packit Service d2f85f
Packit Service d2f85f
	:set -fobject-code
Packit Service d2f85f
	:set -XTypeSynonymInstances
Packit Service d2f85f
	:set -XScopedTypeVariables
Packit Service d2f85f
	:set -XOverloadedStrings
Packit Service d2f85f
Packit Service d2f85f
Profiling
Packit Service d2f85f
---------
Packit Service d2f85f
Packit Service d2f85f
To use the GHC profiler with cabal:
Packit Service d2f85f
Packit Service d2f85f
    cabal clean
Packit Service d2f85f
    cabal install --enable-library-profiling --enable-executable-profiling
Packit Service d2f85f
    pandoc +RTS -p -RTS [file]...
Packit Service d2f85f
    less pandoc.prof
Packit Service d2f85f
Packit Service d2f85f
With stack:
Packit Service d2f85f
Packit Service d2f85f
    stack clean
Packit Service d2f85f
    stack install --profile
Packit Service d2f85f
    pandoc +RTS -p -RTS [file]...
Packit Service d2f85f
    less pandoc.prof
Packit Service d2f85f
Packit Service d2f85f
Templates
Packit Service d2f85f
---------
Packit Service d2f85f
Packit Service d2f85f
The default templates live in `data/templates`, which is a git
Packit Service d2f85f
subtree linked to <https://github.com/jgm/pandoc-templates.git>.
Packit Service d2f85f
The purpose of maintaining a separate repository is to allow
Packit Service d2f85f
people to maintain variant templates as a fork.
Packit Service d2f85f
Packit Service d2f85f
You can modify the templates and submit patches without worrying
Packit Service d2f85f
much about this: when these patches are merged, we will
Packit Service d2f85f
push them to the main templates repository by doing
Packit Service d2f85f
Packit Service d2f85f
    git subtree push --prefix=data/templates templates master
Packit Service d2f85f
Packit Service d2f85f
where `templates` is a remote pointing to the templates
Packit Service d2f85f
repository.
Packit Service d2f85f
Packit Service d2f85f
The code
Packit Service d2f85f
--------
Packit Service d2f85f
Packit Service d2f85f
Pandoc has a publicly accessible git repository on
Packit Service d2f85f
github: <http://github.com/jgm/pandoc>.  To get a local copy of the source:
Packit Service d2f85f
Packit Service d2f85f
    git clone https://github.com/jgm/pandoc.git
Packit Service d2f85f
Packit Service d2f85f
The source for the main pandoc program is `pandoc.hs`.  The source for
Packit Service d2f85f
the pandoc library is in `src/`, the source for the tests is in
Packit Service d2f85f
`test/`, and the source for the benchmarks is in `benchmark/`.
Packit Service d2f85f
Packit Service d2f85f
The modules `Text.Pandoc.Definition`, `Text.Pandoc.Builder`, and
Packit Service d2f85f
`Text.Pandoc.Generic` are in a separate library `pandoc-types`.  The code can
Packit Service d2f85f
be found in <http://github.com/jgm/pandoc-types>.
Packit Service d2f85f
Packit Service d2f85f
To build pandoc, you will need a working installation of the
Packit Service d2f85f
[Haskell platform].
Packit Service d2f85f
Packit Service d2f85f
The library is structured as follows:
Packit Service d2f85f
Packit Service d2f85f
  - `Text.Pandoc` is a top-level module that exports what is needed
Packit Service d2f85f
    by most users of the library.  Any patches that add new readers
Packit Service d2f85f
    or writers will need to make changes here, too.
Packit Service d2f85f
  - `Text.Pandoc.Definition` (in `pandoc-types`) defines the types
Packit Service d2f85f
    used for representing a pandoc document.
Packit Service d2f85f
  - `Text.Pandoc.Builder` (in `pandoc-types`) provides functions for
Packit Service d2f85f
    building pandoc documents programatically.
Packit Service d2f85f
  - `Text.Pandoc.Generics` (in `pandoc-types`) provides functions allowing
Packit Service d2f85f
    you to promote functions that operate on parts of pandoc documents
Packit Service d2f85f
    to functions that operate on whole pandoc documents, walking the
Packit Service d2f85f
    tree automatically.
Packit Service d2f85f
  - `Text.Pandoc.Readers.*` are the readers, and `Text.Pandoc.Writers.*`
Packit Service d2f85f
    are the writers.
Packit Service d2f85f
  - `Text.Pandoc.Biblio` is a utility module for formatting citations
Packit Service d2f85f
    using citeproc-hs.
Packit Service d2f85f
  - `Text.Pandoc.Data` is used to embed data files when the `embed_data_files`
Packit Service d2f85f
    cabal flag is used.  It is generated from `src/Text/Pandoc/Data.hsb` using
Packit Service d2f85f
    the preprocessor [hsb2hs].
Packit Service d2f85f
  - `Text.Pandoc.Highlighting` contains the interface to the
Packit Service d2f85f
    skylighting library, which is used for code syntax highlighting.
Packit Service d2f85f
  - `Text.Pandoc.ImageSize` is a utility module containing functions for
Packit Service d2f85f
    calculating image sizes from the contents of image files.
Packit Service d2f85f
  - `Text.Pandoc.MIME` contains functions for associating MIME types
Packit Service d2f85f
    with extensions.
Packit Service d2f85f
  - `Text.Pandoc.Options` defines reader and writer options.
Packit Service d2f85f
  - `Text.Pandoc.PDF` contains functions for producing a PDF from a
Packit Service d2f85f
    LaTeX source.
Packit Service d2f85f
  - `Text.Pandoc.Parsing` contains parsing functions used in multiple readers.
Packit Service d2f85f
  - `Text.Pandoc.Pretty` is a pretty-printing library specialized to
Packit Service d2f85f
    the needs of pandoc.
Packit Service d2f85f
  - `Text.Pandoc.SelfContained` contains functions for making an HTML
Packit Service d2f85f
    file "self-contained," by importing remotely linked images, CSS,
Packit Service d2f85f
    and JavaScript and turning them into `data:` URLs.
Packit Service d2f85f
  - `Text.Pandoc.Shared` is a grab-bag of shared utility functions.
Packit Service d2f85f
  - `Text.Pandoc.Writers.Shared` contains utilities used in writers only.
Packit Service d2f85f
  - `Text.Pandoc.Slides` contains functions for splitting a markdown document
Packit Service d2f85f
    into slides, using the conventions described in the MANUAL.
Packit Service d2f85f
  - `Text.Pandoc.Templates` defines pandoc's templating system.
Packit Service d2f85f
  - `Text.Pandoc.UTF8` contains functions for converting text to and from
Packit Service d2f85f
    UTF8 bytestrings (strict and lazy).
Packit Service d2f85f
  - `Text.Pandoc.Asciify` contains functions to derive ascii versions of
Packit Service d2f85f
    identifiers that use accented characters.
Packit Service d2f85f
  - `Text.Pandoc.UUID` contains functions for generating UUIDs.
Packit Service d2f85f
  - `Text.Pandoc.XML` contains functions for formatting XML.
Packit Service d2f85f
Packit Service d2f85f
[open issues]: https://github.com/jgm/pandoc/issues
Packit Service d2f85f
[closed issues]: https://github.com/jgm/pandoc/issues?q=is%3Aissue+is%3Aclosed
Packit Service d2f85f
[latest released version]: https://github.com/jgm/pandoc/releases/latest
Packit Service d2f85f
[development version]: https://github.com/pandoc-extras/pandoc-nightly/releases/latest
Packit Service d2f85f
[pandoc-discuss]: http://groups.google.com/group/pandoc-discuss
Packit Service d2f85f
[issue tracker]: https://github.com/jgm/pandoc/issues
Packit Service d2f85f
[User's Guide]: http://pandoc.org/MANUAL.html
Packit Service d2f85f
[FAQs]:  http://pandoc.org/faqs.html
Packit Service d2f85f
[EditorConfig]: http://editorconfig.org/
Packit Service d2f85f
[Haskell platform]: http://www.haskell.org/platform/
Packit Service d2f85f
[hsb2hs]: http://hackage.haskell.org/package/hsb2hs
Packit Service d2f85f
[GitHub labels]: https://github.com/jgm/pandoc/labels
Packit Service d2f85f
[beginner-friendly]: https://github.com/jgm/pandoc/labels/beginner-friendly
Packit Service d2f85f
[enhancement]: https://github.com/jgm/pandoc/labels/enhancement
Packit Service d2f85f
[bug]: https://github.com/jgm/pandoc/labels/bug
Packit Service d2f85f
[complexity:low]: https://github.com/jgm/pandoc/labels/complexity:low
Packit Service d2f85f
[complexity:high]: https://github.com/jgm/pandoc/labels/complexity:high
Packit Service d2f85f
[docs]: https://github.com/jgm/pandoc/labels/docs
Packit Service d2f85f
[format:markdown]: https://github.com/jgm/pandoc/labels/format:markdown
Packit Service d2f85f
[new:reader]: https://github.com/jgm/pandoc/labels/new:reader
Packit Service d2f85f
[new:writer]: https://github.com/jgm/pandoc/labels/new:writer
Packit Service d2f85f
[status:in-progress]: https://github.com/jgm/pandoc/labels/status:in-progress
Packit Service d2f85f
[status:more-discussion-needed]: https://github.com/jgm/pandoc/labels/status:more-discussion-needed
Packit Service d2f85f
[status:more-info-needed]: https://github.com/jgm/pandoc/labels/status:more-info-needed
Packit Service d2f85f
[stack]: https://github.com/commercialhaskell/stack
Packit Service d2f85f