]> git.armaanb.net Git - stagit.git/commitdiff
Add synatx highlighting with Pygment.
authorDemonstrandum <moi@knutsen.co>
Wed, 5 Aug 2020 19:43:12 +0000 (20:43 +0100)
committerDemonstrandum <moi@knutsen.co>
Wed, 5 Aug 2020 19:43:12 +0000 (20:43 +0100)
Gemfile [new file with mode: 0644]
Gemfile.lock [new file with mode: 0644]
Makefile
highlight [new file with mode: 0755]
repo-gen.sh
stagit.c
style.css

diff --git a/Gemfile b/Gemfile
new file mode 100644 (file)
index 0000000..9452483
--- /dev/null
+++ b/Gemfile
@@ -0,0 +1,4 @@
+source 'https://rubygems.org'
+
+gem 'github-linguist'
+gem 'pygments.rb'
diff --git a/Gemfile.lock b/Gemfile.lock
new file mode 100644 (file)
index 0000000..86591cb
--- /dev/null
@@ -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
index 56b52e6618934eba853a768ec59211435897ef00..1b2750e4b1351957a3971d04862f2817e99a1a6d 100644 (file)
--- 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
new file mode 100755 (executable)
index 0000000..c67e703
--- /dev/null
+++ 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
index afae9305c8ed38a512b67d19e17e0262b1601d27..b58559fb7d1ba32a8ce80c70b5ac75dd02e02483 100755 (executable)
@@ -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
index e823fbaf7e99138549719da5129b31e7c8b963aa..20f6b659e018528dc580deb8f4fb04ae027ae47f 100644 (file)
--- 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");
        }
index 02a9d974bdc0f0648f7929f1dd4578378f12b7f5..c35d6e967a4909d04f917ea425ef8ecc539c8bc7 100644 (file)
--- 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;
 }