Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Loading…

Improved reveal converter #69

Merged
merged 68 commits into from

3 participants

@damianavila
Note: This is a new implementation of reveal converter for ipynb. You can find the previous implementation and the discussion here. That deprecated PR is now closed because of the following new improved implementation.

Abstract

This PR implement a new option in nbconvert to output a html-slideshow based in the reveal javascript library.

Introduction

The publication of computational results through the IPython Notebook have gained a lot of interest in the scientific python community. nbconvert provides multiples output formats to distribute the IPython notebook content, even there is a web app service to automate the process of publication.
However, up to now there is a lack of a slideshow output format, a static html presentation tool (we have to mention that there is live slideshow mode in the current developing version of IPython).
So, we proposed us to implement a slideshow output format for nbconvert based in a html presentation framework called reveal.js.

Implementation

For a detail explanation of the ideas behind the implementation, you can see the IPEP 9 and the discussion about it, here.
The main idea was to get a functional implementation to provide a new output format: reveal (a html slideshow).
To achieve this, we have written a new class called ConvertedReveal inherited from ConvertedHtml. This new class overwrite some methods from his parent and write new ones, such as the main def build_slides method to "inject" html derived from ipynb into the reveal framework.
To delimit the cells and set their properties, we use a metadata dict.
We also have get the reveal.js framework trough a submodule.

Results

To test this new reveal option in nbconvert you can checkout to the branch reveal_converter in our repository.

Then, you have to init and update the submodule to get reveal.js library:
git submodule update --init

You will also need the metaui-slideshow from @Carreau to get the functionality to set slideshow metadata to each cell.

In this repository, we also provide a example_nb_tour.ipynb to perform some testing of the new described feature.

Usage: $python nbconvert.py -f reveal example_nb_tour.ipynb

Then you can open the resulting html slideshow with any new browser (with Chrome you can render well printed pdf document from your slides). You have to open this html file in the same directory where it was generated to achieve properly the reveal.js machinery.

You can see a live slideshow here: http://www.slideviper.oquanta.info/nbcreveal/example_nb_tour_slides.html

Conclusion

We have achieved an easy and simple implementation of a static html slideshow based in reveal.js library.
We use metadata from cells to delimit the slides to be unified with the behaviour of the live slideshow option currently being developed in the IPython main project.
There is a lot of work to do to enhance this feature or even rewritten to test other possibilities.

We are waiting for your reviews and criticism.
Regards.

Damián.

damianavila added some commits
@damianavila damianavila Addednew slider converter based in reveal.js 9c157b9
@damianavila damianavila Corrected docstring for ConverterSlider bb68270
@damianavila damianavila Changed name option from slider to reveal 3fddccc
@damianavila damianavila Updated reveal.js to last commit 519ee26809bfd6bd824155e999d2c9eaae67…
…86bb
3211636
@damianavila damianavila Chaged default theme to night and default transition to linear 1946930
@damianavila damianavila Fixed initmathjax to get a default left alignment an receive a parame…
…ter to modified it. Also fix reveal.py to send a center alignment parameter to initmathjax.
abd19a8
@damianavila damianavila New config file revealmathjax.js to configure mathjax in the reveal s…
…lides. The previous attemp to share initmathjax.js contained bugs
f146a48
@damianavila damianavila Added new delimiters to build vertical (nested slides). We also updat…
…e the example_slide.ipynb to show the new functionality
1144dbd
@damianavila damianavila Fixed mathjax loading event only in the slides containing formulas to…
… improve performance
9dc360d
@damianavila damianavila Moved the html code to a template file and added functions to read th…
…e template
f85ee80
@damianavila damianavila Major change to read metadata from each cell and build the proper slides d2652b8
@damianavila damianavila Fixed some bugs from specific interlines to render markdown properly …
…in the slides
0ed1d04
@damianavila damianavila Fixed bug when cells do not have associated slideshow metadata. Fixed…
… example_slide.ipynb to use metadata for slides building.
9537025
@damianavila damianavila Added some pythonic idioms to get a better code 38084d0
@damianavila damianavila Replaced some names to better interpretation 5f7bbf4
@damianavila damianavila Added some description for new funcions 72a25ba
@damianavila damianavila Corrected some links in the example notebook 1552dd9
@damianavila damianavila Deleted reveal.js to get it later by a submodule 0e1b8e2
@damianavila damianavila Deleted reveal folder to get it later by a submodule acf54ff
@damianavila damianavila Getting reveal.js as submodule c1f664e
@damianavila damianavila Removed submodule to test real update 36e92ae
@damianavila damianavila Added last reveal.js as a submodule 8719a37
@damianavila damianavila Peptified code to get a better visualization 11e331d
@damianavila damianavila Added some comments to specific pieces of code 82374eb
@damianavila damianavila Added support to render code properly 3582bfb
@damianavila damianavila Implemented loading of pyerr, images and videos outside the markdown …
…cell
676b208
@damianavila damianavila New implementation for reveal option in nbconvert bypassing markdown …
…step. The structure behind the implementaion follows the discussion in IPEP 9
e69b603
@damianavila damianavila Added a new example: the 00_notebook_tour with metadata to render a s…
…lideshow.
471d1c7
@damianavila damianavila Modified theme and transition in template. a987af9
@damianavila damianavila Added ipython slyling through css. Modified template to read ipython.…
…css.
bf964a7
@damianavila damianavila Modified theme=simple and transition linear c2d5c19
@damianavila damianavila Updated example_nb_tour.ipynb deb72b4
@damianavila damianavila Updated example_nb_tour.ipynb to fit content to slides. c7e6d67
@damianavila damianavila Cleaning of reveal converter to make the PR 86a62ec
@damianavila damianavila Delited html from the example. 851c7c3
converters/reveal.py
((6 lines not shown))
+from markdown import markdown
+
+import os
+import io
+import itertools
+
+
+class ConverterReveal(ConverterHTML):
+ #"""
+ #Convert a notebook to a html slideshow.
+
+ #It generates a static html slideshow based reveal.js.
+ #The delimiters for each "Header slide", "Slide"", and "Fragment"
+ #are retrieved from the 'slideshow' metadata.
+ #"""
+
@Carreau Owner
Carreau added a note

