Coder Social home page Coder Social logo

earmark's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

earmark's Issues

Warnings on unclosed backquotes in a line

I have learnt that emitting that kind of warning by default would be quite a nuisance. However fixes for issues #66 and #77 do not make much sense if a multiline code block was not closed some n lines above and Earmark can only inform you about the last left open. E.g.

   `This has been left open by error
   zillions of lines
    `This line will be signalled by Earmark`

I see only one solution, we add an option to %Earmark.Options{warn_on_unclosed_backquotes: false}

In the CLI it can be set, defaults to false.
For ex_doc we would need another fix to pass the switch on to Earmark of course.

Wrong curly parens if surrounded text ends with a tag.

Hey Dave,

unfortunately we stumbled upon this bug:

  test "closing parens" do
    result = Earmark.to_html ~s(a "**test**")
    assert result == "<p>a “<strong>test</strong>”</p>\n"
  end

That test should pass (I think) but it doesn't as the result of this is:

<p>a “<strong>test</strong>“</p>\n

What happens is that Earmark.Inline.smartypants/1 receives the following snippets: a " test ". The last snippet is matched to rather than .

Unfortunately that's where I am striking out right now...

Anchor links inside parenthesis

Working on a new feature for ex_doc I notice the following behavior with Earmark:

$ iex -S mix
iex(1)> Earmark.to_html("(the same ones accepted by [configure/1](#configure/1))")
"<p>(the same ones accepted by <a href=\"#configure/1)\">configure/1</a></p>\n"

When the expected result is: <p>(the same ones accepted by <a href=\"#configure/1\">configure/1</a>)</p>

Doing the same thing with Markdown produce the following result:

$ iex -S mix
iex(1)> Markdown.to_html "(the same ones accepted by [configure/1](#configure/1))"
"<p>(the same ones accepted by <a href=\"#configure/1\">configure/1</a>)</p>\n"

Another example can be found in ExUnit.html#start/1

What's the holdup on 1.0.0?

So, what's left to get this to 1.0.0?

It's a little worrying to see such a widely-used package that is still nominally in pre-release status.

Bug in link using parthesis

check the [Wikipedia article on PATH](https://en.wikipedia.org/wiki/PATH_(variable))

It will link to https://en.wikipedia.org/wiki/PATH_(variable

add support for: links in headings

Hi Dave,
I don't know if this is part of the markdown features, or something is missing,
but i think it will be usefull to allow links inside headers.

iex(4)> Earmark.to_html("## [Pygments](http://pygments.org/)")
"<h2>[Pygments](http://pygments.org/)</h2>\n"

Every implementation featured in babelmark2 is supporting this:
http://johnmacfarlane.net/babelmark2/?normalize=1&text=text%0A%0A%23%23+This+is+the+heading+%5BPygments%5D(http%3A%2F%2Fpygments.org%2F)%0A%0Amore+text%0A%0A%23%23+%5BPygments%5D(http%3A%2F%2Fpygments.org%2F)%0A

this is what it looks like in earmark:
earmark_heading

Cheers

0.1.7 causes failures on ExDoc test suite

Just run mix deps.update earmark on ExDoc and you will get:

......................................................

  1) test to_html handles empty input (MarkdownTest.EarmarkTest)
     test/ex_doc/markdown/earmark_test.exs:13
     ** (UndefinedFunctionError) undefined function: Earmark.InCline.update_context/1
     stacktrace:
       Earmark.InCline.update_context(%Earmark.Context{links: #HashDict<[]>, options: %Earmark.Options{breaks: false, do_sanitize: nil, do_smartypants: nil, gfm: true, pedantic: false, renderer: Earmark.HtmlRenderer, sanitize: false, smartypants: true}, rules: nil})
       lib/earmark.ex:170: Earmark.to_html/2
       test/ex_doc/markdown/earmark_test.exs:14

.

  2) test to_html generate the HTML from the markdown (MarkdownTest.EarmarkTest)
     test/ex_doc/markdown/earmark_test.exs:8
     ** (UndefinedFunctionError) undefined function: Earmark.InCline.update_context/1
     stacktrace:
       Earmark.InCline.update_context(%Earmark.Context{links: #HashDict<[]>, options: %Earmark.Options{breaks: false, do_sanitize: nil, do_smartypants: nil, gfm: true, pedantic: false, renderer: Earmark.HtmlRenderer, sanitize: false, smartypants: true}, rules: nil})
       lib/earmark.ex:170: Earmark.to_html/2
       test/ex_doc/markdown/earmark_test.exs:9

Error parsing multi-line quoted text containing asterisk.

This error came up in a PR in ericmj/decimal (The comment is outdated and therefore hidden).

This code:

defmodule Decimal do
  @moduledoc """
  Decimal arithmetic on arbitrary precision floating-point numbers.

  A number is represented by a signed coefficient and exponent such that: `sign
  * coefficient * 10^exponent`. All numbers are represented and calculated
  exactly, but the result of an operation may be rounded depending on the
  context the operation is performed with, see: `Decimal.Context`. Trailing
  zeros in the coefficient are never truncated to preserve the number of
  significant digits unless explicitly done so.

generates the following html:

<section id="moduledoc" class="docstring">
<p>Decimal arithmetic on arbitrary precision floating-point numbers.</p>
<p>A number is represented by a signed coefficient and exponent such that: `sign</p>
<ul>
<li>coefficient * 10^exponent`. All numbers are represented and calculated
exactly, but the result of an operation may be rounded depending on the
context the operation is performed with, see: <a href="Decimal.Context.html"><code class="inline">Decimal.Context</code></a>. Trailing
zeros in the coefficient are never truncated to preserve the number of
significant digits unless explicitly done so.
</li>
</ul>

decimal_ _decimal_v1_1_1-dev-error

While the correct should be something like this:

<section id="moduledoc" class="docstring">
<p>Decimal arithmetic on arbitrary precision floating-point numbers.</p>
<p>A number is represented by a signed coefficient and exponent such that: <code class="inline">sign
coefficient * 10^exponent</code>. All numbers are represented and calculated
exactly, but the result of an operation may be rounded depending on the
context the operation is performed with, see: <a href="Decimal.Context.html"><code class="inline">Decimal.Context</code></a>. Trailing
zeros in the coefficient are never truncated to preserve the number of
significant digits unless explicitly done so.
</p>

decimal_ _decimal_v1_1_1-dev

Changelog update

Hey there,

thanks for earmark! :) I can see there was a maintained changelog once upon a time, which is great. Especially with the recent major version bump an overview of potentially backwards incompatible changes would be great to have!

Thanks + cheers,
Tobi

Unescaped < and inline html

I am not sure if this is a bug indeed.

Anyway, without inline html < is perfectly transformed

iex(4)> Earmark.to_html " a<x"
"<p> a&lt;x</p>\n"

That changes if the line contains html

iex(6)> Earmark.to_html "x<max<br/>"
"<p>x<max<br/></p>\n"

An indication that it is a bug is maybe the following transformation, note the additional space

Earmark.to_html "x< max<br/>"
"<p>x&lt; max<br/></p>\n"

Any opinions?

Smarty pants: apostrophe get transforms into a wrong quote

https://github.com/elixir-lang/elixir/blob/e48ecf47095582a946469d6b572594b4ccfd7721/lib/elixir/lib/application.ex#L148

Returns the value for `key` in `app`'s environment.`

