90 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
{
 | 
						|
  lib,
 | 
						|
  stdenv,
 | 
						|
  fetchzip,
 | 
						|
  jre,
 | 
						|
  makeWrapper,
 | 
						|
  plantuml-c4,
 | 
						|
  plantuml,
 | 
						|
  runCommand,
 | 
						|
}:
 | 
						|
 | 
						|
# The C4-PlantUML docs say that it suffices to run plantuml with the
 | 
						|
# -DRELATIVE_INCLUDE="..." arg to make plantuml find the C4 templates
 | 
						|
# when included like "!include C4_Container.puml".
 | 
						|
# Unfortunately, this is not sufficient in practise, when the path is not ".".
 | 
						|
# What helps is setting -Dplantuml.include.path="..." *before* the jar
 | 
						|
# parameter.
 | 
						|
# The -DRELATIVE_INCLUDE param then *still* needs to be set (*after* the jar
 | 
						|
# argument), because the C4 template vars check for existence of this variable
 | 
						|
# and if it is not set, reference paths in the internet.
 | 
						|
 | 
						|
let
 | 
						|
  c4-lib = fetchzip {
 | 
						|
    url = "https://github.com/plantuml-stdlib/C4-PlantUML/archive/refs/tags/v2.10.0.zip";
 | 
						|
    hash = "sha256-p9Njb7VauXVf6yOBDQrO9mS+za9NntFUCK5tig0mH3U=";
 | 
						|
  };
 | 
						|
 | 
						|
  sprites = fetchzip {
 | 
						|
    url = "https://github.com/tupadr3/plantuml-icon-font-sprites/archive/refs/tags/v3.0.0.zip";
 | 
						|
    hash = "sha256-I/cR1VPR7aKyTZF9X/4GkgcxV9+sLgNpTZugvCy0Dvs=";
 | 
						|
  };
 | 
						|
 | 
						|
  # In order to pre-fix the plantuml.jar parameter with the argument
 | 
						|
  # -Dplantuml.include.path=..., we post-fix the java command using a wrapper.
 | 
						|
  # This way the plantuml derivation can remain unchanged.
 | 
						|
  plantumlWithExtraPath =
 | 
						|
    let
 | 
						|
      plantumlIncludePath = lib.concatStringsSep ":" [
 | 
						|
        c4-lib
 | 
						|
        sprites
 | 
						|
      ];
 | 
						|
      includeFlag = "-Dplantuml.include.path=${lib.escapeShellArg plantumlIncludePath}";
 | 
						|
      postFixedJre = runCommand "jre-postfixed" { nativeBuildInputs = [ makeWrapper ]; } ''
 | 
						|
        mkdir -p $out/bin
 | 
						|
 | 
						|
        makeWrapper ${jre}/bin/java $out/bin/java \
 | 
						|
          --add-flags ${lib.escapeShellArg includeFlag}
 | 
						|
      '';
 | 
						|
    in
 | 
						|
    plantuml.override { jre = postFixedJre; };
 | 
						|
in
 | 
						|
 | 
						|
stdenv.mkDerivation {
 | 
						|
  pname = "plantuml-c4";
 | 
						|
  version = "2.10.0";
 | 
						|
 | 
						|
  nativeBuildInputs = [ makeWrapper ];
 | 
						|
 | 
						|
  buildCommand = ''
 | 
						|
    mkdir -p $out/bin
 | 
						|
 | 
						|
    makeWrapper ${plantumlWithExtraPath}/bin/plantuml $out/bin/plantuml \
 | 
						|
      --add-flags "-DRELATIVE_INCLUDE=\"${c4-lib}\""
 | 
						|
 | 
						|
    $out/bin/plantuml -help
 | 
						|
  '';
 | 
						|
 | 
						|
  passthru.tests.example-c4-diagram =
 | 
						|
    runCommand "c4-plantuml-sample.png" { nativeBuildInputs = [ plantuml-c4 ]; }
 | 
						|
      ''
 | 
						|
        sed 's/https:.*\///' "${c4-lib}/samples/C4_Context Diagram Sample - enterprise.puml" > sample.puml
 | 
						|
        plantuml sample.puml -o $out
 | 
						|
 | 
						|
        sed 's/!include ..\//!include /' ${sprites}/examples/complex-example.puml > sprites.puml
 | 
						|
        plantuml sprites.puml -o $out
 | 
						|
      '';
 | 
						|
 | 
						|
  meta = with lib; {
 | 
						|
    description = "PlantUML bundled with C4-Plantuml and plantuml sprites library";
 | 
						|
    mainProgram = "plantuml";
 | 
						|
    homepage = "https://github.com/plantuml-stdlib/C4-PlantUML";
 | 
						|
    license = licenses.mit;
 | 
						|
    maintainers = with maintainers; [
 | 
						|
      tfc
 | 
						|
      anthonyroussel
 | 
						|
    ];
 | 
						|
    platforms = platforms.unix;
 | 
						|
  };
 | 
						|
}
 |