Are the comment usefull here ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
@Carreau Carreau commented on the diff
converters/reveal.py
((66 lines not shown))
+
+ def render_raw(self, cell):
+ if self.raw_as_verbatim:
+ return [self.in_tag('pre', self.meta2str(cell.metadata)),
+ self.in_tag('pre', cell.source)]
+ else:
+ return [self.meta2str(cell.metadata), cell.source]
+
+ def meta2str(self, meta):
+ "transform metadata dict (containing slides delimiters) to string "
+ try:
+ meta_tuple = meta[u'slideshow'].items()
+ except KeyError as e: # if there is not slideshow metadata
+ meta_tuple = [(u'slide_type', u'untouched')]
+ meta_list = [[x + ' = ' + unicode(y)] for x, y in meta_tuple]
+ return u'\n'.join(list(itertools.chain(*meta_list)))
@Carreau Owner
Carreau added a note

I don't totally understand why you need to make the metadata as strings to re-parse them later.
It might be due to the current implementation of nbconvert if there are things to change elsewhere to make it easier, than maybe we can do so.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
css/ipython.css
@@ -0,0 +1,739 @@
+<style type="text/css">
@Carreau Owner
Carreau added a note

Is it the same css as the one in IPython ?
It seems like the parent class is able to get it from IPython dir.
If we can avoid having duplicate files, it would be nice as in the end nbconvert will be merged into ipython.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
converters/reveal.py
((183 lines not shown))
+
+ def template_read(self):
+ "read the reveal_template.html"
+ here = os.path.split(os.path.realpath(__file__))[0]
+ reveal_template = os.path.join(here, '..', 'templates',
+ 'reveal_base.html')
+ with io.open(reveal_template, 'r', encoding='utf-8') as f:
+ template = f.readlines()
+ template = [s.strip() for s in template]
+ return template
+
+ def template_split(self):
+ "split the reveal_template.html in header and footer lists"
+ temp = self.template_read()
+ splitted_temp = [list(x[1]) for x in itertools.groupby(temp,
+ lambda x: x == u'%slides%') if not x[0]]
@Carreau Owner
Carreau added a note

If we use a template, let's maybe use a templating engine,
We now require Jinja2 for notebook why not for nbconvert.

Especially, me might be able to use jinja2 for loop to do things more cleany and just pass it an array of cells.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
@Carreau
Owner

That's a pretty damned huge work, especially seeing how nbconvert have a cross-files logic.

