Fossil SCM
shjs
SHJS Syntax Highlighter JavaScript
This shjs supports more languages than the others I have seen. We are not going to add anything to the repository because we use /doc/ckout. This means you can try it out without committing to the repository.Installing
- cd in a open repository e.g. fossil
- mkdir ext
- Download shjs
- Download jQuery
- fossil ui
- point your browser at localhost:8080
- Choose Admin-->Header and add above </head> the following lines:
<th1>
set base "/doc/ckout/ext"
set shbase "$base/shjs-0.6"
</th1>
<script>
var web_page = "$<current_page>";
var shbase = "$<shbase>";
</script>
<script type="text/javascript" src="$base/jquery-1.6.min.js"></script>
<th1>
if { "artifact" eq $current_page || "fdiff" eq $current_page } {
html "<link href='$shbase/css/sh_vim-dark.css' rel='stylesheet' type='text/css' />\n"
html "<script type='text/javascript' src='$shbase/sh_main.js'></script>\n"
html "<script type='text/javascript' src='$base/syn.js'></script>\n"
} else {
html "<script>function synlite(){}</script>\n"
}
</th1>
<script>
$(document).ready(function(){
synlite();
});
</script>
- copy the lines below to ext/syn.js
function synlite(){
var t = '';
if("fdiff" == web_page){
t ="diff";
} else {
var file = $("blockquote p a:first-child").text();
var dotAt = file.lastIndexOf(".");
var ext;
if(dotAt){
ext = file.substr(dotAt+1);
if(ext.length){
switch(ext){
case "tex":
t = "latex";
break;
case "y":
t = "bison";
break;
case "dia":
t = "xml";
break;
case "wiki":
t = "html";
break;
case "l":
t = "flex";
break;
case "test":
t = "tcl";
break;
case "h":
t = "c";
break;
default:
t = ext;
break;
}
}
}
}
if(t.length){
$("blockquote pre").addClass("sh_"+t);
sh_highlightDocument(shbase+'/lang/','.js');
}
}
- Done syntax highligthing should work now.
explanation added header lines
- <th1>
- set base "/doc/ckout/ext"
- set shbase "$base/shjs-0.6"
- </th1>
Handy short cuts. If you want to make it permanent add ext to your repo and change ckout to tip!
- <script>
- var web_page = "$<current_page>";
- var shbase = "$<shbase>";
- </script>
Communicate these vars to the client. We need them in syn.js!
- <script type="text/javascript" src="$base/jquery-1.6.min.js"></script>
we always load jquery. Because we use the ready function.
- <th1>
- if { "artifact" eq $current_page || "fdiff" eq $current_page } {
Only do syntax higlight on fdiff and artifact! Unfortunate the unified diff isn't highlighted correct!
- html "<link href='$shbase/css/sh_vim-dark.css' rel='stylesheet' type='text/css' />\n"
Not pretty but it stands out, so no doubt that highlighting is working. Change to your liking.
- html "<script type='text/javascript' src='$shbase/sh_main.js'></script>\n"
- html "<script type='text/javascript' src='$base/syn.js'></script>\n"
The glue between the page and shjs. See below for explanation
- } else {
- html "<script>function synlite(){}</script>\n"
- }
synlite() is always defined! So the ready function will always execute
- </th1>
- <script>
- $(document).ready(function(){
- synlite();
- });
- </script>
The ready function will execute when the whole page is loaded.
Explanation synlite function
- function synlite(){
- var t = '';
If the fdiff page is choosen when we want to load sh_diff.js and the pre needs to have the class "sh_diff"
- if("fdiff" == web_page){
- t ="diff";
- } else {
We need to look-up the file. Extract the extension and map the extension to a type t. e.g. the extension yacc should map to type bison. If no ma then it is hoped that the extension maps to a syntaxt file. e.g. The extension sh maps to sh_sh.js and class sh_sh
- var file = $("blockquote p a:first-child").text();
- var dotAt = file.lastIndexOf(".");
- var ext;
- if(dotAt){
- ext = file.substr(dotAt+1);
- if(ext.length){
- switch(ext){
- case "tex":
- t = "latex";
- break;
- case "y":
- t = "bison";
- break;
- case "dia":
- t = "xml";
- break;
- case "wiki":
- t = "html";
- break;
- case "l":
- t = "flex";
- break;
- case "test":
test in fossil are tcl files. In an other repsitory this could be something entirely dfferent!
- t = "tcl";
- break;
- case "h":
- t = "c";
- break;
- default:
- t = ext;
- break;
- }
- }
- }
- }
- if(t.length){
Only if we have a type we are going to try highlighting
- $("blockquote pre").addClass("sh_"+t);
- sh_highlightDocument(shbase+'/lang/','.js');
- }
- }
Hi, I had to modify the following line in syn.js to make it work:
// var file = $("blockquote p a:first-child").text();
var file = $("div ul li a:first-child").html();
BR,
Johan