Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
559 lines (465 sloc) 11.7 KB
@echo off & rem { /* CSS comment hiding the batch section from CSS
:##############################################################################
:# #
:# Filename md2h.bat #
:# #
:# Description Convert GitHub MarkDown to HTML, and display it #
:# #
:# Notes This file is a dual Batch+CSS script. #
:# Dummy CSS definitions on the first line hide the batch #
:# section inside a CSS comment. #
:# #
:# Uses the GitHub markdown API: #
:# https://developer.github.com/v3/markdown/ #
:# #
:# Includes the stylesheet (w. its copyright message) from: #
:# https://gist.github.com/tuzz/3331384 #
:# #
:# Author: JFL jf.larvoire@hpe.com Jean-Francois Larvoire #
:# #
:# History: #
:# 2019-11-30 JFL Created this script. #
:# #
:# © Copyright 2019 Hewlett Packard Enterprise Development LP #
:# Licensed under the Apache 2.0 license www.apache.org/licenses/LICENSE-2.0 #
:##############################################################################
setlocal EnableExtensions DisableDelayedExpansion
set "VERSION=2019-12-05"
set "SCRIPT=%~nx0" &:# Script name
set "SNAME=%~n0" &:# Script name, without its extension
set "SPATH=%~dp0" &:# Script path
set "SPATH=%SPATH:~0,-1%" &:# Script path, without the trailing \
set "SFULL=%~f0" &:# Script full pathname
set ^"ARG0=%0^" &:# Script invokation name
set ^"ARGS=%*^" &:# Argument line
set "GITHUB=https://api.github.com"
goto :main
:#----------------------------------------------------------------------------#
:is_newer FILE1 FILE2
:# Query xcopy to know if the copy by date would be done.
:# If the copy is done, the file name is output.
:# If that name does not contain "\", then the drive name "C:" is prepended!
:# So search either for a : or a \
if not exist %2 exit /b 0 &:# ERRORLEVEL 0 if target is missing
xcopy /d /l /y %1 %2 | findstr ": \\" >nul &:# ERRORLEVEL 0 if newer, 1 if older
if errorlevel 1 %ECHO.D% %2 is already up-to-date
exit /b
:#----------------------------------------------------------------------------#
:help
echo %SCRIPT% - Convert GitHub MarkDown to HTML, and display it
echo.
echo Usage: %SCRIPT% [OPTIONS] PATHNAME
echo.
echo Options:
echo -? Display this help message and exit
echo -v Display curl progress messages
echo -V Display the script version and exit
echo -X Display the commands to execute, but don't run them
echo.
echo Note: This program uses curl.exe. For old Windows versions that don't have it,
echo curl.exe can be downloaded from https://curl.haxx.se/windows/
exit /b 0
:#----------------------------------------------------------------------------#
:main
set "MD="
set "DEBUG=0"
set "ECHO.D=if 0==1 echo"
set "ECHO.V=if 0==1 echo"
set "OPTS= -s"
set "EXEC="
set ">=>"
set ">>=>>"
goto :get_arg
:next_arg
shift
:get_arg
if [%1]==[] goto :start
set "ARG=%~1"
if "%ARG%"=="-?" goto :help
if "%ARG%"=="/?" goto :help
if "%ARG%"=="-d" set "DEBUG=1" & set "ECHO.D=echo" & goto :next_arg
if "%ARG%"=="-v" set "OPTS=%OPTS: -s=%" & set "ECHO.V=echo" & goto :next_arg
if "%ARG%"=="-V" (echo %VERSION%) & exit /b
if "%ARG%"=="-X" set "EXEC=echo" & set ">=^>" & set ">>=^>^>" & goto :next_arg
if "%ARG:~0,1%"=="-" >&2 echo Error: Unexpected switch: %1 & exit /b 1
if not defined MD set "MD=%~1" & goto :next_arg
>&2 echo Error: Unexpected argument: %1
exit /b 1
:start
if not defined MD goto :help
if not exist "%MD%" (
>&2 echo Error: File "%MD%" not found
exit /b 1
)
%ECHO.D% # Server: %GITHUB%
for %%f in ("%MD%") do set "HTML=%TEMP%\%%~nf.htm"
%ECHO.D% # HTML file: "%HTML%"
set "CSS=%TEMP%\github.css"
%ECHO.D% # CSS file: "%HTML%"
for %%f in ("%CSS%") do set "HREF=%%~nxf"
setlocal EnableExtensions EnableDelayedExpansion
:# Unfortunately, Chrome refuses to load style sheets from files, unless they end with the .css extension.
:# So do not load this batch directly, but instead make a renamed copy in the %TEMP% directory.
:# Update the .css copy if needed
call :is_newer "!SFULL!" "!CSS!" &:# ERRORLEVEL 0 if newer, 1 if older
if not errorlevel 1 (
%ECHO.D% # Updating "!CSS!"
%EXEC% copy /y "!SFULL!" "!CSS!" %>% NUL
)
set "LT=<"
set "GT=>"
> "!HTML!" echo !LT!html!GT!
>> "!HTML!" echo !LT!head!GT!
>> "!HTML!" echo !LT!meta charset="UTF-8"!GT!
>> "!HTML!" echo !LT!link rel="stylesheet" type="text/css" href="!HREF!"!GT!
>> "!HTML!" echo !LT!/head!GT!
>> "!HTML!" echo !LT!body!GT!
%EXEC% curl%OPTS% %GITHUB%/markdown/raw -X "POST" -H "Content-Type: text/plain" --data-binary "@!MD!" %>>% "!HTML!"
if errorlevel 9009 (
>&2 echo This program uses curl.exe. For old Windows versions that don't have it,
>&2 echo curl.exe can be downloaded from https://curl.haxx.se/windows/
exit /b 1
)
if errorlevel 1 exit /b &:# Any other error is curl's own. Leave it to curl's message to explain.
>> "!HTML!" echo !LT!/body!GT!
>> "!HTML!" echo !LT!/html!GT!
%EXEC% "!HTML!"
exit /b
:#----------------------------------------------------------------------------#
:# Style sheet from https://gist.github.com/tuzz/3331384 - End of batch section comment */ }
/*
Copyright (c) 2017 Chris Patuzzo
https://twitter.com/chrispatuzzo
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
body {
font-family: Helvetica, arial, sans-serif;
font-size: 14px;
line-height: 1.6;
padding-top: 10px;
padding-bottom: 10px;
background-color: white;
padding: 30px;
color: #333;
}
body > *:first-child {
margin-top: 0 !important;
}
body > *:last-child {
margin-bottom: 0 !important;
}
a {
color: #4183C4;
text-decoration: none;
}
a.absent {
color: #cc0000;
}
a.anchor {
display: block;
padding-left: 30px;
margin-left: -30px;
cursor: pointer;
position: absolute;
top: 0;
left: 0;
bottom: 0;
}
h1, h2, h3, h4, h5, h6 {
margin: 20px 0 10px;
padding: 0;
font-weight: bold;
-webkit-font-smoothing: antialiased;
cursor: text;
position: relative;
}
h2:first-child, h1:first-child, h1:first-child + h2, h3:first-child, h4:first-child, h5:first-child, h6:first-child {
margin-top: 0;
padding-top: 0;
}
h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, h5:hover a.anchor, h6:hover a.anchor {
text-decoration: none;
}
h1 tt, h1 code {
font-size: inherit;
}
h2 tt, h2 code {
font-size: inherit;
}
h3 tt, h3 code {
font-size: inherit;
}
h4 tt, h4 code {
font-size: inherit;
}
h5 tt, h5 code {
font-size: inherit;
}
h6 tt, h6 code {
font-size: inherit;
}
h1 {
font-size: 28px;
color: black;
}
h2 {
font-size: 24px;
border-bottom: 1px solid #cccccc;
color: black;
}
h3 {
font-size: 18px;
}
h4 {
font-size: 16px;
}
h5 {
font-size: 14px;
}
h6 {
color: #777777;
font-size: 14px;
}
p, blockquote, ul, ol, dl, li, table, pre {
margin: 15px 0;
}
hr {
border: 0 none;
color: #cccccc;
height: 4px;
padding: 0;
}
body > h2:first-child {
margin-top: 0;
padding-top: 0;
}
body > h1:first-child {
margin-top: 0;
padding-top: 0;
}
body > h1:first-child + h2 {
margin-top: 0;
padding-top: 0;
}
body > h3:first-child, body > h4:first-child, body > h5:first-child, body > h6:first-child {
margin-top: 0;
padding-top: 0;
}
a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 {
margin-top: 0;
padding-top: 0;
}
h1 p, h2 p, h3 p, h4 p, h5 p, h6 p {
margin-top: 0;
}
li p.first {
display: inline-block;
}
ul, ol {
padding-left: 30px;
}
ul :first-child, ol :first-child {
margin-top: 0;
}
ul :last-child, ol :last-child {
margin-bottom: 0;
}
dl {
padding: 0;
}
dl dt {
font-size: 14px;
font-weight: bold;
font-style: italic;
padding: 0;
margin: 15px 0 5px;
}
dl dt:first-child {
padding: 0;
}
dl dt > :first-child {
margin-top: 0;
}
dl dt > :last-child {
margin-bottom: 0;
}
dl dd {
margin: 0 0 15px;
padding: 0 15px;
}
dl dd > :first-child {
margin-top: 0;
}
dl dd > :last-child {
margin-bottom: 0;
}
blockquote {
border-left: 4px solid #dddddd;
padding: 0 15px;
color: #777777;
}
blockquote > :first-child {
margin-top: 0;
}
blockquote > :last-child {
margin-bottom: 0;
}
table {
padding: 0;
}
table tr {
border-top: 1px solid #cccccc;
background-color: white;
margin: 0;
padding: 0;
}
table tr:nth-child(2n) {
background-color: #f8f8f8;
}
table tr th {
font-weight: bold;
border: 1px solid #cccccc;
text-align: left;
margin: 0;
padding: 6px 13px;
}
table tr td {
border: 1px solid #cccccc;
text-align: left;
margin: 0;
padding: 6px 13px;
}
table tr th :first-child, table tr td :first-child {
margin-top: 0;
}
table tr th :last-child, table tr td :last-child {
margin-bottom: 0;
}
img {
max-width: 100%;
}
span.frame {
display: block;
overflow: hidden;
}
span.frame > span {
border: 1px solid #dddddd;
display: block;
float: left;
overflow: hidden;
margin: 13px 0 0;
padding: 7px;
width: auto;
}
span.frame span img {
display: block;
float: left;
}
span.frame span span {
clear: both;
color: #333333;
display: block;
padding: 5px 0 0;
}
span.align-center {
display: block;
overflow: hidden;
clear: both;
}
span.align-center > span {
display: block;
overflow: hidden;
margin: 13px auto 0;
text-align: center;
}
span.align-center span img {
margin: 0 auto;
text-align: center;
}
span.align-right {
display: block;
overflow: hidden;
clear: both;
}
span.align-right > span {
display: block;
overflow: hidden;
margin: 13px 0 0;
text-align: right;
}
span.align-right span img {
margin: 0;
text-align: right;
}
span.float-left {
display: block;
margin-right: 13px;
overflow: hidden;
float: left;
}
span.float-left span {
margin: 13px 0 0;
}
span.float-right {
display: block;
margin-left: 13px;
overflow: hidden;
float: right;
}
span.float-right > span {
display: block;
overflow: hidden;
margin: 13px auto 0;
text-align: right;
}
code, tt {
margin: 0 2px;
padding: 0 5px;
white-space: nowrap;
border: 1px solid #eaeaea;
background-color: #f8f8f8;
border-radius: 3px;
}
pre code {
margin: 0;
padding: 0;
white-space: pre;
border: none;
background: transparent;
}
.highlight pre {
background-color: #f8f8f8;
border: 1px solid #cccccc;
font-size: 13px;
line-height: 19px;
overflow: auto;
padding: 6px 10px;
border-radius: 3px;
}
pre {
background-color: #f8f8f8;
border: 1px solid #cccccc;
font-size: 13px;
line-height: 19px;
overflow: auto;
padding: 6px 10px;
border-radius: 3px;
}
pre code, pre tt {
background-color: transparent;
border: none;
}
You can’t perform that action at this time.