gets transformed into
http://elixir-lang.org/docs/master/elixir/Application.html#fetch_env!/2

earmark_aposthrope

When there is a single quote in a word, denoting an apostrophe, this one gets converted into:
U+2018 LEFT SINGLE QUOTATION MARK

when it whould be
U+2019 RIGHT SINGLE QUOTATION MARK

backticks are not interpreted inside HEADINGS

The code in question:

## Differences from `defmodule`

earmark will convert the code above to:

<h2>Differences from `defmodule`</h2>

while the rest of the implementations will do:

<h2>Differences from <code>defmodule</code></h2>

We use this feature in the Elixir website itself. I was just trying to use it in ExDoc, and bumped into this.

Just for the record, 100% of the implementation in bablemark2 are intepreting what's inside the backticks as code http://johnmacfarlane.net/babelmark2/?normalize=1&text=%23%23+Differences+from+%60defmodule%60%0A%0AThis+is+the+text

Exception with doctest

The two lines below causes and earmark exception when used with doctest.

Works with doctest, but causes earmark exception:

  @doc """
    iex> {:ambiguous, am} = Kalends.DateTime.from_erl({{2014, 3, 9}, {1, 1, 1}}, "America/Montevideo"); am |> Kalends.AmbiguousDateTime.disamb_total_off(0)
    {:error, :no_matches}
  """
