From 1fc2535099f6b68b5bfdd6c56e98d2155b4cdd53 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Wed, 12 Nov 2014 10:45:33 +0100 Subject: [PATCH] Initial commit --- .gitattributes | 72 ++++++++++++++ .gitignore | 181 ++++++++++++++++++++++++++++++++++ .paket/paket.bootstrapper.exe | Bin 0 -> 13360 bytes README.md | 80 +++++++++++++++ build.cmd | 14 +++ build.fsx | 86 ++++++++++++++++ build.sh | 33 +++++++ paket.dependencies | 4 + paket.lock | 15 +++ slides/input.md | 128 ++++++++++++++++++++++++ 10 files changed, 613 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .paket/paket.bootstrapper.exe create mode 100644 README.md create mode 100644 build.cmd create mode 100644 build.fsx create mode 100644 build.sh create mode 100644 paket.dependencies create mode 100644 paket.lock create mode 100644 slides/input.md diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..ca10eb4 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,72 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +# Autodetect text or binary. Do not leave merge conflict markers in the files. +* text=auto merge=union + +# Use LF in the working directory by default. Override with core.autocrlf=true. +*.fs eol=lf + +# Visual Studio can read LF sln files, but it always writes them as CRLF. +*.sln eol=crlf + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain + +*.sh text eol=lf \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..82af2a6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,181 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Xamarin Studio / monodevelop user-specific +*.userprefs + +# Build results + +[Dd]ebug/ +[Rr]elease/ +x64/ +build/ +[Bb]in/ +[Oo]bj/ + +# Enable "build/" folder in the NuGet Packages folder since NuGet packages use it for MSBuild targets +!packages/*/build/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.log +*.scc + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +*.ncrunch* +.*crunch*.local.xml + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.Publish.xml + +# Enable nuget.exe in the .nuget folder (though normally executables are not tracked) +!.nuget/NuGet.exe + +# Windows Azure Build Output +csx +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +sql/ +*.Cache +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.[Pp]ublish.xml +*.pfx +*.publishsettings + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +App_Data/*.mdf +App_Data/*.ldf + + +#LightSwitch generated files +GeneratedArtifacts/ +_Pvt_Extensions/ +ModelManifest.xml + +# ========================= +# Windows detritus +# ========================= + +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Mac desktop service store files +.DS_Store + +# =================================================== +# Exclude F# project specific directories and files +# =================================================== + +# NuGet Packages Directory +packages/ + +# Generated documentation folder +docs/output/ + +# Temp folder used for publishing docs +temp/ + +# Test results produced by build +TestResults.xml + +# Nuget outputs +nuget/*.nupkg +.paket/paket.exe +output +paket-files +release.cmd diff --git a/.paket/paket.bootstrapper.exe b/.paket/paket.bootstrapper.exe new file mode 100644 index 0000000000000000000000000000000000000000..1a4fe13a42cbf76084150e72a4a1a4d06a33c5fb GIT binary patch literal 13360 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md new file mode 100644 index 0000000..70517d7 --- /dev/null +++ b/README.md @@ -0,0 +1,80 @@ +#FsReveal + +FsReveal brings F# to the [reveal.js][revealjs] web presentation framework. + +## Features + +- F# syntax highlighting with tool-tips! It supports heaps of other languages as well +- Write in Markdown +- Speaker notes; Shows the current slide, next slide, elapsed time and current time +- Generate slides from .fsx files +- Built in themes +- Horizontal AND vertical slides +- Built in slide transitions using CSS 3D transforms +- Slide overview +- Works on mobile browsers. Swipe your way through the presentation. + + +## Getting Started + +### Get +Clone or download this repo. Check out GitHub's links to the right if you need some help. + +### Create +Open `slides/input.md` in your favourite text editor. + +This is the source for your entire presentation. Inside you will find an example presentation that demonstrates how to use FsReveal. + +### Build +Open a console/terminal and `cd` into the FsReveal folder. + +If you're using Windows run + + build.cmd + +If you're using a Mac run + + ./build.sh + +This will download all of the packages that FsReveal needs to create your slides. + +Your slides are generated and saved to the `output` folder. + +A web server will start automatically and your presentation will be opened in your browser. + +FsReveal will detect changes to your slides and generate them again for you; you just need to refresh your browser. + +> We're working on auto refreshing the browser for you. + +### Use +- Use the arrow keys to navigate left, right, up and down +- Press `Esc` to see an overview +- Press `f` to view in fullscreen +- Press `s` to see speaker notes. This only works when running your presentation from the web server. + +## Examples +Check out what others have created. Submit a PR if you have something to add to the list. + +- [Markdown example][md-example] by [@kimsk][kimsk-twitter] [(source)][md-example-source] +- [.fsx example][fsx-example] by [@kimsk][kimsk-twitter] [(source)][fsx-example-source] +- [RPG F# Workshop][rpg-fsharp-workshop] by [@troykershaw][troykershaw-twitter] [(source)][rpg-fsharp-workshop-source] +- [F# on the Web - 0 to production in 12 weeks][fsharp-on-the-web] by [@panesofglass][panesofglass-twitter] [(source)][fsharp-on-the-web-source] + + +[revealjs]: https://github.com/hakimel/reveal.js/ "reveal.js | HTML presentations made easy" + +[kimsk-twitter]: https://twitter.com/kimsk "@kimsk on Twitter" +[troykershaw-twitter]: https://twitter.com/troykershaw "@troykershaw on Twitter" +[panesofglass-twitter]: https://twitter.com/panesofglass "@panesofglass on Twitter" + +[fsx-example]: http://fsreveal.azurewebsites.net/ ".fsx example" +[fsx-example-source]: https://github.com/fsprojects/FsReveal/blob/master/src/presentations/FsReveal.fsx ".fsx example source" + +[md-example]: http://fsreveal.azurewebsites.net/index-md.html "Markdown example" +[md-example-source]: https://raw.githubusercontent.com/fsprojects/FsReveal/master/src/presentations/FsReveal.md "Markdown example source" + +[rpg-fsharp-workshop]: http://troykershaw.github.io/RpgFsharpWorkshop "RPG F# Workshop" +[rpg-fsharp-workshop-source]: https://github.com/troykershaw/RpgFsharpWorkshop "RPG F# Workshop source" + +[fsharp-on-the-web]: http://panesofglass.github.io/TodoBackendFSharp "F# on the Web - 0 to production in 12 weeks" +[fsharp-on-the-web-source]: https://github.com/panesofglass/TodoBackendFSharp "F# on the Web source" diff --git a/build.cmd b/build.cmd new file mode 100644 index 0000000..b879122 --- /dev/null +++ b/build.cmd @@ -0,0 +1,14 @@ +@echo off +cls + +.paket\paket.bootstrapper.exe prerelease +if errorlevel 1 ( + exit /b %errorlevel% +) + +.paket\paket.exe restore -v +if errorlevel 1 ( + exit /b %errorlevel% +) + +packages\FAKE\tools\FAKE.exe build.fsx %* diff --git a/build.fsx b/build.fsx new file mode 100644 index 0000000..a5f4974 --- /dev/null +++ b/build.fsx @@ -0,0 +1,86 @@ +#I @"packages/FsReveal/fsreveal/" +#I @"packages/FAKE/tools/" +#I @"packages/RazorEngine/lib/net40/" +#I @"packages/Suave/lib/" + +#r "FakeLib.dll" +#r "suave.dll" + +#load "fsreveal.fsx" + +open FsReveal +open Fake +open System.IO +open System.Diagnostics +open Suave +open Suave.Web +open Suave.Http +open Suave.Http.Files + +let outDir = "output" + +Target "Clean" (fun _ -> + CleanDirs [outDir] +) + +let copyPics() = + !! "pics/*.*" + |> CopyFiles (outDir @@ "images") + +let generateFor (file:FileInfo) = + copyPics() + let rec tryGenerate trials = + try + let outputFileName = file.Name.Replace(file.Extension,".html") + match file.Extension with + | ".md" -> FsReveal.GenerateOutputFromMarkdownFile outDir outputFileName file.FullName + | ".fsx" -> FsReveal.GenerateOutputFromScriptFile outDir outputFileName file.FullName + | _ -> () + with + | exn when trials > 0 -> tryGenerate (trials - 1) + | exn -> tracefn "Could not generate slides for %s" file.FullName + + tryGenerate 3 + +let startWebServer () = + let serverConfig = + { default_config with + home_folder = Some (System.IO.Path.Combine(__SOURCE_DIRECTORY__, outDir)) + } + let app = + Writers.set_header "Cache-Control" "no-cache, no-store, must-revalidate" + >>= Writers.set_header "Pragma" "no-cache" + >>= Writers.set_header "Expires" "0" + >>= browse + web_server_async serverConfig app |> snd |> Async.Start + Process.Start "http://localhost:8083/input.html" |> ignore + +Target "GenerateSlides" (fun _ -> + !! "slides/*.md" + ++ "slides/*.md" + |> Seq.map fileInfo + |> Seq.iter generateFor +) + +Target "KeepRunning" (fun _ -> + use watcher = new FileSystemWatcher(DirectoryInfo("slides").FullName,"*.*") + watcher.EnableRaisingEvents <- true + watcher.Changed.Add(fun e -> fileInfo e.FullPath |> generateFor) + watcher.Created.Add(fun e -> fileInfo e.FullPath |> generateFor) + watcher.Renamed.Add(fun e -> fileInfo e.FullPath |> generateFor) + + startWebServer () + + traceImportant "Waiting for slide edits. Press any key to stop." + + System.Console.ReadKey() |> ignore + + watcher.EnableRaisingEvents <- false + watcher.Dispose() +) + +"Clean" + ==> "GenerateSlides" + ==> "KeepRunning" + +RunTargetOrDefault "KeepRunning" diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..493266a --- /dev/null +++ b/build.sh @@ -0,0 +1,33 @@ +#!/bin/bash +if test "$OS" = "Windows_NT" +then + # use .Net + + .paket/paket.bootstrapper.exe prerelease + exit_code=$? + if [ $exit_code -ne 0 ]; then + exit $exit_code + fi + + .paket/paket.exe restore -v + exit_code=$? + if [ $exit_code -ne 0 ]; then + exit $exit_code + fi + + packages/FAKE/tools/FAKE.exe $@ --fsiargs -d:MONO build.fsx +else + # use mono + mono .paket/paket.bootstrapper.exe prerelease + exit_code=$? + if [ $exit_code -ne 0 ]; then + exit $exit_code + fi + + mono .paket/paket.exe restore -v + exit_code=$? + if [ $exit_code -ne 0 ]; then + exit $exit_code + fi + mono packages/FAKE/tools/FAKE.exe $@ --fsiargs -d:MONO build.fsx +fi diff --git a/paket.dependencies b/paket.dependencies new file mode 100644 index 0000000..b137151 --- /dev/null +++ b/paket.dependencies @@ -0,0 +1,4 @@ +source https://nuget.org/api/v2 + +nuget FsReveal +nuget FAKE \ No newline at end of file diff --git a/paket.lock b/paket.lock new file mode 100644 index 0000000..d92a68b --- /dev/null +++ b/paket.lock @@ -0,0 +1,15 @@ +NUGET + remote: https://nuget.org/api/v2 + specs: + FAKE (3.9.5) + FSharp.Compiler.Service (0.0.67) + FSharp.Formatting (2.4.36) + FSharp.Compiler.Service (0.0.67) + Microsoft.AspNet.Razor (2.0.30506.0) + RazorEngine (3.3.0) + FsReveal (0.0.8) + FSharp.Formatting (>= 2.4.36) + Microsoft.AspNet.Razor (2.0.30506.0) + RazorEngine (3.3.0) + Microsoft.AspNet.Razor (>= 2.0.30506.0) + Suave (0.16.0) \ No newline at end of file diff --git a/slides/input.md b/slides/input.md new file mode 100644 index 0000000..71e4879 --- /dev/null +++ b/slides/input.md @@ -0,0 +1,128 @@ +- title : FsReveal +- description : Introduction to FsReveal +- author : Karlkim Suwanmongkol +- theme : Night +- transition : default + +*** + +### What is FsReveal? + +- Generates [reveal.js](http://lab.hakim.se/reveal-js/#/) presentation from [markdown](http://daringfireball.net/projects/markdown/) +- Utilizes [FSharp.Formatting](https://github.com/tpetricek/FSharp.Formatting) for markdown parsing + +*** + +### Reveal.js + +- A framework for easily creating beautiful presentations using HTML. + + +> **Atwood's Law**: any application that can be written in JavaScript, will eventually be written in JavaScript. + +*** + +### FSharp.Formatting + +- F# tools for generating documentation (Markdown processor and F# code formatter). +- It parses markdown and F# script file and generates HTML or PDF. +- Code syntax highlighting support. +- It also evaluates your F# code and produce tooltips. + +*** + +### Syntax Highlighting + +#### F# (with tooltips) + + let a = 5 + let factorial x = [1..x] |> List.reduce (*) + let c = factorial a + +--- + +#### C# + + [lang=cs] + using System; + + class Program + { + static void Main() + { + Console.WriteLine("Hello, world!"); + } + } + +--- + +#### JavaScript + + [lang=js] + function copyWithEvaluation(iElem, elem) { + return function (obj) { + var newObj = {}; + for (var p in obj) { + var v = obj[p]; + if (typeof v === "function") { + v = v(iElem, elem); + } + newObj[p] = v; + } + if (!newObj.exactTiming) { + newObj.delay += exports._libraryDelay; + } + return newObj; + }; + } + + +--- + +#### Haskell + + [lang=haskell] + recur_count k = 1 : 1 : zipWith recurAdd (recur_count k) (tail (recur_count k)) + where recurAdd x y = k * x + y + + main = do + argv <- getArgs + inputFile <- openFile (head argv) ReadMode + line <- hGetLine inputFile + let [n,k] = map read (words line) + printf "%d\n" ((recur_count k) !! (n-1)) + +*code from [NashFP/rosalind](https://github.com/NashFP/rosalind/blob/master/mark_wutka%2Bhaskell/FIB/fib_ziplist.hs)* + +--- + +### SQL + + [lang=sql] + select * + from + (select 1 as Id union all select 2 union all select 3) as X + where Id in (@Ids1, @Ids2, @Ids3) + +*sql from [Dapper](https://code.google.com/p/dapper-dot-net/)* + +*** + +**Bayes' Rule in LaTeX** + +$ \Pr(A|B)=\frac{\Pr(B|A)\Pr(A)}{\Pr(B|A)\Pr(A)+\Pr(B|\neg A)\Pr(\neg A)} $ + +*** + +### The Reality of a Developer's Life + +**When I show my boss that I've fixed a bug:** + +![When I show my boss that I've fixed a bug](http://www.topito.com/wp-content/uploads/2013/01/code-07.gif) + +**When your regular expression returns what you expect:** + +![When your regular expression returns what you expect](http://www.topito.com/wp-content/uploads/2013/01/code-03.gif) + +*from [The Reality of a Developer's Life - in GIFs, Of Course](http://server.dzone.com/articles/reality-developers-life-gifs)* +