commit 560f081852a8b04bcb628d7396d13a22c00ffa26
parent d9c8eef928252deb16d52876a5fd09b66e380a7e
Author: Demonstrandum <moi@knutsen.co>
Date: Wed, 5 Aug 2020 20:43:12 +0100
Add synatx highlighting with Pygment.
Diffstat:
7 files changed, 97 insertions(+), 26 deletions(-)
diff --git a/Gemfile b/Gemfile
@@ -0,0 +1,4 @@
+source 'https://rubygems.org'
+
+gem 'github-linguist'
+gem 'pygments.rb'
diff --git a/Gemfile.lock b/Gemfile.lock
@@ -0,0 +1,25 @@
+GEM
+ remote: https://rubygems.org/
+ specs:
+ charlock_holmes (0.7.7)
+ escape_utils (1.2.1)
+ github-linguist (7.9.0)
+ charlock_holmes (~> 0.7.6)
+ escape_utils (~> 1.2.0)
+ mini_mime (~> 1.0)
+ rugged (>= 0.25.1)
+ mini_mime (1.0.2)
+ multi_json (1.15.0)
+ pygments.rb (1.2.1)
+ multi_json (>= 1.0.0)
+ rugged (1.0.1)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ github-linguist
+ pygments.rb
+
+BUNDLED WITH
+ 2.1.2
diff --git a/Makefile b/Makefile
@@ -63,7 +63,8 @@ dist:
${OBJ}: ${HDR}
-stagit.out: stagit.o ${COMPATOBJ}
+stagit.out: stagit.o ${COMPATOBJ} Gemfile
+ bundle install
${CC} -o $@ stagit.o ${COMPATOBJ} ${STAGIT_LDFLAGS}
stagit-index.out: stagit-index.o ${COMPATOBJ}
diff --git a/highlight b/highlight
@@ -0,0 +1,29 @@
+#!/usr/bin/env ruby
+
+require 'linguist'
+require 'pygments'
+
+stdin = ARGF.file
+
+filename = stdin.readline.strip # Read first line (filename).
+contents = stdin.read # Read rest (code).
+
+detected = Linguist::FileBlob.new(filename).language
+
+# Debugging
+#puts "File #{filename}"
+#puts "Code:
+#{contents}"
+#print "Language: "
+#pp detected
+
+html = Pygments.highlight(contents,
+ :lexer => detected.name,
+ :formatter => 'html',
+ :options => {
+ :encoding => 'utf-8',
+ :linenos => 'table',
+ :lineanchors => 'loc',
+ :anchorlinenos => true})
+
+puts html
diff --git a/repo-gen.sh b/repo-gen.sh
@@ -36,5 +36,5 @@ echo "Generating index.html with \`$STAGIT_INDEX\`."
"$STAGIT_INDEX" /srv/git/*.git > /var/www/git/index.html
# Correct ownership of the web files.
-chowm git:www-data -R /var/www/git -f
+chown git:www-data -R /var/www/git -f
chmod g+rw -R /var/www/git -f
diff --git a/stagit.c b/stagit.c
@@ -394,36 +394,40 @@ writefooter(FILE *fp)
fputs("</div>\n</body>\n</html>\n", fp);
}
+void
+syntax_highlight(const char *fpath, FILE *fp, const char *s, size_t len)
+{
+ // Ruby script for syntax highlighting.
+ FILE *child = popen("./highlight", "w");
+ // Give filename:
+ fprintf(child, "%s\n", fpath);
+ // Give code to highlight:
+ size_t i;
+ for (i = 0; *s && i < len; s++, i++)
+ fputc(*s, child);
+
+ // Write returned HTML to the HTML file.
+ char c;
+ while ((c = fgetc(child)) != EOF)
+ fputc(c, fp);
+
+ pclose(child);
+}
+
int
-writeblobhtml(FILE *fp, const git_blob *blob)
+writeblobhtml(const char *fpath, FILE *fp, const git_blob *blob)
{
size_t n = 0, i, prev;
- const char *nfmt = "<a href=\"#l%d\" class=\"line\" id=\"l%d\">%7d</a><span class=\"loc\">";
const char *s = git_blob_rawcontent(blob);
git_off_t len = git_blob_rawsize(blob);
- fputs("<pre id=\"blob\">\n", fp);
+ fputs("<div id=\"blob\">\n", fp);
if (len > 0) {
- for (i = 0, prev = 0; i < (size_t)len; i++) {
- if (s[i] != '\n')
- continue;
- n++;
- fprintf(fp, nfmt, n, n, n);
- xmlencode(fp, &s[prev], i - prev + 1);
- fprintf(fp, "</span>");
- prev = i + 1;
- }
- /* trailing data */
- if ((len - prev) > 0) {
- n++;
- fprintf(fp, nfmt, n, n, n);
- xmlencode(fp, &s[prev], len - prev);
- fprintf(fp, "</span>");
- }
+ syntax_highlight(fpath, fp, s, len);
}
- fputs("</pre>\n", fp);
+ fputs("</div>\n", fp);
return n;
}
@@ -791,7 +795,7 @@ writeblob(git_object *obj, const char *fpath, const char *filename, git_off_t fi
if (git_blob_is_binary((git_blob *)obj)) {
fputs("<p>Binary file.</p>\n", fp);
} else {
- lc = writeblobhtml(fp, (git_blob *)obj);
+ lc = writeblobhtml(fpath, fp, (git_blob *)obj);
if (ferror(fp))
err(1, "fwrite");
}
diff --git a/style.css b/style.css
@@ -35,14 +35,22 @@ a.line {
text-decoration: none;
}
-.loc {
- margin-left: 0.9em;
+#blob {
+ display: block;
+ max-width: 100%;
+ overflow-x: scroll;
}
-.line {
+.linenos {
user-select: none;
}
+.linenos a {
+ margin-right: 0.9em;
+ user-select: none;
+ text-decoration: none;
+}
+
#blob a {
color: #777;
}