I added a few comment/suggestion inline. I'm late so i've to run, but when I get more time, i'll try to dive into that.

@damianavila
@damianavila

OK @Carreau.... I took your suggestion and now I get the ipython css from the the ipython local as the parent class does. I have also work in the styling as you requested before...

You can see the new example here
I bet you to find a difference with the current notebook (hehe, in fact, there are some minor ones).

OK, it is late here in Buenos Aires, see you!

Damián.

@Carreau
Owner

Hi,

I suppose you saw thin integrated to my nbviewerbranch.

There are a few modification to add, which will still require manual patching as long a nbconvert is not correctly packaged.

If you are interested I can explain you how to deploy your own nbviewer locally or online one day.

Also, I think it will be nice to have a clean "slideshow notebook" made for this mode that really "explain" what you can do as "http://lab.hakim.se/reveal-js/#/" does.

With instruction "press down", "press right"... and maybe stuff like "This is a New Section cell", this is a new "fragment" ...Etc (of course we need to decide the naming before...)

@damianavila
@damianavila

I have implemented a preliminary support for notes (preliminary, because it is assuming that Speaker notes cells have to go at the end of each Header slide or Slide (nested), but maybe some user have to write your notes at the beginning, so I have to do defensive code to detect this behavior). Also, reveal support notes for only index.html, so I have to develop a way to get the name of the notebook and reference to it inside the template for the notes...
I will do all of this by the following days, if I get some time between the Christmas...
You can test the support for notes here, pressing the "s" in your keyboard (one emergent window will open containing the notes and views of the slideshow, you have to handle the slideshow in the previous main window - not the emerging one - and the emergent window content will be synchronize with the main).

@Carreau
Owner
@damianavila
@damianavila

OK, just to keep a record... I know you are on holidays now...
I modified the implementation of speaker notes to be able to recognize this cell in any place inside the slides (not just the end of the slide).
I also add some function to get a properly notes.html to interact with the speaker notes (this notes.html - the emerging window when you activate the speaker notes - now have the same name (followed by _notes) as the presentation itself. To do that, I have to render customized html and js from "templates".

@Carreau after the new year, when you have some time (only when you have time, I known we are on holidays :-) ), could you re-render the slideshow in your heroku branch because the speaker notes are not well rendered (because of the new improvements in the reveal converter)... thanks.

@Carreau
Owner

If you wish I can show you how to run your own instance of nbviewer on heroku.
Then you'll see how to integrate any converter into it.

Have a look here if you are interested, and tell me if the instructions are comprehensible/correct.

I think we might want to make a wiki page on how to do it, or a script to help...

@damianavila

I have running an instance on nbviewer. I have some comments about that, but I will do it in the corresponding issue in that repository. I will try to get a wiki with my steps... It was easy with your tips... but i take some minor changes... :-)
Have a happy New Year!!!

@damianavila

OK, I want to add a timer in the Speaker notes window to keep the user informed about the time left to finish his/her talk. But, the time has be configurable by the user... this bring me to the the question: what do you think about to add a "config" cell (I mean a new label, as with "Speaker notes"? Maybe there are too many labels, but this one would be useful too, not only for the timer, but also to config another features of the slideshow... ideas, critics?

Damián.

@Carreau
Owner
@damianavila
@Carreau
Owner

There are a lot of stuff to be done with notebook metadata.

  • authors
  • licence
  • dates
  • ...

The UI have to be designed and modular.
It shouldn't be too hard to write a small plugin which add a button in the toolbar that pop-up a full UI to modify the metadata.

Right now I think we really want to land this so that it can start to be used in dev.
And the bigger the PR are the more painfull they are to modify.

Also right now, the url-scheme used by the speaker mode conflict with nbviewer, so you can't use the 2. I have to take a look to see what can be done.

@Carreau
Owner

Add this https://gist.github.com/4437348 in your custom.jsto have Ui to edit the metadata.
It adds a small icon in the toolbar.
--
Matthias

@damianavila
@damianavila
@damianavila

OK, I did some minor changes to get a cleaner and consistent code...

Damián.

@damianavila damianavila referenced this pull request from a commit
Commit has since been removed from the repository and is no longer available.
@damianavila

OK, after two month of the original implementation (and one month for this PR), reveal library had fixed some issues, including some issues we had to deal with to integrate them to nbconvert. Because, there is a native solution now, I decided to update the reveal submodule and made some minor changes accordingly. From the user point of view, you now will find some improvements such as a timer in the speaker notes, new transitions and a new way (another one) to get pdf from slides...

I really hope we can discuss this PR soon... some users could benefit in the next weeks at the time to prepare their slides for the upcoming conferences.

Damián.

PS: @ellisonbg and anyone else out there are kindly invited... :-)

