about summary refs log tree commit diff
path: root/pkgs/sternenseemann
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/sternenseemann')
-rw-r--r--pkgs/sternenseemann/default.nix4
-rw-r--r--pkgs/sternenseemann/schmecgit/default.nix37
-rw-r--r--pkgs/sternenseemann/schmecgit/main.c105
3 files changed, 146 insertions, 0 deletions
diff --git a/pkgs/sternenseemann/default.nix b/pkgs/sternenseemann/default.nix
index da3dcb7e..b133df65 100644
--- a/pkgs/sternenseemann/default.nix
+++ b/pkgs/sternenseemann/default.nix
@@ -57,6 +57,10 @@ lib.fix (self: {
     temp
     ;
 
+  schmecgit = callPackage ./schmecgit {
+    inherit (pkgs.llvmPackages_latest) stdenv;
+  };
+
   scripts = dontRecurseIntoAttrs (callPackage ./scripts {
     inherit (writers) writeBashBin;
     inherit (self) shakti;
diff --git a/pkgs/sternenseemann/schmecgit/default.nix b/pkgs/sternenseemann/schmecgit/default.nix
new file mode 100644
index 00000000..982b2c1d
--- /dev/null
+++ b/pkgs/sternenseemann/schmecgit/default.nix
@@ -0,0 +1,37 @@
+{ runCommandWith
+, stdenv
+, lib
+, lowdown
+, chroma
+, substituteAll
+}:
+
+let
+  src = substituteAll {
+    src = ./main.c;
+    chroma = "${lib.getBin chroma}/bin/chroma";
+    lowdown = "${lib.getBin lowdown}/bin/lowdown";
+  };
+in
+
+runCommandWith {
+  name = "schmecgit";
+  inherit stdenv;
+  derivationArgs.meta = {
+    description = "schmeck it, about and source filter for cgit";
+    license = lib.licenses.gpl2Plus;
+    platforms = lib.platforms.unix;
+  };
+} ''
+  mkdir -p "$out/bin"
+
+  # compile main executable
+  clang -o "$out/bin/schmecgit" -pedantic -Wall -Wextra -Werror -std=c99 ${src}
+
+  # wrapper script for cgit about filter
+  cat > "$out/bin/schmecgit-about" <<EOF
+  #!${stdenv.shell}
+  exec "$out/bin/schmecgit" --about \$@
+  EOF
+  chmod +x "$out/bin/schmecgit-about"
+''
diff --git a/pkgs/sternenseemann/schmecgit/main.c b/pkgs/sternenseemann/schmecgit/main.c
new file mode 100644
index 00000000..1b3b4ada
--- /dev/null
+++ b/pkgs/sternenseemann/schmecgit/main.c
@@ -0,0 +1,105 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include <stdbool.h>
+#include <stdio.h>
+#include <string.h>
+#include <strings.h>
+#include <unistd.h>
+
+enum file_type {
+  PLAIN,
+  MARKDOWN,
+  HTML,
+  CODE
+};
+
+void output_xml_escaped_char(char c, FILE *out) {
+  switch(c) {
+    case '&':
+      fputs("&amp;", out);
+      break;
+    case '<':
+      fputs("&lt;", out);
+      break;
+    case '>':
+      fputs("&gt;", out);
+      break;
+    case '\'':
+      fputs("&apos;", out);
+      break;
+    case '\"':
+      fputs("&quot;", out);
+      break;
+    default:
+      fputc(c, out);
+      break;
+  }
+}
+
+int main(int argc, char *argv[]) {
+  bool about_filter;
+  char *file;
+
+  if(argc == 2) {
+    about_filter = 0;
+    file = argv[1];
+  } else if(argc == 3 && strcmp(argv[1], "--about") == 0) {
+    about_filter = 1;
+    file = argv[2];
+  } else {
+    fprintf(stderr, "Usage: %s [--about] BASENAME\n", argv[0]);
+    return 1;
+  }
+
+  char *extension = rindex(file, '.');
+  enum file_type ft = PLAIN;
+
+  if(extension != NULL) {
+    extension++;
+
+    if(about_filter && (strcmp(extension, "md") == 0 || strcmp(extension, "markdown") == 0)) {
+      ft = MARKDOWN;
+    } else if(about_filter && (strcmp(extension, "html") == 0 || strcmp(extension, "htm") == 0)) {
+      ft = HTML;
+    } else if(strcmp(extension, "txt") == 0) {
+      ft = PLAIN;
+    } else {
+      ft = CODE;
+    }
+  } else {
+    if(strcmp(file, "Makefile") == 0 || strcmp(file, "Doxyfile")) {
+      ft = CODE;
+    }
+  }
+
+  if(ft == PLAIN || ft == HTML) {
+    char c;
+    if(ft == PLAIN) {
+      fputs("<pre>", stdout);
+    }
+
+    while((c = fgetc(stdin)) != EOF) {
+      if(ft == HTML) {
+        fputc(c, stdout);
+      } else {
+        output_xml_escaped_char(c, stdout);
+      }
+    }
+
+    if(ft == PLAIN) {
+      fputs("</pre>", stdout);
+    }
+  } else if(ft == MARKDOWN) {
+    return execl("@lowdown@", "lowdown", NULL);
+  } else if(ft == CODE) {
+    return execl(
+      "@chroma@", "chroma", "--filename", file,
+      "--html", "--html-tab-width=2", "--html-only", "--html-inline-styles",
+      "--style=lovelace",
+      NULL
+    );
+  } else {
+    return 1;
+  }
+
+  return 0;
+}