Coder Social home page Coder Social logo

github-markdown-preview's Introduction

Local Github Markdown Preview

Build Status

Use your favorite editor plus the usual edit/refresh cycle to quickly write and polish your markdown for Github.

This program marries html-pipeline with the Listen file watcher to provide a high-fidelity preview (in your local browser, automatically updating on edit) of how Github will render your markdown.

sample screenshot

Installation

gem install github-markdown-preview

Usage

Generate a preview of how Github renders markdown files in a repository:

$ github-markdown-preview <path/to/markdown/file.md> # writes <path/to/markdown/file.md.html>
  • The .html preview is written beside your .md file so that you can validate relative links locally
  • The .html preview is deleted when the script exits

Comment mode

Use the -c switch to generate a preview of how Github renders comments/issues, which differs from repository markdown files in a few ways:

  • newlines are rendered as hard breaks
  • @mentions are linked to the user's home page
  • Note: auto-linked references are not rendered as links. See #17
$ github-markdown-preview -c <path/to/comment/draft.md> # writes <path/to/comment/draft.md.html>

Enable syntax highlighting for code blocks

To enable syntax highlighting for code blocks, you will need to install github-linguist:

gem install github-linguist -v 3.3.1 # 3.3.1 is required
gem install rugged -v 0.23.0 # undeclared dependency of linguist

Note that this install will fail unless your system meets the requirements needed to build its native extensions:

  • You will to either brew install icu4c or apt-get install libicu-dev
  • On Mac, you will need to have XCode installed (seems like a full install is required, not just the Command Line Tools)

Code

Here's a sample file demonstrating how to call github-markdown-preview from your own code:

require 'github-markdown-preview'

# create a preview, which writes the source_file.md.html file to disk
preview = GithubMarkdownPreview::HtmlPreview.new('source_file.md')

# you can also configure your preview with a couple of options
preview = GithubMarkdownPreview::HtmlPreview.new('source_file.md', {
    :delete_on_exit => true, # delete the preview when the program exits
    :comment_mode => true, # render using the rules for Github comments/issues
    :preview_file => 'custom_preview_file.html' # write preview to the given filename,
                                                # rather than the default 'source_file.md.html'
})

# access the preview information
preview.source_file # returns 'source_file.md'
preview.preview_file # returns 'source_file.md.html'

# explicitly update the preview file from the source
preview.update

# watch the source file and update the preview on change
preview.watch # non-blocking watch
preview.watch! # blocking watch

# add a callback to be fired on update; add multiple listeners by calling again
preview.update { puts 'Preview updated!' }

# stop watching the file (only applies to non-blocking watch method)
preview.end_watch

# delete the preview file from disk
preview.delete

Development

$ bundle install
$ rake test

Alternatively, to test with optional dependencies

$ BUNDLE_GEMFILE=Gemfile.optional bundle install
$ BUNDLE_GEMFILE=Gemfile.optional rake test

To run your development copy of the main script without installing it

$ bundle exec bin/github-markdown-preview

To install the your development copy to your system

$ rake install

Contributing

Contributions welcome!

github-markdown-preview's People

Contributors

chronodm avatar dmarcotte avatar fledman avatar jasonm avatar ucarion avatar

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

github-markdown-preview's Issues

Ubuntu installation error

I keep getting the following error:
Error installing github-markdown-preview: activesupport requires Ruby version >= 2.2.2

My ruby version is:
ruby 2.2.4p230 (2015-12-16 revision 53155) [x86_64-linux-gnu]

What seems to be the problem then?

Reference links in comment mode

Comment mode current does not properly render reference links.

A interesting complication: the links are only identified if the reference is valid (the commit/issue/pull exists). It will only be possible to get the correct preview by making calls out to Github to validate references.

So: should we try and implement this with the external dependency? Or keep the preview fully local and leave ignoring reference links as a known issue?

Serve whole directory instead of file

Thanks for the awesome gem ( the only one that worked fine with me )
the only thing is that it doesn't work with directories...
Is it possible to run github-markdow-preview path/to/dir and it works like a simple webserver (maybe on localhost:4000 ) to serve the whole directory ?
something similar to gollum but actually work ( gollum require you to commit the file in order to view it ๐Ÿ‘Ž )

Unable to install gem

From the terminal:

