snowfield/packages/zotero/default.nix

385 lines
11 KiB
Nix

{ lib
, stdenv
, buildNpmPackage
, fetchFromGitHub
, fetchzip
, fetchurl
, firefox-esr-102-unwrapped
, makeWrapper
, makeDesktopItem
, python3
, unzip
, zip
, perl
, rsync
, wrapGAppsHook
, gsettings-desktop-schemas
, glib
, gtk3
, gnome
, dconf
}:
let
pname = "zotero-dev";
version = "7.0.0";
rev = "096a3c5f2f57fffdecf001981129e13a1791ad89";
meta = with lib; {
description = "Zotero is a free, easy-to-use tool to help you collect, organize, cite, and share your research sources";
homepage = "https://github.com/zotero/zotero";
license = licenses.agpl3Only;
maintainers = with maintainers; [ camillemndn ];
platforms = platforms.all;
};
pdftools = let pdftools-version = "0.0.5"; in
fetchzip {
url = "https://zotero-download.s3.amazonaws.com/pdftools/pdftools-${pdftools-version}.tar.gz";
hash = "sha256-cvd0cJcuhSd2BTgRc5mz0bP9DakEKG/LK2onKOhes04=";
stripRoot = false;
};
zotero-client =
let
src = fetchFromGitHub {
owner = "zotero";
repo = "zotero";
inherit rev;
hash = "sha256-XGpk2CYgdaFCJJJc2XhW2fVD+dbACUkGClgwLoNMOoM=";
fetchSubmodules = true;
};
npmFlags = [ "--legacy-peer-deps" ];
NODE_OPTIONS = "--openssl-legacy-provider";
single-file = buildNpmPackage {
pname = "${pname}-single-file";
src = fetchFromGitHub {
owner = "gildas-lormeau";
repo = "SingleFile";
rev = "999976a20afb51a18da4abb42f434eac99796e84";
hash = "sha256-fHKVn9DTwshfBXf0nxCk0MLY1fEiQXD/SZPG1bICHo8=";
};
inherit version npmFlags NODE_OPTIONS meta;
npmDepsHash = "sha256-L4LuD7n8c42TPpbLWuJzeM27xcsXVdBnMTqNvRZMdz8=";
dontNpmBuild = true;
};
xpcom-utilities = buildNpmPackage {
pname = "${pname}-xpcom-utilities";
src = fetchFromGitHub {
owner = "zotero";
repo = "utilities";
rev = "b93f16dba483891c0ab4627cbaa303de5c7fa0c0";
hash = "sha256-Oz3h6aGorAm+Y5JZSclfz40YRj+uSPW2a5jgQWszLsk=";
};
inherit version npmFlags NODE_OPTIONS meta;
npmDepsHash = "sha256-tWDADhAeXG0HSvFnpdGOya3CjSb0i2aR3E1Y3r1J81o=";
dontNpmBuild = true;
};
note-editor = buildNpmPackage {
pname = "${pname}-note-editor";
src = fetchFromGitHub {
owner = "zotero";
repo = "note-editor";
rev = "076f5b3d3609051b9cba3cd68c4bb22746187834";
hash = "sha256-ZDmb3DQttftfS4w5+HlkTXRxhRYftBh1bm6MI+RBvII=";
};
inherit version npmFlags NODE_OPTIONS meta;
npmDepsHash = "sha256-yu2s4V2hB07eS0INVxQXU7YeWYmR3p4JPxKWuCK3Iys=";
postInstall = ''
cp -r build $out/lib/node_modules/zotero-note-editor/build
'';
};
translators = buildNpmPackage {
pname = "${pname}-translators";
src = fetchFromGitHub {
owner = "zotero";
repo = "translators";
rev = "3a9544d7b0b6fdcb6cdcbc8c08392f91d20d99b4";
hash = "sha256-XX1iBjuaFpmtkKTHuFPTtZOcFZk+oF8C8d2DPnENjV4=";
};
inherit version npmFlags NODE_OPTIONS meta;
npmDepsHash = "sha256-WDMOsklYKIurQw80Yh/mYQ9xmcHo3Yfkjj5+btqeie0=";
postPatch = ''
rm package-lock.json
cp ${./translator-lock.json} package-lock.json
sed -i '/eslint-plugin-zotero-translator/d' package.json
echo "chromedriver_skip_download=true" >> .npmrc
'';
dontNpmBuild = true;
};
pdf-reader-pdfjs = buildNpmPackage {
pname = "${pname}-pdf-reader-pdfjs";
src = fetchFromGitHub {
owner = "zotero";
repo = "pdf.js";
rev = "336247a15be77f2e253599f810a8cda107171566";
hash = "sha256-GBEBTyFMh+zi0KiHLNGfZi/XW9mhm3x0uCJkA7ml7mk=";
};
inherit version npmFlags NODE_OPTIONS meta;
npmDepsHash = "sha256-9e90iIKwWyBq68q/CKn+7laJwPFtJaZtblcWpIEDSXw=";
makeCacheWritable = true;
postPatch = ''
sed -i '/"name": "pdf.js"/a "version": "1.0.0",' package.json
sed -i '/"name": "pdf.js"/a "version": "1.0.0",' package-lock.json
'';
#dontNpmBuild = true;
buildPhase = ''
node_modules/.bin/gulp generic
'';
postInstall = ''
cp -r build $out/lib/node_modules/pdf.js/build
'';
};
pdf-worker-pdfjs = buildNpmPackage {
pname = "${pname}-pdf-worker-pdfjs";
src = fetchFromGitHub {
owner = "zotero";
repo = "pdf.js";
rev = "e198a17afc6f56e0a9d48b07e42ec80645a7a0a8";
hash = "sha256-FlKII11oPMPka+96Wo9ZjBuNp40i3OMuvlNz8X/r0Lw=";
};
inherit version npmFlags NODE_OPTIONS meta;
npmDepsHash = "sha256-9e90iIKwWyBq68q/CKn+7laJwPFtJaZtblcWpIEDSXw=";
makeCacheWritable = true;
postPatch = ''
sed -i '/"name": "pdf.js"/a "version": "1.0.0",' package.json
sed -i '/"name": "pdf.js"/a "version": "1.0.0",' package-lock.json
'';
#dontNpmBuild = true;
buildPhase = ''
node_modules/.bin/gulp lib
'';
postInstall = ''
cp -r build $out/lib/node_modules/pdf.js/build
'';
};
pdf-reader = buildNpmPackage {
pname = "${pname}-pdf-reader";
src = fetchFromGitHub {
owner = "zotero";
repo = "pdf-reader";
rev = "3b7f54727fdd8f238281a555988ada4615679b9c";
hash = "sha256-Y49bT08Z9ESK3yVkRQT67oU9jygr5xblHgUiX/SwyLE=";
};
inherit version npmFlags NODE_OPTIONS meta;
npmDepsHash = "sha256-tDr2WLnpltWPrlF21M8G/We4zzAXBp4px5xceOVLbhQ=";
postPatch = ''
sed -i 's/npx gulp/#npx gulp/g' scripts/build-pdfjs
sed -i 's/npm ci/#npm ci/g' scripts/build-pdfjs
'';
buildPhase = ''
rm -rf pdf.js
cp -Lr ${pdf-reader-pdfjs}/lib/node_modules/pdf.js pdf.js
'';
preInstall = ''
mkdir -p $out/lib/node_modules/pdf-reader
cp -r node_modules $out/lib/node_modules/pdf-reader/node_modules
'';
};
pdf-worker = buildNpmPackage {
pname = "${pname}-pdf-worker";
src = fetchFromGitHub {
owner = "zotero";
repo = "pdf-worker";
rev = "582f5d6cf91c5f09fc7898c3eced0ad32cbfccb1";
hash = "sha256-y1nEYGbtZzsc1Hn9B/Cvom3f7+OsYgwOuWFfp5U4gjc=";
};
inherit version npmFlags NODE_OPTIONS meta;
npmDepsHash = "sha256-rO/P7/22erxNeOpR8ph7taKyCeOEG9+U06oOfmPSa3w=";
postPatch = ''
sed -i 's/npx gulp/#npx gulp/g' scripts/build-pdfjs
sed -i 's/npm ci/#npm ci/g' scripts/build-pdfjs
'';
buildPhase = ''
rm -rf pdf.js
cp -Lr ${pdf-worker-pdfjs}/lib/node_modules/pdf.js pdf.js
'';
preInstall = ''
mkdir -p $out/lib/node_modules/pdf-worker
cp -r node_modules $out/lib/node_modules/pdf-worker/node_modules
'';
};
in
buildNpmPackage {
pname = "${pname}-client";
inherit src version npmFlags NODE_OPTIONS meta;
npmDepsHash = "sha256-b9MCHtt4Ewpt/prEMKtzSbLv3xnP2lnhclu4xDh1QGQ=";
nativeBuildInputs = [ rsync ];
postPatch = ''
rm -rf resource/SingleFile
cp -Lr ${single-file}/lib/node_modules/single-file resource/SingleFile
rm -rf chrome/content/zotero/xpcom/utilities
cp -Lr ${xpcom-utilities}/lib/node_modules/@zotero/utilities chrome/content/zotero/xpcom/utilities
rm -rf pdf-reader
cp -r ${pdf-reader}/lib/node_modules/pdf-reader pdf-reader
rm -rf pdf-worker
cp -r ${pdf-worker}/lib/node_modules/pdf-worker pdf-worker
chmod +w . -R
(
cd pdf-reader
rm -rf pdf.js
cp -Lr ${pdf-reader-pdfjs}/lib/node_modules/pdf.js pdf.js
)
(
cd pdf-worker
rm -rf pdf.js
cp -Lr ${pdf-worker-pdfjs}/lib/node_modules/pdf.js pdf.js
)
rm -rf translators
cp -Lr ${translators}/lib/node_modules/translators-check translators
rm -rf note-editor
cp -Lr ${note-editor}/lib/node_modules/zotero-note-editor note-editor
chmod +w . -R
find scripts -type f | xargs sed -i 's/npm ci/#npm ci/g'
find scripts -type f | xargs sed -i 's/git/#git/g'
sed -i 's/npm run build/#npm run build/g' scripts/note-editor.js
'';
installPhase = ''
mkdir $out
cp -r . $out
'';
};
zotero-build = stdenv.mkDerivation {
pname = "${pname}-build";
inherit version meta;
src = fetchFromGitHub {
owner = "zotero";
repo = "zotero-build";
rev = "00e854c6588f329b714250e450f4f7f663aa0222";
hash = "sha256-Gvt37jObgSQ10GBYjnCLu5XbUAy3oVTkWPvHbhLF+fw=";
fetchSubmodules = true;
};
postPatch = ''
sed -i -E "/-aL/a '--chmod=Du=rwx'," xpi/build_xpi
#sed -i 's/-aL/-L/' xpi/build_xpi
'';
buildInputs = [ python3 rsync perl ];
buildPhase = ''
python3 xpi/build_xpi -s ${zotero-client}/build -c source -m ${rev}
'';
installPhase = ''
mkdir $out
cp -r . $out
'';
};
in
stdenv.mkDerivation {
inherit pname version meta;
src = fetchFromGitHub {
owner = "zotero";
repo = "zotero-standalone-build";
rev = "e9ef6bf21d39cc66f1edefdd5b7429bbaf0c5247";
hash = "sha256-NcnbqCN6Pti2KuVX79QLrTk2V/3sMxMrbgRzSTluOtM=";
fetchSubmodules = true;
};
patches = [ ./fetchxul.patch ];
postPatch = ''
patchShebangs .
sed -i 's|LINUX_i686_RUNTIME_PATH=.*|LINUX_i686_RUNTIME_PATH="$DIR/xulrunner/firefox"|' config.sh
sed -i 's|LINUX_x86_64_RUNTIME_PATH=.*|LINUX_x86_64_RUNTIME_PATH="$DIR/xulrunner/firefox"|' config.sh
sed -i 's|ZOTERO_SOURCE_DIR=.*|ZOTERO_SOURCE_DIR="${zotero-client}"|' config.sh
sed -i 's|ZOTERO_BUILD_DIR=.*|ZOTERO_BUILD_DIR="${zotero-build}"|' config.sh
sed -i -E 's|(.*hash=).*|\1${rev}|' scripts/dir_build
sed -i '/build_xpi/d' scripts/dir_build
sed -i -E 's|(rsync -a.*)|\1; chmod -R +w $BUILD_DIR|' build.sh
#sed -i 's|MaxVersion=.*|MaxVersion=111.0|' assets/application.ini
'';
nativeBuildInputs = [ makeWrapper python3 unzip zip perl rsync wrapGAppsHook ];
buildInputs = [ gsettings-desktop-schemas glib gtk3 gnome.adwaita-icon-theme dconf ];
configurePhase = ''
mkdir xulrunner
cp -Lr ${firefox-esr-102-unwrapped}/lib/firefox xulrunner
chmod -R +w xulrunner
cp -Lr ${pdftools} pdftools
chmod -R +w pdftools
./fetch_xulrunner.sh -p l
'';
buildPhase = ''
chmod -R +w /build
scripts/dir_build -p l
'';
installPhase =
let
desktopItem = makeDesktopItem {
name = "${pname}-${version}";
exec = "${pname} -url %U";
icon = "zotero";
comment = meta.description;
desktopName = "Zotero";
genericName = "Reference Management";
categories = [ "Office" "Database" ];
startupNotify = true;
mimeTypes = [ "x-scheme-handler/zotero" "text/plain" ];
};
in
''
mkdir -p $out/bin
cp -Lr staging/Zotero_linux $out/lib
mkdir -p $out/share/applications
cp ${desktopItem}/share/applications/* $out/share/applications/
for size in 16 32 48 256; do
install -Dm444 staging/Zotero_linux/chrome/icons/default/default$size.png \
$out/share/icons/hicolor/''${size}x''${size}/apps/zotero.png
done
makeWrapper "$out/lib/zotero" "$out/bin/${pname}" \
--set-default MOZ_ENABLE_WAYLAND 1
'';
}