@Carreau
Owner

That's great !
Dis you had any chance with jinja templates ?

@damianavila
@ellisonbg
Owner
converters/reveal.py
((5 lines not shown))
+from converters.utils import highlight, coalesce_streams
+
+from IPython.utils import path
+from markdown import markdown
+
+import os
+import io
+import itertools
+
+
+class ConverterReveal(ConverterHTML):
+ #"""
+ # Convert a ipython notebook to a html slideshow
+ # based in reveal.js library.
+ #"""
+
@Carreau Owner
Carreau added a note

Commented docstring ?

I forgot to uncomment it... fixed!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
@Carreau Carreau commented on the diff
converters/reveal.py
((89 lines not shown))
+ lines.extend(self.optional_header())
+ begin = ['<div class="reveal"><div class="slides">']
+ lines.extend(begin)
+ slides_list = self.build_slides()
+ lines.extend(slides_list)
+ end = ['</div></div>']
+ lines.extend(end)
+ lines.extend(self.optional_footer())
+ return u'\n'.join(lines)
+
+ def clean_text(self, cell_separator='\n'):
+ "clean and reorganize the text list to be slided"
+ text = self.main_body(cell_separator)
+ self.delim = [u'slide_type = untouched',
+ u'slide_type = -',
+ u'slide_type = slide',
@Carreau Owner
Carreau added a note

is there a difference between untouched and - ?

@Carreau Owner
Carreau added a note

Got my response further, yes it is the same.

When you don't "touch" the cell (with "touch" I mean selecting a kind of cell in the UI), the dict containing the value does not exist... so, with this function: https://github.com/ipython/nbconvert/pull/69/files#L2R65 I set the name "untouched" capturing the exception.
When you "touch" the cell (for example making it "slide", but then you can go back a mark it as none) the slideshow dict is created and it takes the "-" value for none cells.
I think that this behavior is because the current implementation of slideshow.js...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
@Carreau
Owner

It quite a nice big hack of nbconvert you did here.
The code is in some place pretty hard to follow and will probably be really brittle to modify, but it is nice.

I don't think we really need to tweek it too much to be perfect as we'll have difficulties to have a 'perfect match caracter for caracter' with the jinja template.

@damianavila
@ellisonbg
Owner

OK I have finally had a chance to play with this. For now I am mostly focusing on the look of the final product as I realize the code will change a lot when we move to the templated approach.

Inn terms of the look and feel, I think there are two directions we can go it:

  1. We can not do anything extra and just use the themes provided by reveal.js. In this case, we would simply format our content so that it can be styled appropriately by reveal. So for example, we would not try to do anything fancy with the IPython style prompts, we would just dump code and output into the standard reveal environments. The benefit of this approach is that we get a lot for free - there are a couple of good looking themes that reveal ships right out of the box.
  2. We can try to develop our own theme (which is what you have done here). Obviously, this is a lot more work, and forces you to follow the ever changing IPython css/less. The benefit of this is that we can make it "look like IPython" and set things exactly how we want.

Right now, you are going after 2. In this case, I think we want the styling to mirror that of the actual notebook as closely as possible. Some things that I see with the current style:

  • Prompts are larger font size that the code cell input area - should match.
  • Fonts are a mix of the reveal defaults and ipython specific ones. For approach 2 we should use our own font choices.
  • Borders and padding around code cells are off.
  • Big black border around images/plots.
  • Text output is not monospace.
  • We really have to think carefully about how things are sized. Content from markdown cells is too small for a slide how, but code might be too big (can't show large samples).

However, because the IPython css/less is shifting around so much right now, I almost think it would make more sense to focus on usage case 1 above = just use the default theme/style provided by reveal. Thoughts?

@damianavila
@damianavila

One last... one can go further in the integration I proposed before...

In this example: http://www.slideviper.oquanta.info/nbcreveal/sky_test.html?theme=sky, not only the title are rendered by the reveal theme, but also all the markdown cells...

It resemble a notebook but with more style... ;-)

OK, good night!

@Carreau
Owner

I agre with damian here.
The slideshow already support multiple theme, and we are reworking the css on IPython notebook itself, so in any case we will probably have to tweek it again here. And as we will have less and variable il will be easier. I think the important part here if focussing on the structure of the converter and have a reference for it. This does not yet involve css that can perfectly be change while moving to jinja converter.

@Carreau
Owner

And thanks to @damianavila, good work on this,
we've now got a reveal converter with jinja!

The template file could boil down to ~100 lines once written correctly to extract css from the right file instead of copy and pasting the all file header.

@damianavila

This is great... I have my own reveal converter with jinja template but it will not be ready until the weekend (I have to update it to the last changes in jinja template PR).
I think we need to merge this as soon as possible to continue with the development using the jinja templates. We need the infrastructure provided by the the reveal library and some other css and js to get a fully functional jinja-based reveal converter... so I think that merging this PR will:
1- do our next work more easy... providing us with the proper infrastructure.
2- get a jinja free version of the converter that can actually be useful for some people.
3- and finally :-) I would not like to see all this hours of work dying nowhere being the first reference for this converter.