Zoltans-MacBook-Air:~ zol$ gem install github-markdown-preview
ERROR:  While executing gem ... (Gem::RemoteFetcher::UnknownHostError)
    no such name (https://api.rubygems.org/quick/Marshal.4.8/multi_json-1.3.2.gemspec.rz)
Zoltans-MacBook-Air:~ zol$ rbenv versions
  system
* 2.1.0 (set by /Users/zol/.rbenv/version)
Zoltans-MacBook-Air:~ zol$ gem --version
2.2.0

I'm on a fresh install of rbenv and ruby 2.1.0

Integrate shotgun?

Is it worthwhile for github-markdown-preview (standalone usage) to identify file-save events and regenerate the preview? I can contribute it if there is interest.

github-linguist complaint when using github-markdown-preview

Hey dmarcotte, thanks for the awesome tool. Lately I started getting this error and I'm not sure what I've done wrong.
Thanks!

$ gem install github-linguist
Fetching: pygments.rb-0.5.4.gem (100%)
Successfully installed pygments.rb-0.5.4
Fetching: github-linguist-2.10.0.gem (100%)
Successfully installed github-linguist-2.10.0
Parsing documentation for pygments.rb-0.5.4
Installing ri documentation for pygments.rb-0.5.4
Parsing documentation for github-linguist-2.10.0
Installing ri documentation for github-linguist-2.10.0
2 gems installed

$ github-markdown-preview Esquire.md
WARNING: Nokogiri was built against LibXML version 2.9.0, but has dynamically loaded 2.9.1
/Users/my.user/.rvm/gems/ruby-2.0.0-p0/gems/html-pipeline-0.3.1/lib/html/pipeline/syntax_highlight_filter.rb:4:in `rescue in <top (required)>': You need to install 'github-linguist' before using the SyntaxHighlightFilter. See README.md for details (LoadError)
    from /Users/my.user/.rvm/gems/ruby-2.0.0-p0/gems/html-pipeline-0.3.1/lib/html/pipeline/syntax_highlight_filter.rb:1:in `<top (required)>'
    from /Users/my.user/.rvm/gems/ruby-2.0.0-p0/gems/github-markdown-preview-1.6.1/lib/github-markdown-preview/html_preview.rb:38:in `initialize'
    from /Users/my.user/.rvm/gems/ruby-2.0.0-p0/gems/github-markdown-preview-1.6.1/bin/github-markdown-preview:26:in `new'
    from /Users/my.user/.rvm/gems/ruby-2.0.0-p0/gems/github-markdown-preview-1.6.1/bin/github-markdown-preview:26:in `<top (required)>'
    from /Users/my.user/.rvm/gems/ruby-2.0.0-p0/bin/github-markdown-preview:23:in `load'
    from /Users/my.user/.rvm/gems/ruby-2.0.0-p0/bin/github-markdown-preview:23:in `<main>'
    from /Users/my.user/.rvm/gems/ruby-2.0.0-p0/bin/ruby_noexec_wrapper:14:in `eval'
    from /Users/my.user/.rvm/gems/ruby-2.0.0-p0/bin/ruby_noexec_wrapper:14:in `<main>'

$ gem install github-linguist
Successfully installed github-linguist-2.10.0
Parsing documentation for github-linguist-2.10.0
1 gem installed

$ github-markdown-preview Esquire.md
WARNING: Nokogiri was built against LibXML version 2.9.0, but has dynamically loaded 2.9.1
/Users/my.user/.rvm/gems/ruby-2.0.0-p0/gems/html-pipeline-0.3.1/lib/html/pipeline/syntax_highlight_filter.rb:4:in `rescue in <top (required)>': You need to install 'github-linguist' before using the SyntaxHighlightFilter. See README.md for details (LoadError)
    from /Users/my.user/.rvm/gems/ruby-2.0.0-p0/gems/html-pipeline-0.3.1/lib/html/pipeline/syntax_highlight_filter.rb:1:in `<top (required)>'
    from /Users/my.user/.rvm/gems/ruby-2.0.0-p0/gems/github-markdown-preview-1.6.1/lib/github-markdown-preview/html_preview.rb:38:in `initialize'
    from /Users/my.user/.rvm/gems/ruby-2.0.0-p0/gems/github-markdown-preview-1.6.1/bin/github-markdown-preview:26:in `new'
    from /Users/my.user/.rvm/gems/ruby-2.0.0-p0/gems/github-markdown-preview-1.6.1/bin/github-markdown-preview:26:in `<top (required)>'
    from /Users/my.user/.rvm/gems/ruby-2.0.0-p0/bin/github-markdown-preview:23:in `load'
    from /Users/my.user/.rvm/gems/ruby-2.0.0-p0/bin/github-markdown-preview:23:in `<main>'
    from /Users/my.user/.rvm/gems/ruby-2.0.0-p0/bin/ruby_noexec_wrapper:14:in `eval'
    from /Users/my.user/.rvm/gems/ruby-2.0.0-p0/bin/ruby_noexec_wrapper:14:in `<main>'

$ gem install github-markdown-preview
Successfully installed github-markdown-preview-1.6.1
Parsing documentation for github-markdown-preview-1.6.1
1 gem installed

$ github-markdown-preview Esquire.md
WARNING: Nokogiri was built against LibXML version 2.9.0, but has dynamically loaded 2.9.1
/Users/my.user/.rvm/gems/ruby-2.0.0-p0/gems/html-pipeline-0.3.1/lib/html/pipeline/syntax_highlight_filter.rb:4:in `rescue in <top (required)>': You need to install 'github-linguist' before using the SyntaxHighlightFilter. See README.md for details (LoadError)
    from /Users/my.user/.rvm/gems/ruby-2.0.0-p0/gems/html-pipeline-0.3.1/lib/html/pipeline/syntax_highlight_filter.rb:1:in `<top (required)>'
    from /Users/my.user/.rvm/gems/ruby-2.0.0-p0/gems/github-markdown-preview-1.6.1/lib/github-markdown-preview/html_preview.rb:38:in `initialize'
    from /Users/my.user/.rvm/gems/ruby-2.0.0-p0/gems/github-markdown-preview-1.6.1/bin/github-markdown-preview:26:in `new'
    from /Users/my.user/.rvm/gems/ruby-2.0.0-p0/gems/github-markdown-preview-1.6.1/bin/github-markdown-preview:26:in `<top (required)>'
    from /Users/my.user/.rvm/gems/ruby-2.0.0-p0/bin/github-markdown-preview:23:in `load'
    from /Users/my.user/.rvm/gems/ruby-2.0.0-p0/bin/github-markdown-preview:23:in `<main>'
    from /Users/my.user/.rvm/gems/ruby-2.0.0-p0/bin/ruby_noexec_wrapper:14:in `eval'
    from /Users/my.user/.rvm/gems/ruby-2.0.0-p0/bin/ruby_noexec_wrapper:14:in `<main>'

Preview breaks with recent versions of html-pipeline

When running with v0.0.5 or v0.0.6 of html-pipeline, both throw similar errors. Here's the error with 0.0.6

~/work/github-markdown-preview (master) > ./github-markdown-preview.rb ~/work/something/README.md 
/Library/Ruby/Gems/1.8/gems/html-pipeline-0.0.6/lib/html/pipeline/filter.rb:172:in `needs': Missing context keys for HTML::Pipeline::CamoFilter: :asset_proxy, :asset_proxy_secret_key (ArgumentError)
    from /Library/Ruby/Gems/1.8/gems/html-pipeline-0.0.6/lib/html/pipeline/camo_filter.rb:40:in `validate'
    from /Library/Ruby/Gems/1.8/gems/html-pipeline-0.0.6/lib/html/pipeline/filter.rb:42:in `initialize'
    from /Library/Ruby/Gems/1.8/gems/html-pipeline-0.0.6/lib/html/pipeline/filter.rb:142:in `new'
    from /Library/Ruby/Gems/1.8/gems/html-pipeline-0.0.6/lib/html/pipeline/filter.rb:142:in `call'
    from /Library/Ruby/Gems/1.8/gems/html-pipeline-0.0.6/lib/html/pipeline.rb:86:in `call'
    from ./github-markdown-preview.rb:31:in `inject'
    from /Library/Ruby/Gems/1.8/gems/html-pipeline-0.0.6/lib/html/pipeline.rb:86:in `each'
    from /Library/Ruby/Gems/1.8/gems/html-pipeline-0.0.6/lib/html/pipeline.rb:86:in `inject'
    from /Library/Ruby/Gems/1.8/gems/html-pipeline-0.0.6/lib/html/pipeline.rb:86:in `call'
    from ./github-markdown-preview.rb:34:in `update_preview'
    from ./github-markdown-preview.rb:58

The latest working version seems to be v0.0.4.

Create an issues/pull requests/comments mode

Github's rendering of markdown differs between markdown files (which this program currently targets) and issues/pull requests/comments. Not all the features of Github Flavored Markdown are enabled for markdown files in a project's source (i.e markdown files don't get real line breaks or task lists).

It would be useful to have a mode where github-markdown-preview rendered full Github Flavored Markdown. I'm thinking something like:

github-markdown-preview -f myFile.md

(f for "flavored"... unless that's too confusing with the usual "force" meaning of that switch?)

Basic support for this should be pretty easy to add (define a new switch, then toggle :gfm=true in html_preview.rb based on it), though some stuff is almost certainly missing. For instance, there doesn't seem to be a filter for task lists built in to html-pipeline. Perhaps we just need to ask @jch real nicely to open source one ๐Ÿ˜„

Exit cleanly if file deleted?

Right now if a file under preview is moved or deleted, GHMP throws an uncaught exception but keeps running:

$ github-markdown-preview /tmp/foo.md &
[2] 64025
FVFYK0RTHV2H:Work la-dmoles$ Preview available at file:///private/tmp/foo.md.html
rm /tmp/foo.md
FVFYK0RTHV2H:Work la-dmoles$ E, [2019-07-11T09:26:39.413391 #64025] ERROR -- : exception while processing events: Source file deleted Backtrace:
 -- /Users/la-dmoles/.rvm/gems/ruby-2.6.3/gems/github-markdown-preview-5.0.0/lib/github-markdown-preview/html_preview.rb:95:in `update'
 -- /Users/la-dmoles/.rvm/gems/ruby-2.6.3/gems/github-markdown-preview-5.0.0/lib/github-markdown-preview/html_preview.rb:137:in `block in start_watch'
 -- /Users/la-dmoles/.rvm/gems/ruby-2.6.3/gems/listen-3.1.5/lib/listen/event/config.rb:23:in `call'
 -- /Users/la-dmoles/.rvm/gems/ruby-2.6.3/gems/listen-3.1.5/lib/listen/event/processor.rb:115:in `_process_changes'
 -- /Users/la-dmoles/.rvm/gems/ruby-2.6.3/gems/listen-3.1.5/lib/listen/event/processor.rb:19:in `block in loop_for'
 -- /Users/la-dmoles/.rvm/gems/ruby-2.6.3/gems/listen-3.1.5/lib/listen/event/processor.rb:15:in `loop'
 -- /Users/la-dmoles/.rvm/gems/ruby-2.6.3/gems/listen-3.1.5/lib/listen/event/processor.rb:15:in `loop_for'
 -- /Users/la-dmoles/.rvm/gems/ruby-2.6.3/gems/listen-3.1.5/lib/listen/event/loop.rb:84:in `_wait_for_changes'
 -- /Users/la-dmoles/.rvm/gems/ruby-2.6.3/gems/listen-3.1.5/lib/listen/event/loop.rb:42:in `block in setup'
 -- /Users/la-dmoles/.rvm/gems/ruby-2.6.3/gems/listen-3.1.5/lib/listen/internals/thread_pool.rb:6:in `block in add'
ps
  PID TTY           TIME CMD
58571 ttys000    0:00.09 -bash
40405 ttys001    0:00.08 -bash
64025 ttys003    0:00.54 ruby /Users/la-dmoles/.rvm/gems/ruby-2.6.3/bin/github-markdown-preview /tmp/foo.md   
64026 ttys003    0:00.01 /Users/la-dmoles/.rvm/gems/ruby-2.6.3/gems/rb-fsevent-0.10.3/bin/fsevent_watch --format=otnetstring --la

If it's been backgrounded (my usual workflow, I don't know how common it is), it then has to be explicitly foregrounded and Ctrl-C'd, or killed manually.

Would it make sense to exit more cleanly? It looks like something like this (if cleaned up a little bit) in HtmlPreview.start_watch might do it:

@listener = Listen.to(source_file_dir) do
  begin
    update
  rescue FileNotFoundError
    Listen::Logger.error("Source file deleted")
    end_watch
  end
end

But that might also complicate the sleep if blocking at the end -- might have to be a loop that checks @listener.processing?.

MacOS: An error occurred while installing json (1.8.3), and Bundler cannot continue

$ uname -a
Darwin warbookpro 16.6.0 Darwin Kernel Version 16.6.0: Fri Apr 14 16:21:16 PDT 2017; root:xnu-3789.60.24~6/RELEASE_X86_64 x86_64

I'm on MacOS:

$ sw_vers -productVersion
10.12.5

How to reproduce

$ rbenv install 2.4.0
$ rbenv local 2.4.0
$ rbenv local
2.4.0
$ ruby --version
ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-darwin16]
$ gem --version  
2.6.8
$ bundle install
$ bundle install
Fetching gem metadata from https://rubygems.org/..........
Fetching version metadata from https://rubygems.org/...
Fetching dependency metadata from https://rubygems.org/..
Using rake 10.5.0
Using i18n 0.7.0
Installing json 1.8.3 with native extensions
Using minitest 5.10.1
Using thread_safe 0.3.5
Using crass 1.0.2
Using ffi 1.9.14
Using gemoji 2.1.0
Using github-markdown 0.6.8
Using mini_portile 0.6.2
Using rb-fsevent 0.9.8
Using bundler 1.14.6
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /Users/gableroux/.gem/gems/json-1.8.3/ext/json/ext/generator
/Users/gableroux/.rbenv/versions/2.4.0/bin/ruby -r ./siteconf20170621-47299-7kcylr.rb extconf.rb
creating Makefile

current directory: /Users/gableroux/.gem/gems/json-1.8.3/ext/json/ext/generator
make "DESTDIR=" clean

current directory: /Users/gableroux/.gem/gems/json-1.8.3/ext/json/ext/generator
make "DESTDIR="
compiling generator.c
generator.c:861:25: error: use of undeclared identifier 'rb_cFixnum'
    } else if (klass == rb_cFixnum) {
                        ^
generator.c:863:25: error: use of undeclared identifier 'rb_cBignum'
    } else if (klass == rb_cBignum) {
                        ^
generator.c:975:5: warning: division by zero is undefined [-Wdivision-by-zero]
    rb_scan_args(argc, argv, "01", &opts);
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2143:9: note: expanded from macro 'rb_scan_args'
        rb_scan_args0(argc,argvp,fmt,\
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2329:8: note: expanded from macro 'rb_scan_args0'
                     rb_scan_args_verify(fmt, varc), vars)
                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2201:11: note: expanded from macro 'rb_scan_args_verify'
        verify = rb_scan_args_verify_count(fmt, varc); \
                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
note: (skipping 4 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2167:6: note: expanded from macro 'rb_scan_args_count_hash'
     rb_scan_args_count_block(fmt, ofs, varc, vari) : \
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2162:6: note: expanded from macro 'rb_scan_args_count_block'
     rb_scan_args_count_end(fmt, ofs, varc, vari) : \
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2158:12: note: expanded from macro 'rb_scan_args_count_end'
    ((vari)/(!fmt[ofs] || rb_scan_args_bad_format(fmt)))
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
generator.c:975:5: warning: division by zero is undefined [-Wdivision-by-zero]
    rb_scan_args(argc, argv, "01", &opts);
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2143:9: note: expanded from macro 'rb_scan_args'
        rb_scan_args0(argc,argvp,fmt,\
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2329:8: note: expanded from macro 'rb_scan_args0'
                     rb_scan_args_verify(fmt, varc), vars)
                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2201:11: note: expanded from macro 'rb_scan_args_verify'
        verify = rb_scan_args_verify_count(fmt, varc); \
                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
note: (skipping 4 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2167:6: note: expanded from macro 'rb_scan_args_count_hash'
     rb_scan_args_count_block(fmt, ofs, varc, vari) : \
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2163:6: note: expanded from macro 'rb_scan_args_count_block'
     rb_scan_args_count_end(fmt, ofs+1, varc, vari+1))
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2158:12: note: expanded from macro 'rb_scan_args_count_end'
    ((vari)/(!fmt[ofs] || rb_scan_args_bad_format(fmt)))
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
generator.c:975:5: warning: division by zero is undefined [-Wdivision-by-zero]
    rb_scan_args(argc, argv, "01", &opts);
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2143:9: note: expanded from macro 'rb_scan_args'
        rb_scan_args0(argc,argvp,fmt,\
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2329:8: note: expanded from macro 'rb_scan_args0'
                     rb_scan_args_verify(fmt, varc), vars)
                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2201:11: note: expanded from macro 'rb_scan_args_verify'
        verify = rb_scan_args_verify_count(fmt, varc); \
                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
note: (skipping 4 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2168:6: note: expanded from macro 'rb_scan_args_count_hash'
     rb_scan_args_count_block(fmt, ofs+1, varc, vari+1))
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2162:6: note: expanded from macro 'rb_scan_args_count_block'
     rb_scan_args_count_end(fmt, ofs, varc, vari) : \
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2158:12: note: expanded from macro 'rb_scan_args_count_end'
    ((vari)/(!fmt[ofs] || rb_scan_args_bad_format(fmt)))
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
generator.c:975:5: warning: division by zero is undefined [-Wdivision-by-zero]
    rb_scan_args(argc, argv, "01", &opts);
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2143:9: note: expanded from macro 'rb_scan_args'
        rb_scan_args0(argc,argvp,fmt,\
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2329:8: note: expanded from macro 'rb_scan_args0'
                     rb_scan_args_verify(fmt, varc), vars)
                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2201:11: note: expanded from macro 'rb_scan_args_verify'
        verify = rb_scan_args_verify_count(fmt, varc); \
                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
note: (skipping 4 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2167:6: note: expanded from macro 'rb_scan_args_count_hash'
     rb_scan_args_count_block(fmt, ofs, varc, vari) : \
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2162:6: note: expanded from macro 'rb_scan_args_count_block'
     rb_scan_args_count_end(fmt, ofs, varc, vari) : \
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2158:12: note: expanded from macro 'rb_scan_args_count_end'
    ((vari)/(!fmt[ofs] || rb_scan_args_bad_format(fmt)))
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
generator.c:975:5: warning: division by zero is undefined [-Wdivision-by-zero]
    rb_scan_args(argc, argv, "01", &opts);
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2143:9: note: expanded from macro 'rb_scan_args'
        rb_scan_args0(argc,argvp,fmt,\
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2329:8: note: expanded from macro 'rb_scan_args0'
                     rb_scan_args_verify(fmt, varc), vars)
                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2201:11: note: expanded from macro 'rb_scan_args_verify'
        verify = rb_scan_args_verify_count(fmt, varc); \
                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
note: (skipping 4 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2167:6: note: expanded from macro 'rb_scan_args_count_hash'
     rb_scan_args_count_block(fmt, ofs, varc, vari) : \
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2162:6: note: expanded from macro 'rb_scan_args_count_block'
     rb_scan_args_count_end(fmt, ofs, varc, vari) : \
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2158:12: note: expanded from macro 'rb_scan_args_count_end'
    ((vari)/(!fmt[ofs] || rb_scan_args_bad_format(fmt)))
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
generator.c:975:5: warning: division by zero is undefined [-Wdivision-by-zero]
    rb_scan_args(argc, argv, "01", &opts);
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2143:9: note: expanded from macro 'rb_scan_args'
        rb_scan_args0(argc,argvp,fmt,\
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2329:8: note: expanded from macro 'rb_scan_args0'
                     rb_scan_args_verify(fmt, varc), vars)
                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2201:11: note: expanded from macro 'rb_scan_args_verify'
        verify = rb_scan_args_verify_count(fmt, varc); \
                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
note: (skipping 5 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2167:6: note: expanded from macro 'rb_scan_args_count_hash'
     rb_scan_args_count_block(fmt, ofs, varc, vari) : \
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2162:6: note: expanded from macro 'rb_scan_args_count_block'
     rb_scan_args_count_end(fmt, ofs, varc, vari) : \
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/gableroux/.rbenv/versions/2.4.0/include/ruby-2.4.0/ruby/ruby.h:2158:12: note: expanded from macro 'rb_scan_args_count_end'
    ((vari)/(!fmt[ofs] || rb_scan_args_bad_format(fmt)))
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
6 warnings and 2 errors generated.
make: *** [generator.o] Error 1

make failed, exit code 2

Gem files will remain installed in /Users/gableroux/.gem/gems/json-1.8.3 for inspection.
Results logged to /Users/gableroux/.gem/extensions/x86_64-darwin-16/2.4.0-static/json-1.8.3/gem_make.out

An error occurred while installing json (1.8.3), and Bundler cannot continue.
Make sure that `gem install json -v '1.8.3'` succeeds before bundling.

Note: As shown here: #45 (comment) I was previously able to run this on a linux machine ;)

Intra-page links don't seem to work

On GitHub, I can link to another section on a page by linking to the name of the corresponding h2 (or whatever) by its HTML id. However, it seems that github-markdown-preview does not generate these ids currently.

Or maybe I missed something in the docs?

Also, superb work on this gem! It is truly a pleasure to use. ๐ŸŽ‰

.gem/ruby/2.3.0/gems/listen-3.0.3/lib/listen/adapter/linux.rb:30:in `require': cannot load such file -- rb-inotify (LoadError)

Just installed the gem and having the following error:

$ github-markdown-preview test.md 
Preview available at file:///home/gableroux/test.md.html
/home/gableroux/.gem/ruby/2.3.0/gems/listen-3.0.3/lib/listen/adapter/linux.rb:30:in `require': cannot load such file -- rb-inotify (LoadError)
        from /home/gableroux/.gem/ruby/2.3.0/gems/listen-3.0.3/lib/listen/adapter/linux.rb:30:in `_configure'
        from /home/gableroux/.gem/ruby/2.3.0/gems/listen-3.0.3/lib/listen/adapter/base.rb:45:in `block in configure'
        from /home/gableroux/.gem/ruby/2.3.0/gems/listen-3.0.3/lib/listen/adapter/base.rb:40:in `each'
        from /home/gableroux/.gem/ruby/2.3.0/gems/listen-3.0.3/lib/listen/adapter/base.rb:40:in `configure'
        from /home/gableroux/.gem/ruby/2.3.0/gems/listen-3.0.3/lib/listen/adapter/base.rb:63:in `start'
        from /home/gableroux/.gem/ruby/2.3.0/gems/listen-3.0.3/lib/listen/backend.rb:26:in `start'
        from /home/gableroux/.gem/ruby/2.3.0/gems/listen-3.0.3/lib/listen/listener.rb:67:in `block in <class:Listener>'
        from /home/gableroux/.gem/ruby/2.3.0/gems/listen-3.0.3/lib/listen/fsm.rb:120:in `instance_eval'
        from /home/gableroux/.gem/ruby/2.3.0/gems/listen-3.0.3/lib/listen/fsm.rb:120:in `call'
        from /home/gableroux/.gem/ruby/2.3.0/gems/listen-3.0.3/lib/listen/fsm.rb:91:in `transition_with_callbacks!'
        from /home/gableroux/.gem/ruby/2.3.0/gems/listen-3.0.3/lib/listen/fsm.rb:57:in `transition'
        from /home/gableroux/.gem/ruby/2.3.0/gems/listen-3.0.3/lib/listen/listener.rb:90:in `start'
        from /home/gableroux/.gem/ruby/2.3.0/gems/github-markdown-preview-4.0.2/lib/github-markdown-preview/html_preview.rb:144:in `start_watch'
        from /home/gableroux/.gem/ruby/2.3.0/gems/github-markdown-preview-4.0.2/lib/github-markdown-preview/html_preview.rb:129:in `watch!'
        from /home/gableroux/.gem/ruby/2.3.0/gems/github-markdown-preview-4.0.2/bin/github-markdown-preview:48:in `<top (required)>'
        from /home/gableroux/.gem/ruby/2.3.0/bin/github-markdown-preview:22:in `load'
        from /home/gableroux/.gem/ruby/2.3.0/bin/github-markdown-preview:22:in `<main>'

https://github.com/guard/listen/blob/v3.0.8/lib/listen/adapter/linux.rb#L30

Points to:
https://github.com/nex3/rb-inotify

$ ruby --version                            
ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-linux]
$ uname -a
Linux zbookarch.local 4.8.13-1-ARCH #1 SMP PREEMPT Fri Dec 9 07:24:34 CET 2016 x86_64 GNU/Linux
$ gem --version                                           
2.5.2
$ github-markdown-preview --version                               
github-markdown-preview version 4.0.2
$ gem list | grep github-markdown-preview
github-markdown-preview (4.0.2)
$ gem list | grep rb-inotify 
rb-inotify (0.9.7, 0.9.5)

That's probably an issue with https://github.com/guard/listen though.

command doesn't work

I tried installing it, doing the correct gem install github-markdown-preview, I had a couple problems with dependencies, but I got it all installed and I would still get github-markdown-preview: command not found, so what's up with that?

Serving up example via server breaks formatting

This is a bit of a convoluted issue, but a real use case.

Using the new Intellij 13, my workflow is to start up the github-markdown-preview in the terminal (or through an external tool) and then right-click on the README.md.html (e.g.) and choose "Open in Browser". In the new intellij, they helpfully create an internal server running on a random port, so the URL that gets opened in the browser is http://localhost:63342/project-name/README.md.html.

This causes a failure in rendering because the generated file is specifically referencing a local file.

<link rel="stylesheet" type="text/css" href="/Users/my.name/.rvm/gems/ruby-2.0.0-p0/gems/github-markdown-preview-2.0.0/lib/github-markdown-preview/../../data/css/github.css">
<link rel="stylesheet" type="text/css" href="/Users/my.name/.rvm/gems/ruby-2.0.0-p0/gems/github-markdown-preview-2.0.0/lib/github-markdown-preview/../../data/css/github2.css">

The browser interprets these links to be relative to the localhost:63342 from above, and 404s.

One idea would be to make it reference file:///Users/...., but that doesn't work because the browser understands that to be a vulnerability (makes sense).

Another option would be to reference the github raw CSS from this project (or elsewhere).

<link rel="stylesheet" type="text/css" href="https://raw.github.com/dmarcotte/github-markdown-preview/master/data/css/github.css">
<link rel="stylesheet" type="text/css" href="https://raw.github.com/dmarcotte/github-markdown-preview/master/data/css/github2.css">

A third option is to not support this use case, which seems acceptable given the situation :)

unitialized constant GitHub (NameError)

Hiya,

I'm ruby 2.2.0 and I just installed github-markdown-preview using gem install. I got this stacktrace:

/home/wasd/.rubies/ruby-2.2.0/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:69:in `require': uninitialized constant GitHub (NameError)
        from /home/wasd/.rubies/ruby-2.2.0/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:69:in `require'
        from /home/wasd/.gem/ruby/2.2.0/gems/html-pipeline-1.11.0/lib/html/pipeline/markdown_filter.rb:2:in `<top (required)>'
        from /home/wasd/.gem/ruby/2.2.0/gems/github-markdown-preview-3.1.3/lib/github-markdown-preview/html_preview.rb:68:in `pipeline_filters'
        from /home/wasd/.gem/ruby/2.2.0/gems/github-markdown-preview-3.1.3/lib/github-markdown-preview/html_preview.rb:41:in `initialize'
        from /home/wasd/.gem/ruby/2.2.0/gems/github-markdown-preview-3.1.3/bin/github-markdown-preview:31:in `new'
        from /home/wasd/.gem/ruby/2.2.0/gems/github-markdown-preview-3.1.3/bin/github-markdown-preview:31:in `<top (required)>'
        from /home/wasd/.gem/ruby/2.2.0/bin/github-markdown-preview:23:in `load'
        from /home/wasd/.gem/ruby/2.2.0/bin/github-markdown-preview:23:in `<main>'

Haxe is missing lexer (ArgumentError)

I'm getting this error:
Installed with gem install github-markdown-preview

Tried with:

ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]
gem 1.8.23

and

ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-linux]
gem 2.1.8

Stack trace

/home/nisse/.rvm/gems/ruby-2.0.0-p247/gems/github-linguist-2.9.5/lib/linguist/language.rb:240:in `initialize': Haxe is missing lexer (ArgumentError)
from /home/nisse/.rvm/gems/ruby-2.0.0-p247/gems/github-linguist-2.9.5/lib/linguist/language.rb:39:in `new'
from /home/nisse/.rvm/gems/ruby-2.0.0-p247/gems/github-linguist-2.9.5/lib/linguist/language.rb:39:in `create'
from /home/nisse/.rvm/gems/ruby-2.0.0-p247/gems/github-linguist-2.9.5/lib/linguist/language.rb:478:in `block in <module:Linguist>'
from /home/nisse/.rvm/gems/ruby-2.0.0-p247/gems/github-linguist-2.9.5/lib/linguist/language.rb:458:in `each'
from /home/nisse/.rvm/gems/ruby-2.0.0-p247/gems/github-linguist-2.9.5/lib/linguist/language.rb:458:in `<module:Linguist>'
from /home/nisse/.rvm/gems/ruby-2.0.0-p247/gems/github-linguist-2.9.5/lib/linguist/language.rb:8:in `<top (required)>'
from /home/nisse/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /home/nisse/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /home/nisse/.rvm/gems/ruby-2.0.0-p247/gems/github-linguist-2.9.5/lib/linguist/blob_helper.rb:2:in `<top (required)>'
from /home/nisse/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /home/nisse/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /home/nisse/.rvm/gems/ruby-2.0.0-p247/gems/github-linguist-2.9.5/lib/linguist.rb:1:in `<top (required)>'
from /home/nisse/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /home/nisse/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /home/nisse/.rvm/gems/ruby-2.0.0-p247/gems/html-pipeline-0.3.1/lib/html/pipeline/syntax_highlight_filter.rb:2:in `<top (required)>'
from /home/nisse/.rvm/gems/ruby-2.0.0-p247/gems/github-markdown-preview-1.6.0/lib/github-markdown-preview/html_preview.rb:38:in `initialize'
from /home/nisse/.rvm/gems/ruby-2.0.0-p247/gems/github-markdown-preview-1.6.0/bin/github-markdown-preview:26:in `new'
from /home/nisse/.rvm/gems/ruby-2.0.0-p247/gems/github-markdown-preview-1.6.0/bin/github-markdown-preview:26:in `<top (required)>'
from /home/nisse/.rvm/gems/ruby-2.0.0-p247/bin/github-markdown-preview:23:in `load'
from /home/nisse/.rvm/gems/ruby-2.0.0-p247/bin/github-markdown-preview:23:in `<main>'
from /home/nisse/.rvm/gems/ruby-2.0.0-p247/bin/ruby_executable_hooks:15:in `eval'
from /home/nisse/.rvm/gems/ruby-2.0.0-p247/bin/ruby_executable_hooks:15:in `<main>'

Nil reference parsing empty list items

Steps to reproduce:

  • Create Markdown document containing a list with an empty item, e.g.
-
  • Preview the document

Expected:

  • Document previews correctly

Actual:

  • github-markdown-preview exits with the stack trace below:
$ /Users/dmoles/.rvm/gems/ruby-2.2.2/gems/github-markdown-preview-4.0.0/lib/github-markdown-preview/filter/task_list_filter.rb:30:in `block in call': undefined method `text?' for nil:NilClass (NoMethodError)
    from /Users/dmoles/.rvm/gems/ruby-2.2.2/gems/nokogiri-1.6.5/lib/nokogiri/xml/node_set.rb:237:in `block in each'
    from /Users/dmoles/.rvm/gems/ruby-2.2.2/gems/nokogiri-1.6.5/lib/nokogiri/xml/node_set.rb:236:in `upto'
    from /Users/dmoles/.rvm/gems/ruby-2.2.2/gems/nokogiri-1.6.5/lib/nokogiri/xml/node_set.rb:236:in `each'
    from /Users/dmoles/.rvm/gems/ruby-2.2.2/gems/github-markdown-preview-4.0.0/lib/github-markdown-preview/filter/task_list_filter.rb:38:in `call'
    from /Users/dmoles/.rvm/gems/ruby-2.2.2/gems/html-pipeline-2.0/lib/html/pipeline/filter.rb:130:in `call'
    from /Users/dmoles/.rvm/gems/ruby-2.2.2/gems/html-pipeline-2.0/lib/html/pipeline.rb:121:in `block in perform_filter'
    from /Users/dmoles/.rvm/gems/ruby-2.2.2/gems/html-pipeline-2.0/lib/html/pipeline.rb:159:in `instrument'
    from /Users/dmoles/.rvm/gems/ruby-2.2.2/gems/html-pipeline-2.0/lib/html/pipeline.rb:120:in `perform_filter'
    from /Users/dmoles/.rvm/gems/ruby-2.2.2/gems/html-pipeline-2.0/lib/html/pipeline.rb:106:in `block (2 levels) in call'
    from /Users/dmoles/.rvm/gems/ruby-2.2.2/gems/html-pipeline-2.0/lib/html/pipeline.rb:105:in `each'
    from /Users/dmoles/.rvm/gems/ruby-2.2.2/gems/html-pipeline-2.0/lib/html/pipeline.rb:105:in `inject'
    from /Users/dmoles/.rvm/gems/ruby-2.2.2/gems/html-pipeline-2.0/lib/html/pipeline.rb:105:in `block in call'
    from /Users/dmoles/.rvm/gems/ruby-2.2.2/gems/html-pipeline-2.0/lib/html/pipeline.rb:159:in `instrument'
    from /Users/dmoles/.rvm/gems/ruby-2.2.2/gems/html-pipeline-2.0/lib/html/pipeline.rb:103:in `call'
    from /Users/dmoles/.rvm/gems/ruby-2.2.2/gems/github-markdown-preview-4.0.0/lib/github-markdown-preview/html_preview.rb:96:in `update'
    from /Users/dmoles/.rvm/gems/ruby-2.2.2/gems/github-markdown-preview-4.0.0/lib/github-markdown-preview/html_preview.rb:44:in `initialize'
    from /Users/dmoles/.rvm/gems/ruby-2.2.2/gems/github-markdown-preview-4.0.0/bin/github-markdown-preview:31:in `new'
    from /Users/dmoles/.rvm/gems/ruby-2.2.2/gems/github-markdown-preview-4.0.0/bin/github-markdown-preview:31:in `<top (required)>'
    from /Users/dmoles/.rvm/gems/ruby-2.2.2/bin/github-markdown-preview:23:in `load'
    from /Users/dmoles/.rvm/gems/ruby-2.2.2/bin/github-markdown-preview:23:in `<main>'
    from /Users/dmoles/.rvm/gems/ruby-2.2.2/bin/ruby_executable_hooks:15:in `eval'
    from /Users/dmoles/.rvm/gems/ruby-2.2.2/bin/ruby_executable_hooks:15:in `<main>'

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.