projects/guix·blob javascript-team · refs

1220 lines · 46.2 KiB

1;;; GNU Guix --- Functional package management for GNU
2;;; Copyright © 2015-2023 Ricardo Wurmus <[email protected]>
3;;; Copyright © 2015 Andreas Enge <[email protected]>
4;;; Copyright © 2016 Chris Marusich <[email protected]>
5;;; Copyright © 2017, 2018, 2024 Efraim Flashner <[email protected]>
6;;; Copyright © 2018, 2019 Tobias Geerinckx-Rice <[email protected]>
7;;; Copyright © 2018, 2019, 2020, 2021 Peng Mei Yu <[email protected]>
8;;; Copyright © 2020 kanichos <[email protected]>
9;;; Copyright © 2020 Vincent Legoll <[email protected]>
10;;; Copyright © 2021 Felix Gruber <[email protected]>
11;;; Copyright © 2021 Songlin Jiang <[email protected]>
12;;; Copyright © 2021 Taiju HIGASHI <[email protected]>
13;;; Copyright © 2022, 2023 Maxim Cournoyer <[email protected]>
14;;; Copyright © 2023 Luis Felipe López Acevedo <[email protected]>
15;;; Copyright © 2024 Zheng Junjie <[email protected]>
16;;; Copyright © 2024 Charles <[email protected]>
17;;; Copyright © 2025 Kurome <[email protected]>
18;;; Copyright © 2025 Daniel Khodabakhsh <[email protected]>
19;;;
20;;; This file is part of GNU Guix.
21;;;
22;;; GNU Guix is free software; you can redistribute it and/or modify it
23;;; under the terms of the GNU General Public License as published by
24;;; the Free Software Foundation; either version 3 of the License, or (at
25;;; your option) any later version.
26;;;
27;;; GNU Guix is distributed in the hope that it will be useful, but
28;;; WITHOUT ANY WARRANTY; without even the implied warranty of
29;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30;;; GNU General Public License for more details.
31;;;
32;;; You should have received a copy of the GNU General Public License
33;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
34
35(define-module (gnu packages ibus)
36 #:use-module (guix licenses)
37 #:use-module (guix packages)
38 #:use-module (guix gexp)
39 #:use-module (guix deprecation)
40 #:use-module (guix download)
41 #:use-module (guix git-download)
42 #:use-module (guix build-system cmake)
43 #:use-module (guix build-system gnu)
44 #:use-module (guix build-system glib-or-gtk)
45 #:use-module (guix build-system meson)
46 #:use-module (guix build-system pyproject)
47 #:use-module (guix utils)
48 #:use-module (gnu packages)
49 #:use-module (gnu packages anthy)
50 #:use-module (gnu packages autotools)
51 #:use-module (gnu packages bash)
52 #:use-module (gnu packages base)
53 #:use-module (gnu packages bash)
54 #:use-module (gnu packages boost)
55 #:use-module (gnu packages check)
56 #:use-module (gnu packages cmake)
57 #:use-module (gnu packages databases)
58 #:use-module (gnu packages datastructures)
59 #:use-module (gnu packages dbm)
60 #:use-module (gnu packages dictionaries)
61 #:use-module (gnu packages docbook)
62 #:use-module (gnu packages freedesktop)
63 #:use-module (gnu packages gettext)
64 #:use-module (gnu packages glib)
65 #:use-module (gnu packages gnome)
66 #:use-module (gnu packages gstreamer)
67 #:use-module (gnu packages gtk)
68 #:use-module (gnu packages iso-codes)
69 #:use-module (gnu packages language)
70 #:use-module (gnu packages linux)
71 #:use-module (gnu packages logging)
72 #:use-module (gnu packages lua)
73 #:use-module (gnu packages perl)
74 #:use-module (gnu packages pkg-config)
75 #:use-module (gnu packages python)
76 #:use-module (gnu packages python-build)
77 #:use-module (gnu packages python-check)
78 #:use-module (gnu packages python-xyz)
79 #:use-module (gnu packages python-web)
80 #:use-module (gnu packages serialization)
81 #:use-module (gnu packages speech)
82 #:use-module (gnu packages sqlite)
83 #:use-module (gnu packages textutils)
84 #:use-module (gnu packages unicode)
85 #:use-module (gnu packages xorg)
86 #:use-module (gnu packages xdisorg)
87 #:use-module (gnu packages xml)
88 #:use-module (srfi srfi-1))
89
90(define-public ibus-minimal
91 (package
92 (name "ibus")
93 (version "1.5.34")
94 (source (origin
95 (method git-fetch)
96 (uri (git-reference
97 (url "https://github.com/ibus/ibus")
98 (commit version)))
99 (file-name (git-file-name name version))
100 (sha256 (base32 "1x05dwhi79s1mqgs34srdr2d5fvkyvihqvcnw91630xyf4r76b1h"))))
101 (build-system glib-or-gtk-build-system)
102 (outputs '("out" "doc"))
103 (arguments
104 (list
105 #:configure-flags #~(list "--disable-gtk2"
106 "--disable-gtk4"
107 "--enable-gtk-doc"
108 "--enable-memconf"
109 (string-append
110 "--with-unicode-emoji-dir="
111 (search-input-directory %build-inputs
112 "share/unicode/emoji"))
113 (string-append
114 "--with-emoji-annotation-dir="
115 (search-input-directory
116 %build-inputs
117 "share/unicode/cldr/common/annotations"))
118 (string-append
119 "--with-ucd-dir="
120 (search-input-directory %build-inputs
121 "share/ucd"))
122 "--enable-wayland"
123 "--disable-systemd-services")
124 #:make-flags
125 ;; The GUI tests not only require a DISPLAY, but also a window manager
126 ;; since IBus needs to receive focus-in/out events to test IBus with GTK
127 ;; applications (see: https://github.com/ibus/ibus/issues/2307).
128 #~(list (string-append "DISABLE_GUI_TESTS=ibus-compose "
129 "ibus-inputcontext-create "
130 "xkb-latin-layouts "))
131 #:phases
132 #~(modify-phases %standard-phases
133 (add-after 'unpack 'disable-failing-tests
134 (lambda _
135 ;; These tests require /etc/machine-id.
136 (with-directory-excursion "src/tests"
137 (substitute* '("ibus-share.c" "ibus-compose.c"
138 "ibus-keypress.c")
139 (("[ \t]*return g_test_run \\(\\);") "")))))
140 (add-before 'configure 'disable-dconf-update
141 (lambda _
142 (substitute* "data/dconf/Makefile.in"
143 (("dconf update") "echo dconf update"))))
144 (add-after 'unpack 'fix-paths
145 (lambda* (#:key inputs #:allow-other-keys)
146 (substitute* "ui/gtk3/xkblayout.vala"
147 (("\"(setxkbmap|xmodmap)\"" _ prog)
148 (format #f "~s" (search-input-file
149 inputs (string-append "bin/" prog)))))))
150 (add-before 'configure 'patch-python-target-directories
151 (lambda _
152 (let ((root (string-append #$output
153 "/lib/python"
154 #$(version-major+minor
155 (package-version python))
156 "/site-packages")))
157 (substitute* "configure"
158 (("(py2?overridesdir)=.*" _ var)
159 (string-append var "=" root "/gi/overrides/\n"))
160 (("(pkgpython2dir=).*" _ var)
161 (string-append var root "/ibus\n"))))))
162 (add-before 'check 'pre-check
163 (lambda _
164 ;; Tests write to $HOME.
165 (setenv "HOME" (getcwd))
166 ;; Tests look for $XDG_RUNTIME_DIR.
167 (setenv "XDG_RUNTIME_DIR" (getcwd))
168 ;; For missing '/etc/machine-id'.
169 (setenv "DBUS_FATAL_WARNINGS" "0")
170 ;; Tests require a running X server.
171 (system "Xvfb :1 +extension GLX &")
172 (setenv "DISPLAY" ":1")
173 ;; Tests require running iBus daemon.
174 (system "./bus/ibus-daemon --daemonize")))
175 (add-after 'install 'move-doc
176 (lambda _
177 (mkdir-p (string-append #$output:doc "/share"))
178 (rename-file
179 (string-append #$output "/share/gtk-doc")
180 (string-append #$output:doc "/share/gtk-doc"))))
181 (add-after 'glib-or-gtk-wrap 'wrap-with-additional-paths
182 (lambda* (#:key outputs #:allow-other-keys)
183 ;; Make sure 'ibus-setup' runs with the correct GI_TYPELIB_PATH.
184 (wrap-program (search-input-file outputs "bin/ibus-setup")
185 `("GI_TYPELIB_PATH" ":" prefix
186 (,(getenv "GI_TYPELIB_PATH")
187 ,(string-append #$output "/lib/girepository-1.0")))))))))
188 (inputs
189 (list bash-minimal
190 dbus
191 dconf
192 glib
193 gtk+
194 iso-codes/pinned
195 json-glib
196 libdbusmenu
197 libnotify
198 libx11
199 libxkbcommon
200 libxtst
201 setxkbmap
202 ucd
203 unicode-cldr-common
204 unicode-emoji-12
205 wayland
206 xmodmap))
207 (native-inputs
208 (list autoconf-2.72
209 automake
210 docbook-xml-4.1.2
211 `(,glib "bin") ;for glib-genmarshal
212 gettext-minimal
213 gnome-common
214 gobject-introspection ;for g-ir-compiler
215 `(,gtk+ "bin")
216 gtk-doc/stable
217 libtool
218 perl
219 pkg-config
220 python-wrapper
221 vala
222 which
223 xorg-server-for-tests))
224 (native-search-paths
225 (list (search-path-specification
226 (variable "IBUS_COMPONENT_PATH")
227 (files '("share/ibus/component")))))
228 (synopsis "Input method framework")
229 (description
230 "IBus is an input framework providing a full-featured and user-friendly
231input method user interface. It comes with multilingual input support. It
232may also simplify input method development.")
233 (home-page "https://github.com/ibus/ibus/wiki")
234 (license lgpl2.1+)
235 (properties '((hidden? . #t)))))
236
237(define-public ibus
238 (package/inherit ibus-minimal
239 (arguments
240 (substitute-keyword-arguments arguments
241 ((#:configure-flags flags)
242 #~(cons* "--enable-python-library"
243 (delete "--disable-gtk4" #$flags)))
244 ((#:phases phases '%standard-phases)
245 #~(modify-phases #$phases
246 (add-after 'unpack 'disable-registry-cache
247 ;; IBus registry cache depends on mtime, which doesn't work on
248 ;; Guix.
249 (lambda _
250 (substitute* "bus/main.c"
251 (("ibus_init") "g_cache = \"none\"; ibus_init"))))
252 (replace 'wrap-with-additional-paths
253 (lambda* (#:key outputs #:allow-other-keys)
254 ;; Make sure 'ibus-setup' and 'ibus-daemon' runs with the
255 ;; correct GUIX_PYTHONPATH and GI_TYPELIB_PATH. Wrap
256 ;; 'ibus-daemon' is needed because engines spawned by
257 ;; the daemon need access to those libraries.
258 (for-each
259 (lambda (prog)
260 (wrap-program prog
261 `("GUIX_PYTHONPATH" ":" prefix
262 (,(getenv "GUIX_PYTHONPATH")))
263 `("GI_TYPELIB_PATH" ":" prefix
264 (,(getenv "GI_TYPELIB_PATH")
265 ,(string-append #$output "/lib/girepository-1.0")))))
266 (list (search-input-file outputs "bin/ibus-setup")
267 (search-input-file outputs "bin/ibus-daemon")))))))))
268 (inputs (modify-inputs inputs
269 (prepend gtk
270 pango
271 python
272 python-dbus-1.2
273 python-pygobject-3.50)))
274 (native-search-paths
275 (cons (search-path-specification
276 (variable "GUIX_GTK3_IM_MODULE_FILE")
277 (file-type 'regular)
278 (separator #f)
279 (files '("lib/gtk-3.0/3.0.0/immodules-gtk3.cache")))
280 (package-native-search-paths ibus-minimal)))
281 (properties (alist-delete 'hidden? (package-properties ibus-minimal)))))
282
283(define-public ibus-libpinyin
284 (package
285 (name "ibus-libpinyin")
286 (version "1.15.2")
287 (source (origin
288 (method url-fetch)
289 (uri (string-append "https://github.com/libpinyin/ibus-libpinyin/"
290 "releases/download/" version
291 "/ibus-libpinyin-" version ".tar.gz"))
292 (sha256
293 (base32
294 "01zsx3aw9iwjm70mksgpjlqjj5f5wi9l0pdixprw5lj5hxd8siyp"))))
295 (build-system glib-or-gtk-build-system)
296 (arguments
297 (list
298 #:configure-flags
299 '(list "--enable-opencc")
300 #:phases
301 #~(modify-phases %standard-phases
302 (add-after 'glib-or-gtk-wrap 'wrap-with-additional-paths
303 (lambda _
304 ;; Make sure 'ibus-setup-libpinyin' runs with the correct
305 ;; PYTHONPATH and GI_TYPELIB_PATH.
306 (wrap-program (string-append #$output "/libexec/ibus-setup-libpinyin")
307 `("GUIX_PYTHONPATH" ":" prefix
308 (,(getenv "GUIX_PYTHONPATH")
309 ,(string-append #$(this-package-input "ibus")
310 "/lib/girepository-1.0")
311 ,(string-append #$output
312 "/share/ibus-libpinyin/setup/")))
313 `("GI_TYPELIB_PATH" ":" prefix
314 (,(string-append #$(this-package-input "ibus")
315 "/lib/girepository-1.0")
316 ,(string-append #$(this-package-input "gtk+")
317 "/lib/girepository-1.0")
318 ,(string-append #$output
319 "/share/ibus-libpinyin/setup/")
320 ,(getenv "GI_TYPELIB_PATH")))))))))
321 (inputs
322 (list bash-minimal
323 ibus
324 libpinyin
325 bdb
326 sqlite
327 opencc
328 python
329 python-pygobject
330 gtk+))
331 (native-inputs
332 (list pkg-config intltool
333 `(,glib "bin")))
334 (synopsis "Chinese pinyin and ZhuYin input methods for IBus")
335 (description
336 "This package includes a Chinese pinyin input method and a Chinese
337ZhuYin (Bopomofo) input method based on libpinyin for IBus.")
338 (home-page "https://github.com/libpinyin/ibus-libpinyin")
339 (license gpl3+)))
340
341(define-public libpinyin
342 (package
343 (name "libpinyin")
344 (version "2.8.1")
345 (source (origin
346 (method url-fetch)
347 (uri (string-append "https://github.com/libpinyin/libpinyin/"
348 "releases/download/" version
349 "/libpinyin-" version ".tar.gz"))
350 (sha256
351 (base32
352 "0l4h1q2l5fql0fy9bmncyw0dpbfwn1yb5p3xnwvhgpbidpq58c9m"))))
353 (build-system gnu-build-system)
354 (inputs
355 (list glib bdb))
356 (native-inputs
357 (list pkg-config))
358 (synopsis "Library to handle Chinese pinyin")
359 (description
360 "The libpinyin C++ library provides algorithms needed for sentence-based
361Chinese pinyin input methods.")
362 (home-page "https://github.com/libpinyin/libpinyin")
363 (license gpl2+)))
364
365(define-public ibus-chewing
366 (package
367 (name "ibus-chewing")
368 (version "2.1.1")
369 (source (origin
370 (method git-fetch)
371 (uri (git-reference
372 (url "https://github.com/chewing/ibus-chewing")
373 (commit (string-append "v" version))))
374 (file-name (git-file-name name version))
375 (sha256
376 (base32
377 "0fgscxb8nhli4g8d3yy0wxzbk9bcyj6bvmqrzbddkvgikmanj36b"))))
378 (build-system cmake-build-system)
379 (arguments
380 (list
381 ;; Settings schema 'org.freedesktop.IBus.Chewing' is not installed
382 #:tests? #f
383 #:phases
384 #~(modify-phases %standard-phases
385 (add-before 'check 'prepare-for-tests
386 (lambda* (#:key tests? #:allow-other-keys)
387 (when tests?
388 ;; IBus requires write access to the HOME directory.
389 (setenv "HOME" (getcwd))
390 ;; MESA: error: ZINK: failed to choose pdev
391 (setenv "GALLIUM_DRIVER" "llvmpipe")
392 (system "Xvfb :1 &")
393 (setenv "DISPLAY" ":1")))))))
394 (inputs
395 (list glib
396 gtk
397 ibus
398 libadwaita
399 libchewing))
400 (native-inputs
401 (list dbus
402 gettext-minimal
403 gobject-introspection
404 `(,glib "bin")
405 pkg-config
406 xorg-server-for-tests))
407 (home-page "https://chewing.im/")
408 (synopsis "Chewing engine for IBus")
409 (description "IBus-Chewing is an IBus front-end of Chewing, an intelligent
410Chinese input method for Zhuyin (BoPoMoFo) users.")
411 (license gpl2)))
412
413(define-public ibus-anthy
414 (package
415 (name "ibus-anthy")
416 (version "1.5.15")
417 (source (origin
418 (method url-fetch)
419 (uri (string-append
420 "https://github.com/ibus/ibus-anthy/releases/download/"
421 version "/ibus-anthy-" version ".tar.gz"))
422 (sha256
423 (base32
424 "12yrgqiq6mqc8jr49dgkk3d7mdnyqic4xs597biwjjkahgaydi2q"))
425 (patches (search-patches "ibus-anthy-fix-tests.patch"))))
426 (build-system glib-or-gtk-build-system)
427 (arguments
428 (list
429 ;; The test suite hangs (see:
430 ;; https://github.com/ibus/ibus-anthy/pull/35).
431 #:tests? #f
432 #:configure-flags
433 ;; Use absolute exec path in the anthy.xml.
434 #~(list (string-append "--libexecdir=" #$output "/libexec")
435 (string-append
436 "--with-anthy-zipcode="
437 (assoc-ref %build-inputs "anthy") "/share/anthy/zipcode.t"))
438 ;; The test suite fails (see:
439 ;; https://github.com/ibus/ibus-anthy/issues/28).
440 #:phases
441 #~(modify-phases %standard-phases
442 (add-after 'unpack 'fix-check
443 (lambda _
444 (substitute* "data/Makefile.in"
445 ;; Use a year current at the time the release was made, to
446 ;; avoid the "This year 2023 is not included in era.y"
447 ;; error.
448 (("`date '\\+%Y'`")
449 "2021"))))
450 (add-after 'unpack 'do-not-override-GI_TYPELIB_PATH
451 ;; Do not override the GI_TYPELIB_PATH to avoid the pygobject
452 ;; error: "ValueError: Namespace Gdk not available".
453 (lambda _
454 (substitute* "tests/test-build.sh"
455 (("GI_TYPELIB_PATH=\\$BUILDDIR/../gir" all)
456 (string-append all ":$GI_TYPELIB_PATH")))))
457 (add-before 'configure 'pre-configure
458 (lambda _
459 ;; We need generate new _config.py with correct PKGDATADIR.
460 (delete-file "setup/python3/_config.py")
461 (delete-file "engine/python3/_config.py")))
462 (add-before 'check 'prepare-for-tests
463 (lambda* (#:key tests? #:allow-other-keys)
464 (when tests?
465 ;; IBus requires write access to the HOME directory.
466 (setenv "HOME" "/tmp")
467 ;; The single test is skipped if no actual display is found.
468 (system "Xvfb :1 &")
469 (setenv "DISPLAY" ":1"))))
470 (add-after 'install 'wrap-programs
471 (lambda* (#:key inputs #:allow-other-keys)
472 (for-each
473 (lambda (prog)
474 (wrap-program (string-append #$output "/libexec/" prog)
475 `("GUIX_PYTHONPATH" ":" prefix
476 (,(getenv "GUIX_PYTHONPATH")))
477 `("GI_TYPELIB_PATH" ":" prefix
478 (,(getenv "GI_TYPELIB_PATH")
479 ,(string-append #$output "/lib/girepository-1.0")))))
480 '("ibus-engine-anthy" "ibus-setup-anthy")))))))
481 (native-inputs
482 (list gettext-minimal
483 `(,glib "bin")
484 intltool
485 pkg-config
486 procps ;for ps
487 python
488 python-pycotap
489 util-linux ;for getopt
490 xorg-server-for-tests))
491 (inputs
492 (list bash-minimal
493 anthy
494 gtk+
495 ibus
496 gobject-introspection
497 python-pygobject))
498 (synopsis "Anthy Japanese language input method for IBus")
499 (description "IBus-Anthy is an engine for the input bus \"IBus\"). It
500adds the Anthy Japanese language input method to IBus. Because most graphical
501applications allow text input via IBus, installing this package will enable
502Japanese language input in most graphical applications.")
503 (home-page "https://github.com/fujiwarat/ibus-anthy")
504 (license gpl2+)))
505
506(define-public ibus-skk
507 (package
508 (name "ibus-skk")
509 (version "1.4.3")
510 (source
511 (origin
512 (method url-fetch)
513 (uri (string-append
514 "https://github.com/ueno/ibus-skk/releases/download/ibus-skk-"
515 version "/ibus-skk-" version ".tar.xz"))
516 (sha256
517 (base32 "0pb5766njjsv0cfikm0j5sq0kv07sd5mlxj1c06k5y6p1ffvsqb6"))))
518 (build-system gnu-build-system)
519 (arguments
520 (list
521 #:tests? #f ;no tests
522 #:configure-flags
523 #~(list "CFLAGS=-Wno-error=incompatible-pointer-types")
524 #:phases
525 #~(modify-phases %standard-phases
526 (add-after 'unpack 'patch-skk-jisyo
527 (lambda _
528 (substitute* "src/preferences.vala"
529 (("/usr/share/skk/SKK-JISYO.L")
530 (string-append #$(this-package-input "skk-jisyo")
531 "/share/skk/SKK-JISYO.L"))))))))
532 (inputs
533 (list gtk+ ibus libgee libskk skk-jisyo))
534 (native-inputs
535 (list intltool pkg-config vala))
536 (synopsis "Japanese input method SKK engine for IBus")
537 (description
538 "ibus-skk is an implementation of the SKK (Simple Kana-Kanji) input method
539on the IBus input method framework. Note that SKK works quite differently from
540other Japanese input methods.")
541 (home-page "https://github.com/ueno/ibus-skk")
542 (license gpl2+)))
543
544;; librime-lua is licensed under bsd-3 and is used as a plugin to be built
545;; together with librime.
546(define librime-lua
547 (origin
548 (method git-fetch)
549 (uri (git-reference
550 (url "https://github.com/hchunhui/librime-lua")
551 (commit "ec52e48ea18f11af37717a01c337f853215cf70b")))
552 (file-name (git-file-name "librime-lua" "1.17.0"))
553 (sha256
554 (base32
555 "1z7knc45s8gr52w3xc6p6qacg2hbh8w9ycjqcrfnzdx519har6la"))))
556
557(define-public librime
558 (package
559 (name "librime")
560 (version "1.17.0")
561 (source
562 (origin
563 (method git-fetch)
564 (uri (git-reference
565 (url "https://github.com/rime/librime")
566 (commit version)))
567 (file-name (git-file-name name version))
568 (sha256
569 (base32
570 "1hqrsjmir0932rzv752ii4wdf6inh8jjhcrs35aw1yxqjl1qn68y"))))
571 (build-system cmake-build-system)
572 (arguments
573 (list
574 #:phases
575 #~(modify-phases %standard-phases
576 (add-after 'unpack 'install-plugins
577 (lambda _
578 (copy-recursively #$librime-lua "plugins/lua"))))))
579 (inputs
580 (list boost
581 capnproto
582 glog-next
583 leveldb
584 luajit
585 marisa
586 opencc
587 yaml-cpp))
588 (native-inputs
589 (list googletest pkg-config xorgproto)) ; keysym.h
590 (home-page "https://rime.im/")
591 (synopsis "The core library of Rime Input Method Engine")
592 (description "@dfn{librime} is the core library of Rime Input Method
593Engine, which is a lightweight, extensible input method engine supporting
594various input schemas including glyph-based input methods, romanization-based
595input methods as well as those for Chinese dialects. It has the ability to
596compose phrases and sentences intelligently and provide very accurate
597traditional Chinese output.")
598 (license bsd-3)))
599
600(define-public rime-data
601 (package
602 (name "rime-data")
603 (version "0.38.20210802")
604 (source
605 (origin
606 (method git-fetch)
607 (uri (git-reference
608 (url "https://github.com/rime/plum")
609 (commit "0b835e347cad9c2d7038cfe82df5b5d1fe1c0327")))
610 (file-name "plum-checkout")
611 (sha256
612 (base32 "0mja4wyazxdc6fr7pzij5ah4rzwxv4s12s64vfn5ikx1ias1f8ib"))))
613 (build-system gnu-build-system)
614 (arguments
615 `(#:modules ((ice-9 match)
616 ,@%default-gnu-modules)
617 #:tests? #f ; no tests
618 #:make-flags (list (string-append "PREFIX=" (assoc-ref %outputs "out")))
619 #:phases
620 (modify-phases %standard-phases
621 (add-after 'unpack 'patch-source
622 (lambda _
623 ;; Disable git operations.
624 (substitute* "scripts/install-packages.sh"
625 (("^\\s*fetch_or_update_package\\s$") ""))
626 #t))
627 ;; Copy Rime schemas into the "package/rime" directory.
628 (add-after 'unpack 'copy-rime-schemas
629 (lambda* (#:key inputs #:allow-other-keys)
630 (let ((dest-dir "package/rime"))
631 (mkdir-p dest-dir)
632 (for-each
633 (match-lambda
634 ((name . path)
635 (if (string-prefix? "rime-" name)
636 (let ((schema (substring name (string-length "rime-"))))
637 (symlink path (string-append dest-dir "/" schema))))))
638 inputs))
639 #t))
640 (replace 'build
641 ;; NOTE: Don't build binary Rime schema. Binary Rime schema files
642 ;; are platform dependent and contain timestamp information.
643 ;; Therefore they are not reproducible.
644 (lambda* (#:key make-flags #:allow-other-keys)
645 (apply invoke "make" "all" make-flags)))
646 (delete 'configure))))
647 (inputs
648 `(("rime-array"
649 ,(origin
650 (method git-fetch)
651 (uri (git-reference
652 (url "https://github.com/rime/rime-array")
653 (commit "7a7bfafae966e5f949a23a82ee8594cacf492593")))
654 (file-name "rime-array-checkout")
655 (sha256
656 (base32
657 "0kw0wyc5f77bv06fixkfvqnibmm80pyifvrhz8f1h411926ny37r"))))
658 ("rime-bopomofo"
659 ,(origin
660 (method git-fetch)
661 (uri (git-reference
662 (url "https://github.com/rime/rime-bopomofo")
663 (commit "c7618f4f5728e1634417e9d02ea50d82b71956ab")))
664 (file-name "rime-bopomofo-checkout")
665 (sha256
666 (base32
667 "0g77nv0jrwqnbqqna0ib0kqcy6l5zl62kh49ny67d6bjwnwz9186"))))
668 ("rime-cangjie"
669 ,(origin
670 (method git-fetch)
671 (uri (git-reference
672 (url "https://github.com/rime/rime-cangjie")
673 (commit "8dfad9e537f18821b71ba28773315d9c670ae245")))
674 (file-name "rime-cangjie-checkout")
675 (sha256
676 (base32
677 "029kw9nx6x0acg4f0m8wj1ziqffffhy9yyj51nlx17cnia0qcrby"))))
678 ("rime-cantonese"
679 ,(origin
680 (method git-fetch)
681 (uri (git-reference
682 (url "https://github.com/rime/rime-cantonese")
683 (commit "fa7c8ad19d51143c1a470295d56feeb63e92113f")))
684 (file-name "rime-cantonese-checkout")
685 (sha256
686 (base32
687 "0vy5vv6h4r4b2msdvdrsj0zr6wmrv0fxm5zyyvxq8f1ix7ignm4c"))))
688 ("rime-combo-pinyin"
689 ,(origin
690 (method git-fetch)
691 (uri (git-reference
692 (url "https://github.com/rime/rime-combo-pinyin")
693 (commit "a84065a86b272c76215215bd6f03c506b6e7097c")))
694 (file-name "rime-combo-pinyin-checkout")
695 (sha256
696 (base32
697 "1f0b4kakw0x26gmx7xi4f94nbjlb8lvi9bks4f92jswa045vnd87"))))
698 ("rime-double-pinyin"
699 ,(origin
700 (method git-fetch)
701 (uri (git-reference
702 (url "https://github.com/rime/rime-double-pinyin")
703 (commit "69bf85d4dfe8bac139c36abbd68d530b8b6622ea")))
704 (file-name "rime-double-pinyin-checkout")
705 (sha256
706 (base32
707 "093wif5avvvw45fqbwj5wkbxrychy4pagl4mwsmbrayc8jkp69ak"))))
708 ("rime-emoji"
709 ,(origin
710 (method git-fetch)
711 (uri (git-reference
712 (url "https://github.com/rime/rime-emoji")
713 (commit "4c8c51f4a3bc7298c99376eda9bbd86070fc4fa1")))
714 (file-name "rime-emoji-checkout")
715 (sha256
716 (base32
717 "0175jqh210fncafqckr9zzaw55qpswmqjrykwms1apmc68l43122"))))
718 ("rime-essay"
719 ,(origin
720 (method git-fetch)
721 (uri (git-reference
722 (url "https://github.com/rime/rime-essay")
723 (commit "9db2e77305e75798baf3ec8dcf1f82785b5e1be9")))
724 (file-name "rime-essay-checkout")
725 (sha256
726 (base32
727 "03ypkkaadd5qmyg26n24a66cll90xvcimgbmiyv4d33jradiqg22"))))
728 ("rime-ipa"
729 ,(origin
730 (method git-fetch)
731 (uri (git-reference
732 (url "https://github.com/rime/rime-ipa")
733 (commit "22b71710e029bcb412e9197192a638ab11bc2abf")))
734 (file-name "rime-ipa-checkout")
735 (sha256
736 (base32
737 "0zdk4f9qkfj3q5hmjnairj1lv6f6y27mic12k886n6sxywwbwr2k"))))
738 ("rime-jyutping"
739 ,(origin
740 (method git-fetch)
741 (uri (git-reference
742 (url "https://github.com/rime/rime-jyutping")
743 (commit "1e24baa6998815c716c581effe8ec65ee87c4e8c")))
744 (file-name "rime-jyutping-checkout")
745 (sha256
746 (base32
747 "0s2rckpwlrm3n7w1csnqyi5p9mkpp3z87s7mrm2vc9sv06rpv7zl"))))
748 ("rime-luna-pinyin"
749 ,(origin
750 (method git-fetch)
751 (uri (git-reference
752 (url "https://github.com/rime/rime-luna-pinyin")
753 (commit "623adb022b094d540218b287c2e601509eee3347")))
754 (file-name "rime-luna-pinyin-checkout")
755 (sha256
756 (base32
757 "06pcwp09l5wkqv7792gbsl31xnlb3gr9q6bgbp94vvq6m2ycahqz"))))
758 ("rime-middle-chinese"
759 ,(origin
760 (method git-fetch)
761 (uri (git-reference
762 (url "https://github.com/rime/rime-middle-chinese")
763 (commit "9fad7a7c0c26167d5e6e85db8df48a15c7f7d4f0")))
764 (file-name "rime-middle-chinese-checkout")
765 (sha256
766 (base32
767 "0a0bqrlzg0k692xblqnh1rh1fwwqqb205xwxlihgji85n8ibcgph"))))
768 ("rime-pinyin-simp"
769 ,(origin
770 (method git-fetch)
771 (uri (git-reference
772 (url "https://github.com/rime/rime-pinyin-simp")
773 (commit "b0e84cda02c613ebdedc127a26131b3800f45a8e")))
774 (file-name "rime-pinyin-simp-checkout")
775 (sha256
776 (base32
777 "05v804qr3a9xvjzp9yid7231fi2l2yrl47ybbvql61z9k36ab094"))))
778 ("rime-prelude"
779 ,(origin
780 (method git-fetch)
781 (uri (git-reference
782 (url "https://github.com/rime/rime-prelude")
783 (commit "3de303ffaa731dba07b0462ce59f4767e1219ad2")))
784 (file-name "rime-prelude-checkout")
785 (sha256
786 (base32
787 "0g7a0bla58rh1v3md59k6adk185pilb4z8i2i0pqdl4nwqp40n2p"))))
788 ("rime-quick"
789 ,(origin
790 (method git-fetch)
791 (uri (git-reference
792 (url "https://github.com/rime/rime-quick")
793 (commit "3fe5911ba608cb2df1b6301b76ad1573bd482a76")))
794 (file-name "rime-quick-checkout")
795 (sha256
796 (base32
797 "08bh87ym5qvw55lyw20l3m7jd4c2z5rvil8h5q8790r7z6j6ijy9"))))
798 ("rime-scj"
799 ,(origin
800 (method git-fetch)
801 (uri (git-reference
802 (url "https://github.com/rime/rime-scj")
803 (commit "cab5a0858765eff0553dd685a2d61d5536e9149c")))
804 (file-name "rime-scj-checkout")
805 (sha256
806 (base32
807 "0ard2bjp4896a8dimmcwyjwgmp9kl4rz92yc92jnd3y4rgwl6fvk"))))
808 ("rime-soutzoe"
809 ,(origin
810 (method git-fetch)
811 (uri (git-reference
812 (url "https://github.com/rime/rime-soutzoe")
813 (commit "beeaeca72d8e17dfd1e9af58680439e9012987dc")))
814 (file-name "rime-soutzoe-checkout")
815 (sha256
816 (base32
817 "0jyqx0q9s0qxn168l5n8zav8jcl2g5ppr7pa8jm1vwrllf20slcc"))))
818 ("rime-stenotype"
819 ,(origin
820 (method git-fetch)
821 (uri (git-reference
822 (url "https://github.com/rime/rime-stenotype")
823 (commit "f3e9189d5ce33c55d3936cc58e39d0c88b3f0c88")))
824 (file-name "rime-stenotype-checkout")
825 (sha256
826 (base32
827 "0dl6px7lrh3xa87knjzwzdcwjj1k1dg4l72q7lb48an4s9f1cy5d"))))
828 ("rime-stroke"
829 ,(origin
830 (method git-fetch)
831 (uri (git-reference
832 (url "https://github.com/rime/rime-stroke")
833 (commit "ea8576d1accd6fda339e96b415caadb56e2a07d1")))
834 (file-name "rime-stroke-checkout")
835 (sha256
836 (base32
837 "07h6nq9867hjrd2v3h1pnr940sdrw4mqrzj43siz1rzjxz3s904r"))))
838 ("rime-terra-pinyin"
839 ,(origin
840 (method git-fetch)
841 (uri (git-reference
842 (url "https://github.com/rime/rime-terra-pinyin")
843 (commit "ce7b9249612f575d2f43d51fcacd31d1b4e0ef1b")))
844 (file-name "rime-terra-pinyin-checkout")
845 (sha256
846 (base32
847 "0vm303f4lrdmdmif5klrp6w29vn9z2vzw33cw0y83pcnz39wiads"))))
848 ("rime-wubi"
849 ,(origin
850 (method git-fetch)
851 (uri (git-reference
852 (url "https://github.com/rime/rime-wubi")
853 (commit "f1876f08f1d4a9696395be0070c0e8e4353c44cb")))
854 (file-name "rime-wubi-checkout")
855 (sha256
856 (base32
857 "1d9y9rqssacria9d0hla96czsqv2wkfm6z926m1x269ryv96zxvk"))))
858 ("rime-wugniu"
859 ,(origin
860 (method git-fetch)
861 (uri (git-reference
862 (url "https://github.com/rime/rime-wugniu")
863 (commit "abd1ee98efbf170258fcf43875c21a4259e00b61")))
864 (file-name "rime-wugniu-checkout")
865 (sha256
866 (base32
867 "0qn54d3cclny106ixdw08r5n6wn52ffs1hgrma3k0j4pv0kr9nlq"))))))
868 (home-page "https://rime.im/")
869 (synopsis "Schema data of Rime Input Method Engine")
870 (description "@dfn{rime-data} provides the schema data of Rime Input
871Method Engine.")
872 (license (list
873 ;; rime-array
874 ;; rime-combo-pinyin
875 ;; rime-double-pinyin
876 ;; rime-middle-chinese
877 ;; rime-scj
878 ;; rime-soutzoe
879 ;; rime-stenotype
880 ;; rime-wugniu
881 gpl3
882
883 ;; plum
884 ;; rime-bopomofo
885 ;; rime-cangjie
886 ;; rime-emoji
887 ;; rime-essay
888 ;; rime-ipa
889 ;; rime-jyutping
890 ;; rime-luna-pinyin
891 ;; rime-prelude
892 ;; rime-quick
893 ;; rime-stroke
894 ;; rime-terra-pinyin
895 ;; rime-wubi
896 lgpl3
897
898 ;; rime-pinyin-simp
899 asl2.0
900
901 ;; rime-cantonese
902 cc-by4.0))))
903
904(define-public ibus-rime
905 (package
906 (name "ibus-rime")
907 (version "1.6.1")
908 (source
909 (origin
910 (method git-fetch)
911 (uri (git-reference
912 (url "https://github.com/rime/ibus-rime")
913 (commit version)))
914 (file-name (git-file-name name version))
915 (sha256
916 (base32 "0wvb9606q0hmqdsdnzvqah43f496wfyh23bzxbndi74sr55rngic"))))
917 (build-system cmake-build-system)
918 (arguments
919 `(#:tests? #f ; no tests
920 #:configure-flags
921 (list (string-append "-DRIME_DATA_DIR="
922 (assoc-ref %build-inputs "rime-data")
923 "/share/rime-data"))
924 #:phases
925 (modify-phases %standard-phases
926 (add-after 'unpack 'patch-source
927 (lambda _
928 (substitute* "CMakeLists.txt"
929 (("DESTINATION....RIME_DATA_DIR..")
930 "DESTINATION \"${CMAKE_INSTALL_DATADIR}/rime-data\""))
931 #t)))))
932 (inputs
933 (list gdk-pixbuf
934 glib
935 ibus
936 libnotify
937 librime
938 rime-data))
939 (native-inputs
940 (list cmake-minimal
941 pkg-config))
942 (home-page "https://rime.im/")
943 (synopsis "Rime Input Method Engine for IBus")
944 (description "@dfn{ibus-rime} provides the Rime input method engine for
945IBus. Rime is a lightweight, extensible input method engine supporting
946various input schemas including glyph-based input methods, romanization-based
947input methods as well as those for Chinese dialects. It has the ability to
948compose phrases and sentences intelligently and provide very accurate
949traditional Chinese output.")
950 (license gpl3)))
951
952(define-public libhangul
953 (package
954 (name "libhangul")
955 (version "0.2.0")
956 (source
957 (origin
958 (method url-fetch)
959 (uri (string-append "https://github.com/libhangul/libhangul/releases/"
960 "download/libhangul-" version
961 "/libhangul-" version ".tar.gz"))
962 (sha256
963 (base32 "082i79asdrzl7049v0yv6q86jy4c0rhif734nnis4h28ryhfc17a"))))
964 (build-system gnu-build-system)
965 (native-inputs
966 (list autoconf-2.71
967 automake
968 gettext-minimal
969 libtool
970 pkg-config))
971 (inputs
972 (list (@ (gnu packages xml) expat)))
973 (home-page "https://github.com/libhangul/libhangul")
974 (synopsis "Library to support hangul input method logic")
975 (description
976 "This package provides a library to support hangul input method logic,
977hanja dictionary and small hangul character classification.")
978 (license lgpl2.1+)))
979
980(define-public ibus-hangul
981 (package
982 (name "ibus-hangul")
983 (version "1.5.5")
984 (source
985 (origin
986 (method git-fetch)
987 (uri (git-reference
988 (url "https://github.com/libhangul/ibus-hangul")
989 (commit version)))
990 (file-name (git-file-name name version))
991 (sha256
992 (base32 "0wsbh6ii223wdai2qwcwy6sj5jr9zzma7511fhkfq4m2qxdhwsn7"))))
993 (build-system gnu-build-system)
994 (arguments
995 (list
996 #:make-flags
997 #~'("DISABLE_GUI_TESTS=ibus-hangul")
998 #:phases
999 #~(modify-phases %standard-phases
1000 (add-after 'install 'wrap
1001 (lambda* (#:key inputs #:allow-other-keys)
1002 (wrap-program (string-append #$output
1003 "/libexec/ibus-setup-hangul")
1004 `("GUIX_PYTHONPATH" ":" prefix (,(getenv "GUIX_PYTHONPATH")))
1005 `("LD_LIBRARY_PATH" ":" prefix
1006 (,(dirname (search-input-file inputs "lib/libhangul.so"))))
1007 `("GI_TYPELIB_PATH" ":" prefix
1008 (,(getenv "GI_TYPELIB_PATH")))))))))
1009 (native-inputs
1010 (list autoconf
1011 automake
1012 gettext-minimal
1013 `(,glib "bin")
1014 libtool
1015 pkg-config))
1016 (inputs
1017 (list bash-minimal
1018 ibus
1019 glib
1020 python-pygobject
1021 gtk+
1022 libhangul
1023 python))
1024 (home-page "https://github.com/libhangul/ibus-hangul")
1025 (synopsis "Hangul engine for IBus")
1026 (description
1027 "ibus-hangul is a Korean input method engine for IBus.")
1028 (license gpl2+)))
1029
1030;; XXX: Deprecated on 2026-05-26.
1031(define-deprecated-package ibus-libhangul ibus-hangul)
1032
1033(define-public ibus-table
1034 (package
1035 (name "ibus-table")
1036 (version "1.17.1")
1037 (source
1038 (origin
1039 (method url-fetch)
1040 (uri (string-append
1041 "https://github.com/mike-fabian/ibus-table/releases/download/"
1042 version "/ibus-table-" version ".tar.gz"))
1043 (sha256
1044 (base32 "063ba4fwk04lh0naj8z9r9x15ikckp94pd3f8xn40z3lnwsjx2sj"))
1045 (patches (search-patches "ibus-table-paths.patch"))))
1046 (build-system gnu-build-system)
1047 (arguments
1048 (list #:phases
1049 #~(modify-phases %standard-phases
1050 (add-after 'unpack 'patch-paths
1051 (lambda _
1052 (substitute* "engine/tabcreatedb.py"
1053 (("/usr/share/ibus-table")
1054 (string-append #$output "/share/ibus-table")))
1055 (substitute* "engine/ibus_table_location.py"
1056 (("/usr/share/ibus-table")
1057 (string-append #$output "/share/ibus-table"))
1058 (("/usr/libexec")
1059 (string-append #$output "/libexec")))))
1060 (add-before 'check 'pre-check
1061 (lambda _
1062 (setenv "HOME" (getcwd))))))) ; tests write to $HOME
1063 (native-inputs (list (list glib "bin") gobject-introspection pkg-config))
1064 (inputs (list glib gtk+ ibus python python-pygobject))
1065 (native-search-paths
1066 (list (search-path-specification
1067 (variable "IBUS_TABLE_LOCATION")
1068 (files '("share/ibus-table"))
1069 (separator #f))))
1070 (home-page "https://mike-fabian.github.io/ibus-table")
1071 (synopsis "Table based input framework for IBus")
1072 (description
1073 "@code{ibus-table} is a framework for table based input methods using
1074IBus.")
1075 (license lgpl2.1+)))
1076
1077(define-public ibus-table-others
1078 (package
1079 (name "ibus-table-others")
1080 (version "1.3.16")
1081 (source
1082 (origin
1083 (method url-fetch)
1084 (uri (string-append
1085 "https://github.com/moebiuscurve/ibus-table-others/releases/"
1086 "download/" version "/ibus-table-others-" version ".tar.gz"))
1087 (sha256
1088 (base32 "0vllwrjlgcvdjhs7nrg45hfvnivnfhrc05r6rhw8m0c41layl9jg"))))
1089 (build-system gnu-build-system)
1090 (arguments
1091 (list #:phases
1092 #~(modify-phases %standard-phases
1093 (add-before 'build 'pre-build
1094 (lambda _
1095 (setenv "HOME" (getcwd))))))) ; db written in $HOME
1096 (native-inputs (list pkg-config python))
1097 (inputs (list ibus ibus-table))
1098 (home-page "https://github.com/moebiuscurve/ibus-table-others")
1099 (synopsis "Various table-based input methods for IBus")
1100 (description
1101 "@code{ibus-table-others} provides the following input methods on
1102IBus-Table on IBus framework:
1103
1104@itemize
1105@item CNS11643
1106@item Compose
1107@item Emoji
1108@item IPA-X-SAMPA
1109@item LaTex
1110@item Mathwriter
1111@item Mongol bichig
1112@item RussianTraditional
1113@item Telex
1114@item Thai
1115@item Translit
1116@item Ua-Translit
1117@item Viqr
1118@item VNI
1119@item Yawerty
1120@end itemize")
1121 ;; GPL-3.0-or-later: vni, ipa-x-sampa, telex
1122 ;; WTFPL: mongol_bichig
1123 ;; LGPL-2.1-or-later: others
1124 (license (list lgpl2.1+ gpl3+ wtfpl2))))
1125
1126(define-public ibus-speech-to-text
1127 (package
1128 (name "ibus-speech-to-text")
1129 (version "0.4.0")
1130 (source (origin
1131 (method git-fetch)
1132 (uri (git-reference
1133 (url "https://github.com/PhilippeRo/IBus-Speech-To-Text")
1134 (commit version)))
1135 (file-name (git-file-name name version))
1136 (sha256
1137 (base32
1138 "00p7jfv815dblg20hahch6151rdbxhkdhfj51i0yvvmg3irvf7nm"))))
1139 (build-system meson-build-system)
1140 (arguments
1141 (list
1142 #:glib-or-gtk? #true
1143 #:phases
1144 '(modify-phases %standard-phases
1145 (add-after 'unpack 'skip-update-desktop-database
1146 (lambda* (#:key inputs #:allow-other-keys)
1147 (substitute* "meson.build"
1148 (("update_desktop_database: true")
1149 "update_desktop_database: false"))))
1150 (add-after 'set-paths 'add-install-to-pythonpath
1151 (lambda* (#:key outputs #:allow-other-keys)
1152 (let* ((out (assoc-ref outputs "out"))
1153 (ibus-stt-dir (string-append out "/share/ibus-stt")))
1154 (setenv "GUIX_PYTHONPATH"
1155 (string-append ibus-stt-dir ":"
1156 (getenv "GUIX_PYTHONPATH"))))))
1157 (add-after 'install 'wrap-with-additional-paths
1158 (lambda* (#:key inputs outputs #:allow-other-keys)
1159 ;; Make sure 'ibus-{setup,engine}-stt' find the gst-vosk plugin
1160 ;; and run with the correct GUIX_PYTHONPATH and GI_TYPELIB_PATH.
1161 (let ((out (assoc-ref outputs "out")))
1162 (for-each (lambda (prog)
1163 (wrap-program prog
1164 `("GST_PLUGIN_PATH" ":" prefix
1165 (,(string-append (assoc-ref inputs "gst-vosk")
1166 "/lib/gstreamer-1.0")
1167 ,(getenv "GST_PLUGIN_SYSTEM_PATH")))
1168 `("GUIX_PYTHONPATH" =
1169 (,(getenv "GUIX_PYTHONPATH")))
1170 `("GI_TYPELIB_PATH" =
1171 (,(getenv "GI_TYPELIB_PATH")))))
1172 (list (string-append out "/libexec/ibus-engine-stt")
1173 (string-append out "/libexec/ibus-setup-stt")))))))))
1174 (inputs
1175 (list bash-minimal
1176 gst-plugins-good ; for pulsesrc
1177 gst-vosk
1178 gstreamer
1179 gtk
1180 ibus
1181 libadwaita
1182 python
1183 python-babel
1184 python-pygobject))
1185 (native-inputs
1186 (list desktop-file-utils
1187 gettext-minimal
1188 (list glib "bin")
1189 gobject-introspection
1190 libxml2 pkg-config))
1191 (home-page "https://github.com/PhilippeRo/IBus-Speech-To-Text")
1192 (synopsis "Speech to text IBus engine using VOSK")
1193 (description "This Input Method uses VOSK for voice recognition and allows
1194to dictate text in several languages in any application that supports IBus.
1195One of the main advantages is that VOSK performs voice recognition locally
1196and does not rely on an online service.")
1197 (license gpl3+)))
1198
1199(define-public ibus-theme-tools
1200 (package
1201 (name "ibus-theme-tools")
1202 (version "4.2.0")
1203 (source
1204 (origin
1205 (method git-fetch)
1206 (uri (git-reference
1207 (url "https://github.com/openSUSE/IBus-Theme-Tools")
1208 (commit (string-append "v" version))))
1209 (file-name (git-file-name name version))
1210 (sha256
1211 (base32 "0i8vwnikwd1bfpv4xlgzc51gn6s18q58nqhvcdiyjzcmy3z344c2"))))
1212 (build-system pyproject-build-system)
1213 (arguments (list #:tests? #f)) ; No tests
1214 (propagated-inputs (list python-tinycss2 python-pygobject))
1215 (native-inputs (list gettext-minimal python-setuptools))
1216 (home-page "https://github.com/openSUSE/IBus-Theme-Tools")
1217 (synopsis "Tool for IBus Themes")
1218 (description "IBus Theme Tools can extract IBus-specific settings from
1219GTK themes to apply both within and without GNOME Shell.")
1220 (license gpl3+)))