% mix docs
** (EXIT from #PID<0.47.0>) an exception was raised:
    ** (CondClauseError) no cond clause evaluated to a true value
        Earmark.HtmlRenderer.expand/2
        lib/earmark/html_renderer.ex:172: Earmark.HtmlRenderer.add_attrs/3
        (elixir) lib/task/supervised.ex:74: Task.Supervised.do_apply/2
        (elixir) lib/task/supervised.ex:19: Task.Supervised.async/3
        (stdlib) proc_lib.erl:239: :proc_lib.init_p_do_apply/3

Indenting the second line with 2 additional spaces prevents earmark exception. But causes doctest exception because doctest expects the indentation to be the same for both lines:

    iex> {:ambiguous, am} = Kalends.DateTime.from_erl({{2014, 3, 9}, {1, 1, 1}}, "America/Montevideo"); am |> Kalends.AmbiguousDateTime.disamb_total_off(0)
      {:error, :no_matches}

** (ExUnit.DocTest.Error) indentation level mismatch: "    {:error, :no_matches}", should have been 2 spaces
    (ex_unit) lib/ex_unit/doc_test.ex:405: ExUnit.DocTest.adjust_indent/4

Parsing error

The following text causes a parsing error,
iex(33)> Earmark.to_html("F\nF\n=")
** (FunctionClauseError) no function clause matching in Earmark.Block.parse/2
lib/earmark/block.ex:56: Earmark.Block.parse([%Earmark.Line.SetextUnderlineHeading{level: 1, line: "="}, %Earmark.Line.Blank{content: "", line: ""}], [%Earmark.Block.Para{attrs: nil, lines: ["F", "F"]}])
lib/earmark/block.ex:49: Earmark.Block.lines_to_blocks/1
lib/earmark/block.ex:40: Earmark.Block.parse/1
lib/earmark.ex:167: Earmark.to_html/2

iex(34)> Earmark.to_html("F\nF\n==")

Its not very inspired markdown put I wouldn't expect the parser to just throw an error, markdown.js for example just returns the text.

Missing backquotes in Elixir Project not giving the right context

related to #66
I'm running against Elixir master (v1.4.0-dev)
https://github.com/elixir-lang/elixir/tree/226438f68b0c2438345f7db72a3e8033d29173b2

You will get three errors when you run make docs_elixir

<no file>:42: warning: Closing unclosed backquotes ` at end of input
<no file>:392: warning: Closing unclosed backquotes ` at end of input
<no file>:36: warning: Closing unclosed backquotes ` at end of input

and there is no way I can figure out where the error is happening.
by running a regular expression, I found an offending line

https://github.com/elixir-lang/elixir/blob/226438f68b0c2438345f7db72a3e8033d29173b2/lib/elixir/lib/module.ex#L372

which is the one causing this warning

:392: warning: Closing unclosed backquotes ` at end of input

So the line number is off by 20

the other two I don't know which one are.

Strange escaping behavior

I originally noticed a line in the Phoenix docs about accepting a wildcard media type:

"""
[...]
    * the accept header specified more than one media type preceeded
      or followed by the wildcard media type "*/*"
[...]
"""

that renders as:

<li>the accept header specified more than one media type preceeded
or followed by the wildcard media type "<em>/</em>"
</li>

Not too surprising... it looks like they forgot to escape the asterisks.

But when I tried to fix it:

"""
[...]
    * the accept header specified more than one media type preceeded
      or followed by the wildcard media type "\*/\*"
[...]
"""

It rendered the exact same way!

Here are some other examples of things that render differently in Earmark (I tested against version 0.1.17) compared to whatever it is that GitHub is using:

Markdown GitHub Earmark Same?
Hello world Hello world Hello world
Hello \ world Hello \ world Hello world (two spaces)
Hello \\ world Hello \ world Hello \\ world
Hello \\\ world Hello \\ world Hello \\ world
Hello \\\\ world Hello \\ world Hello \\ world
Hello \\\\\ world Hello \\\ world Hello \\ world
Hello \\\\\\ world Hello \\\ world Hello \\\\ world
Hello * world Hello * world Hello * world
Hello ** world Hello ** world Hello ** world
Hello */* world Hello <em>/</em> world Hello <em>/</em> world
Hello \*/\* world Hello */* world Hello <em>/</em> world

Hope this helps. My apologies if I'm missing something obvious here.

Error parsing lists with code snips

The following breaks:

Some notes about this command:
   + ```_4.1.9_``` specifies the version of Rails in case you have multiple versions installed.
   + ```--database=postgresql``` sets the database as Postgres
   + There is no need to run ```Jruby -S``` before ```rails new``` since you're using RVM.

And shows up as:
screen shot 2015-11-24 at 12 21 50 am

**edit to show actual markdown, as I forgot I was typing into a markdown editor

Indented lines within Lists

There is a bug in the parser,
you can see it here
http://elixir-lang.org/docs/master/elixir/File.html#read/1
https://github.com/elixir-lang/elixir/blob/e3e8aec7bfa3ca8a060f679f9580bc7f40ae0a78/lib/elixir/lib/file.ex#L219-L225

the problem happens when inside a list (I guess it happens with both ordered and unordered), there is a line that has been indented with 4 spaces or more, the line will be takes as codeblock,

I have checked babelmark2 and the main engines deal with this,

Tag latest version

Hi,

Version 0.1.17 is listed on hex.pm, but the latest tag here is v0.1.8. Was anything left uncommitted?

It would be great to have the latest code available. Thanks!

Error when encoding faulty text

Hey,

I noticed a high error rate and tracked it back to this:

Elixir.ArgumentError argument error 
    unknown :io.put_chars(:standard_error, :unicode, [<<70, 97, 105, 108, 101, 100, 32, 116, 111, 32, 102, 105, 110, 100, 32, 99, 108, 111, 115, 105, 110, 103, 32, 60, 226, 62>>, 10])
    lib/earmark/block.ex:483 Earmark.Block.html_match_to_closing/3
    lib/earmark/block.ex:182 Earmark.Block.parse/2
    lib/earmark/block.ex:49 Earmark.Block.lines_to_blocks/1
    lib/earmark/block.ex:40 Earmark.Block.parse/1
    lib/earmark.ex:167 Earmark.to_html/2
    [...]

This is the text (which is faulty) that we are trying to encode:

<"My dad goes all over the world and learns about the news. One time he met a king. I want to be a reporter too. If I was a reporter right now, I'd probably write a story about if NASA was going to launch a new rocket into space. I'd start by going to the Director of NASA. Then I'd ask him about his rockets. And if any of them were going to space."_

Breaks on cowboy readme

So there's an exception thrown if you try to render the current README markdown for the cowboy project.

I've attached the exception and there's a reproduction (just run the tests) here: https://github.com/knewter/earmark/tree/feature/breaks_on_cowboy_readme

Just thought that might be useful. I can't dig into it right now but I'd be willing to later...

θ67° 1d [jadams:/home/jadams/elixir/earmark] feature/breaks_on_cowboy_readme 2s ± mix test
test/cowboy_test.exs:59: warning: this check/guard will always yield the same result


  1) test rendering the Cowboy webserver README (CowboyTest)
     test/cowboy_test.exs:57
     ** (EXIT from #PID<0.114.0>) an exception was raised:
         ** (FunctionClauseError) no function clause matching in Regex.match?/2
             (elixir) lib/regex.ex:155: Regex.match?(~r/^\s*$/, nil)
             (earmark) lib/earmark/html_renderer.ex:177: Earmark.HtmlRenderer.expand/2
             (earmark) lib/earmark/html_renderer.ex:170: Earmark.HtmlRenderer.add_attrs/3
             (elixir) lib/task/supervised.ex:70: Task.Supervised.do_apply/2
             (elixir) lib/task/supervised.ex:15: Task.Supervised.async/3
             (stdlib) proc_lib.erl:239: :proc_lib.init_p_do_apply/3

.18:29:34.286 [error] Task #PID<0.128.0> started from #PID<0.114.0> terminating
Function: #Function<2.44617958/0 in Earmark.pmap/2>
    Args: []
** (exit) an exception was raised:
    ** (FunctionClauseError) no function clause matching in Regex.match?/2
        (elixir) lib/regex.ex:155: Regex.match?(~r/^\s*$/, nil)
        (earmark) lib/earmark/html_renderer.ex:177: Earmark.HtmlRenderer.expand/2
        (earmark) lib/earmark/html_renderer.ex:170: Earmark.HtmlRenderer.add_attrs/3
        (elixir) lib/task/supervised.ex:70: Task.Supervised.do_apply/2
        (elixir) lib/task/supervised.ex:15: Task.Supervised.async/3
        (stdlib) proc_lib.erl:239: :proc_lib.init_p_do_apply/3
.............18:29:34.287 [error] Task #PID<0.124.0> started from #PID<0.114.0> terminating
Function: #Function<2.44617958/0 in Earmark.pmap/2>
    Args: []
** (exit) an exception was raised:
    ** (FunctionClauseError) no function clause matching in Regex.match?/2
        (elixir) lib/regex.ex:155: Regex.match?(~r/^\s*$/, nil)
        (earmark) lib/earmark/html_renderer.ex:177: Earmark.HtmlRenderer.expand/2
        (earmark) lib/earmark/html_renderer.ex:170: Earmark.HtmlRenderer.add_attrs/3
        (elixir) lib/task/supervised.ex:70: Task.Supervised.do_apply/2
        (elixir) lib/task/supervised.ex:15: Task.Supervised.async/3
        (stdlib) proc_lib.erl:239: :proc_lib.init_p_do_apply/3
...........18:29:34.288 [error] Task #PID<0.134.0> started from #PID<0.114.0> terminating
Function: #Function<2.44617958/0 in Earmark.pmap/2>
    Args: []
** (exit) an exception was raised:
    ** (FunctionClauseError) no function clause matching in Regex.match?/2
        (elixir) lib/regex.ex:155: Regex.match?(~r/^\s*$/, nil)
        (earmark) lib/earmark/html_renderer.ex:177: Earmark.HtmlRenderer.expand/2
        (earmark) lib/earmark/html_renderer.ex:170: Earmark.HtmlRenderer.add_attrs/3
        (elixir) lib/task/supervised.ex:70: Task.Supervised.do_apply/2
        (elixir) lib/task/supervised.ex:15: Task.Supervised.async/3
        (stdlib) proc_lib.erl:239: :proc_lib.init_p_do_apply/3
..............18:29:34.288 [error] Task #PID<0.118.0> started from #PID<0.114.0> terminating
Function: #Function<2.44617958/0 in Earmark.pmap/2>
    Args: []
** (exit) an exception was raised:
    ** (FunctionClauseError) no function clause matching in Regex.match?/2
        (elixir) lib/regex.ex:155: Regex.match?(~r/^\s*$/, nil)
        (earmark) lib/earmark/html_renderer.ex:177: Earmark.HtmlRenderer.expand/2
        (earmark) lib/earmark/html_renderer.ex:170: Earmark.HtmlRenderer.add_attrs/3
        (elixir) lib/task/supervised.ex:70: Task.Supervised.do_apply/2
        (elixir) lib/task/supervised.ex:15: Task.Supervised.async/3
        (stdlib) proc_lib.erl:239: :proc_lib.init_p_do_apply/3
...........18:29:34.289 [error] Task #PID<0.131.0> started from #PID<0.114.0> terminating
Function: #Function<2.44617958/0 in Earmark.pmap/2>
    Args: []
** (exit) an exception was raised:
    ** (FunctionClauseError) no function clause matching in Regex.match?/2
        (elixir) lib/regex.ex:155: Regex.match?(~r/^\s*$/, nil)
        (earmark) lib/earmark/html_renderer.ex:177: Earmark.HtmlRenderer.expand/2
        (earmark) lib/earmark/html_renderer.ex:170: Earmark.HtmlRenderer.add_attrs/3
        (elixir) lib/task/supervised.ex:70: Task.Supervised.do_apply/2
        (elixir) lib/task/supervised.ex:15: Task.Supervised.async/3
        (stdlib) proc_lib.erl:239: :proc_lib.init_p_do_apply/3
................................................................................

Add Math tags support

A certain Markdown-with-benefits parser supports parsing mathematical content like so:

This demonstrates inline $$\LaTeX$$ support, and the following demonstrates block support.

$$A = \frac{1}{2}\int_{a}^{b}\left( \left[f(\theta)\right]^2 - \left[g(\theta)\right]^2 \right)\,d\theta.$$

This is then emitted in a format that a JavaScript tool called MathJax can process into lovely typeset equations. The alluded-to Markdown parser accomplishes this by emitting code like the following:

<p>This demonstrates inline <script type="math/tex">\LaTeX</script> support, and the following demonstrates block support.

<script type="math/tex; mode=display">A = \frac{1}{2}\int_{a}^{b}\left( \left[f(\theta)\right]^2 - \left[g(\theta)\right]^2 \right)\,d\theta.</script>

It's a neat feature and I use it a lot. I've been attempting to add the feature myself, but my regex-fu isn't very strong and so I've really only succeeded in making a bit of a mess. I'm still super-new to Elixir, so if you have any suggestions or know what I'm doing wrong, I'd greatly appreciate the help!

Horizontal Rules create incorrect HTML

iex(38)> Earmark.to_html "****"
"<hr/ class=\"thick\">\n"
iex(39)> Earmark.to_html "----"
"<hr/ class=\"thin\">\n"
iex(40)> Earmark.to_html "___" 
"<hr/ class=\"medium\">\n"

should be

"<hr class=\"...\"/>"

Incorrect rendering of numbered lists

Rendering this list produces the following HTML output (tested on master):

<h2>API</h2>
<p>This module provides 3 main APIs for you to use:</p>
<p>  1. Evaluate a string (<code class="inline">eval_string</code>) or a file (<code class="inline">eval_file</code>)</p>
<pre><code>directly. This is the simplest API to use but also the
 slowest, since the code is evaluated and not compiled before.</code></pre>
<p>  2. Define a function from a string (<code class="inline">function_from_string</code>)</p>
<pre><code>or a file (`function_from_file`). This allows you to embed
 the template as a function inside a module which will then
 be compiled. This is the preferred API if you have access
 to the template at compilation time.</code></pre>
<p>  3. Compile a string (<code class="inline">compile_string</code>) or a file (<code class="inline">compile_file</code>)</p>
<pre><code>into Elixir syntax tree. This is the API used by both functions
 above and is available to you if you want to provide your own
 ways of handling the compiled template.</code></pre>

I call this incorrect because the majority of Markdown implementations out there handle this list as expected. Try pasting the text above into Babelmark, you will see a single processor that has behaviour similar to earmark. All other markdown processors produce a proper list.

This issue has first been spotted on this page – http://elixir-lang.org/docs/stable/eex/EEx.html. Similar problem can be found on these pages:

The list style for Elixir doc strings was a deliberate choice (this commit) to support multiple paragraphs of text mixed with source code blocks in a single list item. This choice was based on the results of the majority of markdown processors on Babelmark, not on the markdown "spec" itself.

Lastly, here's how GitHub renders the original list:

API

This module provides 3 main APIs for you to use:

  1. Evaluate a string (eval_string) or a file (eval_file)
    directly. This is the simplest API to use but also the
    slowest, since the code is evaluated and not compiled before.
  2. Define a function from a string (function_from_string)
    or a file (function_from_file). This allows you to embed
    the template as a function inside a module which will then
    be compiled. This is the preferred API if you have access
    to the template at compilation time.
  3. Compile a string (compile_string) or a file (compile_file)
    into Elixir syntax tree. This is the API used by both functions
    above and is available to you if you want to provide your own
    ways of handling the compiled template.

Parsing the contents of `inline block` and tables

This does not produce a proper table

Built-in type         | Defined as
:-------------------- | :---------
`term`                | `any`
`binary`              | `one | two`
`bitstring`           | `three`

because of the pipe inside an inline block. Is it really "specified" by the "spec" (whichever "spec" defines table syntax) to act that way?

Intuitively, it is more appropriate to strip any symbols inside and of any special meaning, similar to how *, _, and others work.

Remaining compiler warnings

warning: variable pending_lnb is unused
  lib/earmark/helpers/lookahead_helpers.ex:34

warning: unused import Earmark.Helpers.StringHelpers
  lib/earmark/helpers/lookahead_helpers.ex:7

On providing options for rendering fenced code blocks

In some code highlighting libraries, I have seen requirements expecting that the class name of a code block be prefixed with language like so:

<pre><code class="language-css">p { color: red }</code></pre>

In its current form, earmark doesn't appear to allow anything that doesn't match the regex pattern \w* when plucking the language type from the fence block token. This eliminates hyphens from being matched so I can't do something like the following:

  ```language-ruby
  class Foo
    def bar
    end
  end
  ```

The language-ruby part will just get dropped completely by earmark.

After perusing the relevant modules, specifically HtmlRenderer and Line, I haven't seen a clear way to fix this without changing the code. In my own fork, I changed the regex to accomplish what I needed for the short term, but it doesn't seem like the right way to fix this. This seems like it should be fixed on the rendering portion of earmark.

Would it make sense to pass options to the html renderer to prefix code blocks with a static string or provide some callback function that change/transform it? Is there an existing way to accomplish this with the existing codebase?

Thanks for taking the time to look at this! ❤️ ❤️ ❤️

Wrong quotes in links

Hey Dave,

possibly related to #26:

When using quotes inside of a link, they come out as both backwards. The first one should be forward:

Correct:

Earmark.to_html ~s{"Earmark"}
# "<p>“Earmark”</p>\n"

vs. wrong:

Earmark.to_html ~s{["Earmark"](https://github.com/pragdave/earmark/)}
# "<p><a href=\"https://github.com/pragdave/earmark/\">”Earmark”</a></p>\n"

Thanks

Inline HTML with attributes wrapped into a <p> tag

As shown below that applies to empty tags, one line tags, and block tags

iex(87)> Earmark.to_html "<div class=\"a\"/>" 
"<p><div class=\"a\"/></p>\n"
iex(88)> Earmark.to_html "<div class=\"a\">\n...\n</div>"
Unexpected line </div>
"<p><div class=\"a\">\n…</p>\n<p></p>\n"
iex(89)> Earmark.to_html "<div class=\"a\">...</div>"    
"<p><div class=\"a\">…</div></p>\n"
iex(90)> 

Inlined code is escaped from implicit list when the pipe ("|") character is used

iex(1)> foo = """              
...(1)>   - `:foo` - Bar
...(1)>   Baz `:a`
...(1)> """
"  - `:foo` - Bar\n  Baz `:a`\n"

iex(2)> bar = """
...(2)>   - `:foo` - Bar
...(2)>   Baz `:a | :b`
...(2)> """
"  - `:foo` - Bar\n  Baz `:a | :b`\n"

iex(3)> foo |> Earmark.to_html |> IO.puts
<ul>
<li><code class="inline">:foo</code> - Bar
  Baz <code class="inline">:a</code>
</li>
</ul>

:ok

iex(4)> bar |> Earmark.to_html |> IO.puts
<ul>
<li><code class="inline">:foo</code> - Bar
</li>
</ul>
<p>  Baz <code class="inline">:a | :b</code></p>

:ok

Note through that if the code is on the same line as a explicit list item, this bug won't happen (although the result might mean a humongous line)

iex(5)> baz = """
...(5)>   - `:foo` - Bar
...(5)>   - Baz `:a | :b`
...(5)> """
"  - `:foo` - Bar\n  - Baz `:a | :b`\n"
iex(6)> baz |> Earmark.to_html |> IO.puts
<ul>
<li><code class="inline">:foo</code> - Bar
</li>
<li>Baz <code class="inline">:a | :b</code>
</li>
</ul>

:ok

Test fails on MacOS

Hi I am running on MacOS 10.10.2
Elixir version 1.0.4
When I try running the tests using mix test --trace I get the following one failure:

1) test handles multi-paragraph footnote bodies (FootnoteTest)
     test/footnote_test.exs:60
     Assertion with == failed
     code: result == expected
     lhs:  [%Earmark.Block.Para{attrs: nil,
             lines: ["This is a footnote[^fn-1]"]},
            %Earmark.Block.Para{attrs: nil,
             lines: ["[^fn-1]: line 1", "line 2"]},
            %Earmark.Block.Code{attrs: nil, language: nil,
             lines: ["Para 2 line 1", "Para 2 line 2", "", "* List Item 1",
              "  List Item 1 Cont", "* List Item 2"]}]
     rhs:  [%Earmark.Block.Para{attrs: nil,
             lines: ["This is a footnote[^fn-1]"]},
            %Earmark.Block.FnDef{attrs: nil,
             blocks: [%Earmark.Block.Para{attrs: nil,
               lines: ["line 1", "line 2"]},
              %Earmark.Block.Para{attrs: nil,
               lines: ["Para 2 line 1", "Para 2 line 2"]},
              %Earmark.Block.List{attrs: nil,
               blocks: [%Earmark.Block.ListItem{attrs: nil,
                 blocks: [%Earmark.Block.Para{attrs: nil,
                   lines: ["List Item 1", "  List Item 1 Cont"]}],
                 spaced: false, type: :ul},
                %Earmark.Block.ListItem{attrs: nil,
                 blocks: [%Earmark.Block.Para{attrs: nil,
                   lines: ["List Item 2"]}], spaced: false, type: :ul}],
               type: :ul}], id: "fn-1", number: nil}]
     stacktrace:
       test/footnote_test.exs:82

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.