1{
2 stdenv,
3 fetchFromGitHub,
4 lib,
5 fetchYarnDeps,
6 yarn,
7 fixup-yarn-lock,
8 nodejs,
9 electron,
10 python3,
11 xorg,
12 fontconfig,
13 nodePackages,
14 ripgrep,
15 pkg-config,
16 libsecret,
17 yarnBuildHook,
18 makeShellWrapper,
19 unstableGitUpdater,
20 xcbuild,
21 libtool,
22}:
23
24stdenv.mkDerivation (finalAttrs: {
25 pname = "marktext";
26 version = "0.17.1-unstable-2024-06-10";
27
28 src = fetchFromGitHub {
29 owner = "marktext";
30 repo = "marktext";
31 rev = "11c8cc1e1929a7975df39fa5f4503130fef53547";
32 hash = "sha256-5PIOTg4/RBave/b3CArQSLvmA64ME9++3O1JT4lgKm0=";
33 postFetch = ''
34 cd $out
35 patch -p1 < ${./0001-update-electron.patch}
36 ''; # Need for offlineCache
37 };
38
39 offlineCache = fetchYarnDeps {
40 yarnLock = "${finalAttrs.src}/yarn.lock";
41 hash = "sha256-mr79FV/LHkoY3vX9B5yv95IQIJQ9akwfslKndKYmwCo=";
42 };
43
44 nativeBuildInputs = [
45 yarn
46 fixup-yarn-lock
47 makeShellWrapper
48 yarnBuildHook
49 (python3.withPackages (ps: with ps; [ packaging ]))
50 pkg-config
51 nodejs
52 nodePackages.node-gyp-build
53 ]
54 ++ lib.optionals stdenv.hostPlatform.isDarwin [
55 xcbuild
56 libtool
57 ];
58
59 buildInputs = [
60 libsecret
61 xorg.libX11
62 xorg.libxkbfile
63 fontconfig
64 xorg.xorgproto
65 ];
66
67 postPatch = ''
68 substituteInPlace src/common/filesystem/paths.js \
69 --replace-fail "process.resourcesPath" "'$out/opt/marktext/resources'"
70
71 substituteInPlace src/main/cli/index.js \
72 --replace-fail "process.argv.slice(1)" "process.argv.slice(2)"
73 '';
74
75 configurePhase = ''
76 runHook preConfigure
77
78 export HOME=$(mktemp -d)
79 yarn config --offline set yarn-offline-mirror ${finalAttrs.offlineCache}
80 fixup-yarn-lock yarn.lock
81
82 # set nodedir to prevent node-gyp from downloading headers
83 # taken from https://nixos.org/manual/nixpkgs/stable/#javascript-tool-specific
84 mkdir -p $HOME/.node-gyp/${nodejs.version}
85 echo 9 > $HOME/.node-gyp/${nodejs.version}/installVersion
86 ln -sfv ${nodejs}/include $HOME/.node-gyp/${nodejs.version}
87 export npm_config_nodedir=${nodejs}
88
89 yarn --offline --frozen-lockfile install --ignore-scripts --no-progress --non-interactive
90
91 patchShebangs node_modules
92
93 substituteInPlace node_modules/node-gyp/gyp/pylib/gyp/input.py \
94 --replace-fail "from distutils.version import StrictVersion" "from packaging.version import Version as StrictVersion"
95
96 ./node_modules/.bin/electron-rebuild -f
97
98 substituteInPlace package.json \
99 --replace-fail "electron-rebuild -f" "echo 0" \
100 --replace-fail "&& yarn run lint:fix" ""
101
102 mkdir -p node_modules/vscode-ripgrep/bin
103
104 yarn --offline --frozen-lockfile install --no-progress
105 patchShebangs node_modules
106
107 substituteInPlace node_modules/node-gyp/gyp/pylib/gyp/input.py \
108 --replace-fail "from distutils.version import StrictVersion" "from packaging.version import Version as StrictVersion"
109
110 sed -i -e 's|path.join(.*);|"${lib.getExe ripgrep}";|' \
111 node_modules/vscode-ripgrep/lib/index.js
112
113 runHook postConfigure
114 '';
115
116 yarnBuildScript = "electron-builder";
117
118 yarnBuildFlags = [
119 "--dir"
120 "-c.electronDist=${electron.dist}"
121 "-c.electronVersion=${electron.version}"
122 ];
123
124 env = {
125 ELECTRON_SKIP_BINARY_DOWNLOAD = "1";
126 PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD = "1";
127 };
128
129 preBuild = ''
130 node .electron-vue/build.js
131 ''; # From package.json
132
133 installPhase = ''
134 runHook preInstall
135
136 mkdir -p $out/opt/marktext $out/bin
137
138 install -Dm644 resources/linux/marktext.desktop $out/share/applications/marktext.desktop
139
140 pushd resources/icons/
141
142 find -maxdepth 1 -mindepth 1 -type d -exec install -DT {}/marktext.png $out/share/icons/hicolor/{}/apps/marktext.png \;
143
144 find -maxdepth 1 -mindepth 1 -type d -exec install -DT {}/md.png $out/share/icons/hicolor/{}/apps/md.png \;
145
146 popd
147
148 cp -r build/*-unpacked/{locales,resources{,.pak}} $out/opt/marktext
149
150 makeWrapper ${lib.getExe electron} $out/bin/marktext \
151 --add-flags $out/opt/marktext/resources/app.asar \
152 --add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations}}"
153
154 runHook postInstall
155 '';
156
157 passthru.updateScript = unstableGitUpdater {
158 tagPrefix = "v";
159 branch = "develop";
160 };
161
162 meta = {
163 description = "Simple and elegant markdown editor, available for Linux, macOS and Windows";
164 homepage = "https://www.marktext.cc";
165 license = lib.licenses.mit;
166 maintainers = with lib.maintainers; [
167 nh2
168 eduarrrd
169 bot-wxt1221
170 ];
171 badPlatforms = [
172 "x86_64-darwin"
173 "aarch64-darwin"
174 ];
175 platforms = lib.platforms.unix;
176 mainProgram = "marktext";
177 };
178})