Damián.

@Carreau
Owner

Yes, it would be great to merge/ update all the PR to have a good reference point !

@ellisonbg
Owner
@damianavila

OK, waiting for the merge of this PR... then we can switch to a new discussion about the Mathias's and my jinja implementation (I have to finish some details but I need the reveal infrastructure merged to test it deeply) of reveal converter... do you agree?

@ellisonbg
Owner
@Carreau
Owner

@ellisonbg I've started to reimplement this in jinja, but what would be great is to have the current nbconvert clean of other PR (either merge, or refused, or turned into issues) and used the implemented converter as references for jinja work.

@damianavila

Adding to Mathias, merging this PR will gives us the reference (and the reveal submodule, and other necessary files, such as additional css, js, examples slideshow notebook, etc) for a working re-implementation of the reveal converter with the jinja templates.

@damianavila

@ellisonbg it would be great to know what do you want me to do with this PR.
If you want to reject it, just let me know... and I will do a new PR over the jinja branch of Mathias.

BTW, I am not very happy to write (again) a new PR from scratch when there was a PR - this one - waiting for a lot of weeks just to die, and actually useful in its current state, because merging it would give us all the complementary code and references needed to work in the jinja-based reveal converter... but, finally, I want to move this forward so I will do it again...

I do not want to sound rude here, I just want to express some concerns about the review process with this PRs and how some things are discouraging for new people to contribute (maybe my vision is a little biased because I did not know your workflow to deal with PR, and I was expecting other dynamic, sorry if this is the case). But these critics are to be discussed in the appropriate issue, not here... so, how do I proceed with this PR?

Cheers.

Damián.

@ellisonbg
Owner
@damianavila

OK, I will try to be on IRC... See you there.

Cheers,

Damián

@damianavila

I added a social button...

I have also proposed a new PR to the jinja branch of @Carreau, but we need some of the code living in this PR to get a functional slideshow.

Cheers.

Damián.

@damianavila

The guys in reveal have fixed some things about speaker notes... so it is no longer necessary to patch with our own modified notes.js... Then, I have updated the reveal submodule and made the proper changes to suit to the new stage.

@Carreau
Owner

Pinging @ellisonbg I'll wait 24h for your review and otherwise merge before rebasing the jinja stuff on top.

@Carreau
Owner

And jinja template rebase nicely on top of that. :-)

@damianavila

Great :+1:

@ellisonbg
Owner
@damianavila

I have made some minor changes to work with the new ipython css, so you need the current development version of IPython to working properly...

@damianavila

OK, this converter now works with the new css styling from IPython dev.
ping @Carreau because in you branch you have merged a previous version of this one working with the css before less...

@Carreau
Owner

Did dreamt of brian merging this one ? It still appears openned to me... Am I crazy ?

@Carreau
Owner

Ok, merging.

@Carreau Carreau merged commit 5cc2804 into ipython:master
@damianavila

@Carreau I don't think your are crazy, just too much work the last days... ;-)

Great. Thanks to all who participated in the discussion and make suggestions.
Thanks @ellisonbg for your useful feedback and for be open to my critics...
And special thanks to @Carreau who was dealing with me and my requests and provided too much help...

Now, going for jinja... jeje... little lie... because we have already a functional reveal option with jinja template and merged with @Carreau work! So we wait for you in jinja thread to move it forward...

Cheers.

Damián.
ping @fperez, we are waiting for you (and everyone else) in this PR with some jinja stuff ;-)

@damianavila damianavila deleted the unknown repository branch
@damianavila damianavila referenced this pull request
Merged

Jinja Templates #77

14 of 21 tasks complete
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on Dec 2, 2012
  1. @damianavila
  2. @damianavila
Commits on Dec 4, 2012
  1. @damianavila
  2. @damianavila
  3. @damianavila
  4. @damianavila

    Fixed initmathjax to get a default left alignment an receive a parame…

    damianavila authored
    …ter to modified it. Also fix reveal.py to send a center alignment parameter to initmathjax.
  5. @damianavila

    New config file revealmathjax.js to configure mathjax in the reveal s…

    damianavila authored
    …lides. The previous attemp to share initmathjax.js contained bugs
Commits on Dec 5, 2012
  1. @damianavila

    Added new delimiters to build vertical (nested slides). We also updat…

    damianavila authored
    …e the example_slide.ipynb to show the new functionality
  2. @damianavila
Commits on Dec 7, 2012
  1. @damianavila
Commits on Dec 11, 2012
  1. @damianavila
  2. @damianavila
  3. @damianavila

    Fixed bug when cells do not have associated slideshow metadata. Fixed…

    damianavila authored
    … example_slide.ipynb to use metadata for slides building.
  4. @damianavila
  5. @damianavila
  6. @damianavila
  7. @damianavila
Commits on Dec 12, 2012
  1. @damianavila
  2. @damianavila
  3. @damianavila
  4. @damianavila
  5. @damianavila
  6. @damianavila
Commits on Dec 13, 2012
  1. @damianavila
Commits on Dec 14, 2012
  1. @damianavila
Commits on Dec 15, 2012
  1. @damianavila
Commits on Dec 18, 2012
  1. @damianavila

    New implementation for reveal option in nbconvert bypassing markdown …

    damianavila authored
    …step. The structure behind the implementaion follows the discussion in IPEP 9
  2. @damianavila
  3. @damianavila
  4. @damianavila
  5. @damianavila
  6. @damianavila
  7. @damianavila
  8. @damianavila
  9. @damianavila
Commits on Dec 20, 2012
  1. @damianavila

    Added ipython styling through a method inside the converter. Modified…

    damianavila authored
    … the template to adjust to the new method. Rewritten of some css slyling through reveal_html.css.
  2. @damianavila
  3. @damianavila
  4. @damianavila
Commits on Dec 22, 2012
  1. @damianavila

    Added important comment

    damianavila authored
  2. @damianavila
Commits on Dec 23, 2012
  1. @damianavila
  2. @damianavila
  3. @damianavila
Commits on Dec 26, 2012
  1. @damianavila

    Added support for speaker notes cells in the any place of the slides …

    damianavila authored
    …and adjacent speaker notes cells.
  2. @damianavila

    Added complete support for notes, with names acordingly with the titl…

    damianavila authored
    …e of the notebook currently being converted.
Commits on Jan 11, 2013
  1. @damianavila
  2. @damianavila
  3. @damianavila
Commits on Jan 15, 2013
  1. @damianavila
  2. @damianavila

    Update example notebook.

    damianavila authored
  3. @damianavila
Commits on Jan 16, 2013
  1. @damianavila
  2. @damianavila
  3. @damianavila
Commits on Jan 22, 2013
  1. @damianavila
  2. @damianavila
Commits on Jan 30, 2013
  1. @damianavila

    Update reveal submodule.

    damianavila authored
  2. @damianavila
  3. @damianavila

    Uncommented docstring.

    damianavila authored
Commits on Jan 31, 2013
  1. @damianavila
  2. @damianavila
Commits on Feb 8, 2013
  1. @damianavila

    Added social button.

    damianavila authored
  2. @damianavila

    Fixed mathjax inline.

    damianavila authored
Commits on Feb 10, 2013
  1. @damianavila
  2. @damianavila

    Fixed test reference.

    damianavila authored
Commits on Feb 13, 2013
  1. @damianavila
  2. @damianavila

    Fixed some css styling.

    damianavila authored
Something went wrong with that request. Please try again.