mirror of https://codeberg.org/cage/tinmop/
Compare commits
13 Commits
756cce52c4
...
6e91a0f4b4
Author | SHA1 | Date |
---|---|---|
cage | 6e91a0f4b4 | |
cage | 77821cb025 | |
cage | a02fc51efd | |
cage | c8fc25dddd | |
cage | 44b6c62e44 | |
cage | f09b0f4aa3 | |
cage | 03d33bc719 | |
cage | 0cb5ef9c29 | |
cage | eac0b7b5a7 | |
cage | a0f8c83681 | |
cage | 9b4d719e4b | |
cage | f6c02041ef | |
cage | 7e32091b6f |
74
ChangeLog
74
ChangeLog
|
@ -1,3 +1,77 @@
|
|||
2021-01-10 cage
|
||||
|
||||
* po/tinmop.pot,
|
||||
* src/db.lisp,
|
||||
* src/gemini-subscription-window.lisp,
|
||||
* src/line-oriented-window.lisp,
|
||||
* src/package.lisp,
|
||||
* src/program-events.lisp,
|
||||
* src/scheduled-events.lisp,
|
||||
* src/ui-goodies.lisp:
|
||||
* etc/init.lisp,
|
||||
* po/it.po,
|
||||
* src/gemini/subscription.lisp,
|
||||
* src/package.lisp,
|
||||
* src/program-events.lisp,
|
||||
* src/ui-goodies.lisp,
|
||||
|
||||
- updated italian translation;
|
||||
- [gemini]
|
||||
- added command to refresh all gemlogs;
|
||||
- added scheduled refresh of all gemlogs;
|
||||
- fixed sorting of gemlog posts;
|
||||
- prevent crash when subscribing to an already subscribed gemlog;
|
||||
- added cancel of subscriptions.
|
||||
|
||||
2021-01-09 cage
|
||||
|
||||
* aclocal.m4,
|
||||
* configure,
|
||||
* configure.ac,
|
||||
* etc/init.lisp,
|
||||
* po/tinmop.pot,
|
||||
* src/db.lisp,
|
||||
* src/gemini/gemini-parser.lisp,
|
||||
* src/gemini/package.lisp,
|
||||
* src/gemini/subscription.lisp,
|
||||
* src/package.lisp,
|
||||
* src/program-events.lisp,
|
||||
* src/specials.lisp,
|
||||
* src/ui-goodies.lisp,
|
||||
* tinmop.asd,
|
||||
* Makefile.in,
|
||||
* etc/default-theme.conf,
|
||||
* etc/init.lisp,
|
||||
* po/it.po,
|
||||
* src/gemini-subscription-window.lisp,
|
||||
* src/gemini/package.lisp,
|
||||
* src/grovel-idn.lisp,
|
||||
* src/keybindings.lisp,
|
||||
* src/program-events.lisp,
|
||||
* src/software-configuration.lisp,
|
||||
* src/ui-goodies.lisp:
|
||||
|
||||
- [gemini]
|
||||
- added a draft for gemlog subscriptions;
|
||||
- added subscription command to gemlog.
|
||||
- used pkg-config in the libidn2 grovel file (thanks to yumh!);
|
||||
- updated italian translation;
|
||||
- using pkg-config for checking libidn2 with configure script.
|
||||
|
||||
2021-01-08 cage
|
||||
|
||||
* src/gemini/client.lisp,
|
||||
* src/gemini/package.lisp,
|
||||
* src/html-utils.lisp,
|
||||
* src/package.lisp,
|
||||
* tinmop.asd:
|
||||
* src/db.lisp,
|
||||
* src/gemini/subscription.lisp,
|
||||
* src/misc-utils.lisp,
|
||||
|
||||
- [gemini] Started with gemlog subscription, added database table and
|
||||
interface and subscribing API.
|
||||
|
||||
2021-01-06 cage
|
||||
|
||||
* po/it.po,
|
||||
|
|
|
@ -288,6 +288,8 @@ GMSGFMT = @GMSGFMT@
|
|||
GMSGFMT_015 = @GMSGFMT_015@
|
||||
GPG = @GPG@
|
||||
GREP = @GREP@
|
||||
IDN_CFLAGS = @IDN_CFLAGS@
|
||||
IDN_LIBS = @IDN_LIBS@
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
|
@ -319,6 +321,9 @@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
|||
PACKAGE_URL = @PACKAGE_URL@
|
||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||
PKG_CONFIG = @PKG_CONFIG@
|
||||
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
|
||||
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
|
||||
POSUB = @POSUB@
|
||||
SED = @SED@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
|
|
13
NEWS.org
13
NEWS.org
|
@ -1,3 +1,16 @@
|
|||
* 2021-01-10 version 0.5.0
|
||||
|
||||
- New features
|
||||
- added subscriptions to gemlog according to the following gemini
|
||||
specification:
|
||||
gemini://gemini.circumlunar.space/docs/companion/subscription.gmi
|
||||
- Bugfix
|
||||
|
||||
Fixed configure scripts and several problems related to wrapping libidn2.
|
||||
|
||||
Building the program from sources should not fails anymore on
|
||||
debian stable and *BSD.
|
||||
|
||||
* 2020-12-31 version 0.4.2
|
||||
|
||||
- Bugfix
|
||||
|
|
|
@ -86,6 +86,282 @@ AC_DEFUN([gt_INTL_MACOSX],
|
|||
AC_SUBST([INTL_MACOSX_LIBS])
|
||||
])
|
||||
|
||||
# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
|
||||
# serial 12 (pkg-config-0.29.2)
|
||||
|
||||
dnl Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
|
||||
dnl Copyright © 2012-2015 Dan Nicholson <dbn.lists@gmail.com>
|
||||
dnl
|
||||
dnl This program is free software; you can redistribute it and/or modify
|
||||
dnl it under the terms of the GNU General Public License as published by
|
||||
dnl the Free Software Foundation; either version 2 of the License, or
|
||||
dnl (at your option) any later version.
|
||||
dnl
|
||||
dnl This program is distributed in the hope that it will be useful, but
|
||||
dnl WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
dnl General Public License for more details.
|
||||
dnl
|
||||
dnl You should have received a copy of the GNU General Public License
|
||||
dnl along with this program; if not, write to the Free Software
|
||||
dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
dnl 02111-1307, USA.
|
||||
dnl
|
||||
dnl As a special exception to the GNU General Public License, if you
|
||||
dnl distribute this file as part of a program that contains a
|
||||
dnl configuration script generated by Autoconf, you may include it under
|
||||
dnl the same distribution terms that you use for the rest of that
|
||||
dnl program.
|
||||
|
||||
dnl PKG_PREREQ(MIN-VERSION)
|
||||
dnl -----------------------
|
||||
dnl Since: 0.29
|
||||
dnl
|
||||
dnl Verify that the version of the pkg-config macros are at least
|
||||
dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's
|
||||
dnl installed version of pkg-config, this checks the developer's version
|
||||
dnl of pkg.m4 when generating configure.
|
||||
dnl
|
||||
dnl To ensure that this macro is defined, also add:
|
||||
dnl m4_ifndef([PKG_PREREQ],
|
||||
dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])])
|
||||
dnl
|
||||
dnl See the "Since" comment for each macro you use to see what version
|
||||
dnl of the macros you require.
|
||||
m4_defun([PKG_PREREQ],
|
||||
[m4_define([PKG_MACROS_VERSION], [0.29.2])
|
||||
m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1,
|
||||
[m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])])
|
||||
])dnl PKG_PREREQ
|
||||
|
||||
dnl PKG_PROG_PKG_CONFIG([MIN-VERSION])
|
||||
dnl ----------------------------------
|
||||
dnl Since: 0.16
|
||||
dnl
|
||||
dnl Search for the pkg-config tool and set the PKG_CONFIG variable to
|
||||
dnl first found in the path. Checks that the version of pkg-config found
|
||||
dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is
|
||||
dnl used since that's the first version where most current features of
|
||||
dnl pkg-config existed.
|
||||
AC_DEFUN([PKG_PROG_PKG_CONFIG],
|
||||
[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
|
||||
m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$])
|
||||
m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$])
|
||||
AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])
|
||||
AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path])
|
||||
AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path])
|
||||
|
||||
if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
|
||||
AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
|
||||
fi
|
||||
if test -n "$PKG_CONFIG"; then
|
||||
_pkg_min_version=m4_default([$1], [0.9.0])
|
||||
AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
|
||||
if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
|
||||
AC_MSG_RESULT([yes])
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
PKG_CONFIG=""
|
||||
fi
|
||||
fi[]dnl
|
||||
])dnl PKG_PROG_PKG_CONFIG
|
||||
|
||||
dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
|
||||
dnl -------------------------------------------------------------------
|
||||
dnl Since: 0.18
|
||||
dnl
|
||||
dnl Check to see whether a particular set of modules exists. Similar to
|
||||
dnl PKG_CHECK_MODULES(), but does not set variables or print errors.
|
||||
dnl
|
||||
dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG])
|
||||
dnl only at the first occurence in configure.ac, so if the first place
|
||||
dnl it's called might be skipped (such as if it is within an "if", you
|
||||
dnl have to call PKG_CHECK_EXISTS manually
|
||||
AC_DEFUN([PKG_CHECK_EXISTS],
|
||||
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
|
||||
if test -n "$PKG_CONFIG" && \
|
||||
AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
|
||||
m4_default([$2], [:])
|
||||
m4_ifvaln([$3], [else
|
||||
$3])dnl
|
||||
fi])
|
||||
|
||||
dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
|
||||
dnl ---------------------------------------------
|
||||
dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting
|
||||
dnl pkg_failed based on the result.
|
||||
m4_define([_PKG_CONFIG],
|
||||
[if test -n "$$1"; then
|
||||
pkg_cv_[]$1="$$1"
|
||||
elif test -n "$PKG_CONFIG"; then
|
||||
PKG_CHECK_EXISTS([$3],
|
||||
[pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`
|
||||
test "x$?" != "x0" && pkg_failed=yes ],
|
||||
[pkg_failed=yes])
|
||||
else
|
||||
pkg_failed=untried
|
||||
fi[]dnl
|
||||
])dnl _PKG_CONFIG
|
||||
|
||||
dnl _PKG_SHORT_ERRORS_SUPPORTED
|
||||
dnl ---------------------------
|
||||
dnl Internal check to see if pkg-config supports short errors.
|
||||
AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
|
||||
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
|
||||
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
||||
_pkg_short_errors_supported=yes
|
||||
else
|
||||
_pkg_short_errors_supported=no
|
||||
fi[]dnl
|
||||
])dnl _PKG_SHORT_ERRORS_SUPPORTED
|
||||
|
||||
|
||||
dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
|
||||
dnl [ACTION-IF-NOT-FOUND])
|
||||
dnl --------------------------------------------------------------
|
||||
dnl Since: 0.4.0
|
||||
dnl
|
||||
dnl Note that if there is a possibility the first call to
|
||||
dnl PKG_CHECK_MODULES might not happen, you should be sure to include an
|
||||
dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
|
||||
AC_DEFUN([PKG_CHECK_MODULES],
|
||||
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
|
||||
AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
|
||||
AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
|
||||
|
||||
pkg_failed=no
|
||||
AC_MSG_CHECKING([for $2])
|
||||
|
||||
_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
|
||||
_PKG_CONFIG([$1][_LIBS], [libs], [$2])
|
||||
|
||||
m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
|
||||
and $1[]_LIBS to avoid the need to call pkg-config.
|
||||
See the pkg-config man page for more details.])
|
||||
|
||||
if test $pkg_failed = yes; then
|
||||
AC_MSG_RESULT([no])
|
||||
_PKG_SHORT_ERRORS_SUPPORTED
|
||||
if test $_pkg_short_errors_supported = yes; then
|
||||
$1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1`
|
||||
else
|
||||
$1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1`
|
||||
fi
|
||||
# Put the nasty error message in config.log where it belongs
|
||||
echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
|
||||
|
||||
m4_default([$4], [AC_MSG_ERROR(
|
||||
[Package requirements ($2) were not met:
|
||||
|
||||
$$1_PKG_ERRORS
|
||||
|
||||
Consider adjusting the PKG_CONFIG_PATH environment variable if you
|
||||
installed software in a non-standard prefix.
|
||||
|
||||
_PKG_TEXT])[]dnl
|
||||
])
|
||||
elif test $pkg_failed = untried; then
|
||||
AC_MSG_RESULT([no])
|
||||
m4_default([$4], [AC_MSG_FAILURE(
|
||||
[The pkg-config script could not be found or is too old. Make sure it
|
||||
is in your PATH or set the PKG_CONFIG environment variable to the full
|
||||
path to pkg-config.
|
||||
|
||||
_PKG_TEXT
|
||||
|
||||
To get pkg-config, see <http://pkg-config.freedesktop.org/>.])[]dnl
|
||||
])
|
||||
else
|
||||
$1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
|
||||
$1[]_LIBS=$pkg_cv_[]$1[]_LIBS
|
||||
AC_MSG_RESULT([yes])
|
||||
$3
|
||||
fi[]dnl
|
||||
])dnl PKG_CHECK_MODULES
|
||||
|
||||
|
||||
dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
|
||||
dnl [ACTION-IF-NOT-FOUND])
|
||||
dnl ---------------------------------------------------------------------
|
||||
dnl Since: 0.29
|
||||
dnl
|
||||
dnl Checks for existence of MODULES and gathers its build flags with
|
||||
dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags
|
||||
dnl and VARIABLE-PREFIX_LIBS from --libs.
|
||||
dnl
|
||||
dnl Note that if there is a possibility the first call to
|
||||
dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to
|
||||
dnl include an explicit call to PKG_PROG_PKG_CONFIG in your
|
||||
dnl configure.ac.
|
||||
AC_DEFUN([PKG_CHECK_MODULES_STATIC],
|
||||
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
|
||||
_save_PKG_CONFIG=$PKG_CONFIG
|
||||
PKG_CONFIG="$PKG_CONFIG --static"
|
||||
PKG_CHECK_MODULES($@)
|
||||
PKG_CONFIG=$_save_PKG_CONFIG[]dnl
|
||||
])dnl PKG_CHECK_MODULES_STATIC
|
||||
|
||||
|
||||
dnl PKG_INSTALLDIR([DIRECTORY])
|
||||
dnl -------------------------
|
||||
dnl Since: 0.27
|
||||
dnl
|
||||
dnl Substitutes the variable pkgconfigdir as the location where a module
|
||||
dnl should install pkg-config .pc files. By default the directory is
|
||||
dnl $libdir/pkgconfig, but the default can be changed by passing
|
||||
dnl DIRECTORY. The user can override through the --with-pkgconfigdir
|
||||
dnl parameter.
|
||||
AC_DEFUN([PKG_INSTALLDIR],
|
||||
[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])])
|
||||
m4_pushdef([pkg_description],
|
||||
[pkg-config installation directory @<:@]pkg_default[@:>@])
|
||||
AC_ARG_WITH([pkgconfigdir],
|
||||
[AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],,
|
||||
[with_pkgconfigdir=]pkg_default)
|
||||
AC_SUBST([pkgconfigdir], [$with_pkgconfigdir])
|
||||
m4_popdef([pkg_default])
|
||||
m4_popdef([pkg_description])
|
||||
])dnl PKG_INSTALLDIR
|
||||
|
||||
|
||||
dnl PKG_NOARCH_INSTALLDIR([DIRECTORY])
|
||||
dnl --------------------------------
|
||||
dnl Since: 0.27
|
||||
dnl
|
||||
dnl Substitutes the variable noarch_pkgconfigdir as the location where a
|
||||
dnl module should install arch-independent pkg-config .pc files. By
|
||||
dnl default the directory is $datadir/pkgconfig, but the default can be
|
||||
dnl changed by passing DIRECTORY. The user can override through the
|
||||
dnl --with-noarch-pkgconfigdir parameter.
|
||||
AC_DEFUN([PKG_NOARCH_INSTALLDIR],
|
||||
[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])])
|
||||
m4_pushdef([pkg_description],
|
||||
[pkg-config arch-independent installation directory @<:@]pkg_default[@:>@])
|
||||
AC_ARG_WITH([noarch-pkgconfigdir],
|
||||
[AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],,
|
||||
[with_noarch_pkgconfigdir=]pkg_default)
|
||||
AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir])
|
||||
m4_popdef([pkg_default])
|
||||
m4_popdef([pkg_description])
|
||||
])dnl PKG_NOARCH_INSTALLDIR
|
||||
|
||||
|
||||
dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE,
|
||||
dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
|
||||
dnl -------------------------------------------
|
||||
dnl Since: 0.28
|
||||
dnl
|
||||
dnl Retrieves the value of the pkg-config variable for the given module.
|
||||
AC_DEFUN([PKG_CHECK_VAR],
|
||||
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
|
||||
AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl
|
||||
|
||||
_PKG_CONFIG([$1], [variable="][$3]["], [$2])
|
||||
AS_VAR_COPY([$1], [pkg_cv_][$1])
|
||||
|
||||
AS_VAR_IF([$1], [""], [$5], [$4])dnl
|
||||
])dnl PKG_CHECK_VAR
|
||||
|
||||
# Copyright (C) 2002-2020 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; the Free Software Foundation
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#! /bin/sh
|
||||
# Guess values for system-dependent variables and create Makefiles.
|
||||
# Generated by GNU Autoconf 2.69 for tinmop 0.4.2.
|
||||
# Generated by GNU Autoconf 2.69 for tinmop 0.5.0.
|
||||
#
|
||||
# Report bugs to <https://notabug.org/cage/tinmop/>.
|
||||
#
|
||||
|
@ -580,8 +580,8 @@ MAKEFLAGS=
|
|||
# Identity of this package.
|
||||
PACKAGE_NAME='tinmop'
|
||||
PACKAGE_TARNAME='tinmop'
|
||||
PACKAGE_VERSION='0.4.2'
|
||||
PACKAGE_STRING='tinmop 0.4.2'
|
||||
PACKAGE_VERSION='0.5.0'
|
||||
PACKAGE_STRING='tinmop 0.5.0'
|
||||
PACKAGE_BUGREPORT='https://notabug.org/cage/tinmop/'
|
||||
PACKAGE_URL=''
|
||||
|
||||
|
@ -597,6 +597,11 @@ BASH
|
|||
GPG
|
||||
CURL
|
||||
LISP_COMPILER
|
||||
IDN_LIBS
|
||||
IDN_CFLAGS
|
||||
PKG_CONFIG_LIBDIR
|
||||
PKG_CONFIG_PATH
|
||||
PKG_CONFIG
|
||||
POSUB
|
||||
LTLIBINTL
|
||||
LIBINTL
|
||||
|
@ -729,7 +734,12 @@ CFLAGS
|
|||
LDFLAGS
|
||||
LIBS
|
||||
CPPFLAGS
|
||||
CPP'
|
||||
CPP
|
||||
PKG_CONFIG
|
||||
PKG_CONFIG_PATH
|
||||
PKG_CONFIG_LIBDIR
|
||||
IDN_CFLAGS
|
||||
IDN_LIBS'
|
||||
|
||||
|
||||
# Initialize some variables set by options.
|
||||
|
@ -1280,7 +1290,7 @@ if test "$ac_init_help" = "long"; then
|
|||
# Omit some internal or obsolete options to make the list less imposing.
|
||||
# This message is too long to be a string in the A/UX 3.1 sh.
|
||||
cat <<_ACEOF
|
||||
\`configure' configures tinmop 0.4.2 to adapt to many kinds of systems.
|
||||
\`configure' configures tinmop 0.5.0 to adapt to many kinds of systems.
|
||||
|
||||
Usage: $0 [OPTION]... [VAR=VALUE]...
|
||||
|
||||
|
@ -1351,7 +1361,7 @@ fi
|
|||
|
||||
if test -n "$ac_init_help"; then
|
||||
case $ac_init_help in
|
||||
short | recursive ) echo "Configuration of tinmop 0.4.2:";;
|
||||
short | recursive ) echo "Configuration of tinmop 0.5.0:";;
|
||||
esac
|
||||
cat <<\_ACEOF
|
||||
|
||||
|
@ -1388,6 +1398,13 @@ Some influential environment variables:
|
|||
CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
|
||||
you have headers in a nonstandard directory <include dir>
|
||||
CPP C preprocessor
|
||||
PKG_CONFIG path to pkg-config utility
|
||||
PKG_CONFIG_PATH
|
||||
directories to add to pkg-config's search path
|
||||
PKG_CONFIG_LIBDIR
|
||||
path overriding pkg-config's built-in search path
|
||||
IDN_CFLAGS C compiler flags for IDN, overriding pkg-config
|
||||
IDN_LIBS linker flags for IDN, overriding pkg-config
|
||||
|
||||
Use these variables to override the choices made by `configure' or to help
|
||||
it to find libraries and programs with nonstandard names/locations.
|
||||
|
@ -1455,7 +1472,7 @@ fi
|
|||
test -n "$ac_init_help" && exit $ac_status
|
||||
if $ac_init_version; then
|
||||
cat <<\_ACEOF
|
||||
tinmop configure 0.4.2
|
||||
tinmop configure 0.5.0
|
||||
generated by GNU Autoconf 2.69
|
||||
|
||||
Copyright (C) 2012 Free Software Foundation, Inc.
|
||||
|
@ -1635,7 +1652,7 @@ cat >config.log <<_ACEOF
|
|||
This file contains any messages produced by compilers while
|
||||
running configure, to aid debugging if configure makes a mistake.
|
||||
|
||||
It was created by tinmop $as_me 0.4.2, which was
|
||||
It was created by tinmop $as_me 0.5.0, which was
|
||||
generated by GNU Autoconf 2.69. Invocation command line was
|
||||
|
||||
$ $0 $@
|
||||
|
@ -2500,7 +2517,7 @@ fi
|
|||
|
||||
# Define the identity of the package.
|
||||
PACKAGE='tinmop'
|
||||
VERSION='0.4.2'
|
||||
VERSION='0.5.0'
|
||||
|
||||
|
||||
cat >>confdefs.h <<_ACEOF
|
||||
|
@ -6131,53 +6148,217 @@ $as_echo "#define HAVE_DCGETTEXT 1" >>confdefs.h
|
|||
|
||||
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for idn2_to_ascii_8z in -lidn2" >&5
|
||||
$as_echo_n "checking for idn2_to_ascii_8z in -lidn2... " >&6; }
|
||||
if ${ac_cv_lib_idn2_idn2_to_ascii_8z+:} false; then :
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
|
||||
if test -n "$ac_tool_prefix"; then
|
||||
# Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
|
||||
set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
|
||||
$as_echo_n "checking for $ac_word... " >&6; }
|
||||
if ${ac_cv_path_PKG_CONFIG+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
ac_check_lib_save_LIBS=$LIBS
|
||||
LIBS="-lidn2 $LIBS"
|
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
case $PKG_CONFIG in
|
||||
[\\/]* | ?:[\\/]*)
|
||||
ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
|
||||
;;
|
||||
*)
|
||||
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
||||
for as_dir in $PATH
|
||||
do
|
||||
IFS=$as_save_IFS
|
||||
test -z "$as_dir" && as_dir=.
|
||||
for ac_exec_ext in '' $ac_executable_extensions; do
|
||||
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
|
||||
ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
|
||||
break 2
|
||||
fi
|
||||
done
|
||||
done
|
||||
IFS=$as_save_IFS
|
||||
|
||||
/* Override any GCC internal prototype to avoid an error.
|
||||
Use char because int might match the return type of a GCC
|
||||
builtin and then its argument prototype would still apply. */
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
#endif
|
||||
char idn2_to_ascii_8z ();
|
||||
int
|
||||
main ()
|
||||
{
|
||||
return idn2_to_ascii_8z ();
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
_ACEOF
|
||||
if ac_fn_c_try_link "$LINENO"; then :
|
||||
ac_cv_lib_idn2_idn2_to_ascii_8z=yes
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
PKG_CONFIG=$ac_cv_path_PKG_CONFIG
|
||||
if test -n "$PKG_CONFIG"; then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
|
||||
$as_echo "$PKG_CONFIG" >&6; }
|
||||
else
|
||||
ac_cv_lib_idn2_idn2_to_ascii_8z=no
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
$as_echo "no" >&6; }
|
||||
fi
|
||||
rm -f core conftest.err conftest.$ac_objext \
|
||||
conftest$ac_exeext conftest.$ac_ext
|
||||
LIBS=$ac_check_lib_save_LIBS
|
||||
|
||||
|
||||
fi
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_idn2_idn2_to_ascii_8z" >&5
|
||||
$as_echo "$ac_cv_lib_idn2_idn2_to_ascii_8z" >&6; }
|
||||
if test "x$ac_cv_lib_idn2_idn2_to_ascii_8z" = xyes; then :
|
||||
cat >>confdefs.h <<_ACEOF
|
||||
#define HAVE_LIBIDN2 1
|
||||
_ACEOF
|
||||
|
||||
LIBS="-lidn2 $LIBS"
|
||||
|
||||
if test -z "$ac_cv_path_PKG_CONFIG"; then
|
||||
ac_pt_PKG_CONFIG=$PKG_CONFIG
|
||||
# Extract the first word of "pkg-config", so it can be a program name with args.
|
||||
set dummy pkg-config; ac_word=$2
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
|
||||
$as_echo_n "checking for $ac_word... " >&6; }
|
||||
if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
as_fn_error $? "Can not this function find libidn2." "$LINENO" 5
|
||||
case $ac_pt_PKG_CONFIG in
|
||||
[\\/]* | ?:[\\/]*)
|
||||
ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
|
||||
;;
|
||||
*)
|
||||
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
||||
for as_dir in $PATH
|
||||
do
|
||||
IFS=$as_save_IFS
|
||||
test -z "$as_dir" && as_dir=.
|
||||
for ac_exec_ext in '' $ac_executable_extensions; do
|
||||
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
|
||||
ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
|
||||
break 2
|
||||
fi
|
||||
done
|
||||
done
|
||||
IFS=$as_save_IFS
|
||||
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
|
||||
if test -n "$ac_pt_PKG_CONFIG"; then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
|
||||
$as_echo "$ac_pt_PKG_CONFIG" >&6; }
|
||||
else
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
$as_echo "no" >&6; }
|
||||
fi
|
||||
|
||||
if test "x$ac_pt_PKG_CONFIG" = x; then
|
||||
PKG_CONFIG=""
|
||||
else
|
||||
case $cross_compiling:$ac_tool_warned in
|
||||
yes:)
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
|
||||
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
|
||||
ac_tool_warned=yes ;;
|
||||
esac
|
||||
PKG_CONFIG=$ac_pt_PKG_CONFIG
|
||||
fi
|
||||
else
|
||||
PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
|
||||
fi
|
||||
|
||||
fi
|
||||
if test -n "$PKG_CONFIG"; then
|
||||
_pkg_min_version=0.9.0
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
|
||||
$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
|
||||
if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||
$as_echo "yes" >&6; }
|
||||
else
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
$as_echo "no" >&6; }
|
||||
PKG_CONFIG=""
|
||||
fi
|
||||
fi
|
||||
|
||||
pkg_failed=no
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libidn2" >&5
|
||||
$as_echo_n "checking for libidn2... " >&6; }
|
||||
|
||||
if test -n "$IDN_CFLAGS"; then
|
||||
pkg_cv_IDN_CFLAGS="$IDN_CFLAGS"
|
||||
elif test -n "$PKG_CONFIG"; then
|
||||
if test -n "$PKG_CONFIG" && \
|
||||
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libidn2\""; } >&5
|
||||
($PKG_CONFIG --exists --print-errors "libidn2") 2>&5
|
||||
ac_status=$?
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||
test $ac_status = 0; }; then
|
||||
pkg_cv_IDN_CFLAGS=`$PKG_CONFIG --cflags "libidn2" 2>/dev/null`
|
||||
test "x$?" != "x0" && pkg_failed=yes
|
||||
else
|
||||
pkg_failed=yes
|
||||
fi
|
||||
else
|
||||
pkg_failed=untried
|
||||
fi
|
||||
if test -n "$IDN_LIBS"; then
|
||||
pkg_cv_IDN_LIBS="$IDN_LIBS"
|
||||
elif test -n "$PKG_CONFIG"; then
|
||||
if test -n "$PKG_CONFIG" && \
|
||||
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libidn2\""; } >&5
|
||||
($PKG_CONFIG --exists --print-errors "libidn2") 2>&5
|
||||
ac_status=$?
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||
test $ac_status = 0; }; then
|
||||
pkg_cv_IDN_LIBS=`$PKG_CONFIG --libs "libidn2" 2>/dev/null`
|
||||
test "x$?" != "x0" && pkg_failed=yes
|
||||
else
|
||||
pkg_failed=yes
|
||||
fi
|
||||
else
|
||||
pkg_failed=untried
|
||||
fi
|
||||
|
||||
|
||||
|
||||
if test $pkg_failed = yes; then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
$as_echo "no" >&6; }
|
||||
|
||||
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
||||
_pkg_short_errors_supported=yes
|
||||
else
|
||||
_pkg_short_errors_supported=no
|
||||
fi
|
||||
if test $_pkg_short_errors_supported = yes; then
|
||||
IDN_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libidn2" 2>&1`
|
||||
else
|
||||
IDN_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libidn2" 2>&1`
|
||||
fi
|
||||
# Put the nasty error message in config.log where it belongs
|
||||
echo "$IDN_PKG_ERRORS" >&5
|
||||
|
||||
as_fn_error $? "Package requirements (libidn2) were not met:
|
||||
|
||||
$IDN_PKG_ERRORS
|
||||
|
||||
Consider adjusting the PKG_CONFIG_PATH environment variable if you
|
||||
installed software in a non-standard prefix.
|
||||
|
||||
Alternatively, you may set the environment variables IDN_CFLAGS
|
||||
and IDN_LIBS to avoid the need to call pkg-config.
|
||||
See the pkg-config man page for more details." "$LINENO" 5
|
||||
elif test $pkg_failed = untried; then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
$as_echo "no" >&6; }
|
||||
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
|
||||
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
|
||||
as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it
|
||||
is in your PATH or set the PKG_CONFIG environment variable to the full
|
||||
path to pkg-config.
|
||||
|
||||
Alternatively, you may set the environment variables IDN_CFLAGS
|
||||
and IDN_LIBS to avoid the need to call pkg-config.
|
||||
See the pkg-config man page for more details.
|
||||
|
||||
To get pkg-config, see <http://pkg-config.freedesktop.org/>.
|
||||
See \`config.log' for more details" "$LINENO" 5; }
|
||||
else
|
||||
IDN_CFLAGS=$pkg_cv_IDN_CFLAGS
|
||||
IDN_LIBS=$pkg_cv_IDN_LIBS
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||
$as_echo "yes" >&6; }
|
||||
|
||||
fi
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SSL_get_version in -lssl" >&5
|
||||
$as_echo_n "checking for SSL_get_version in -lssl... " >&6; }
|
||||
|
@ -7162,7 +7343,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
|
|||
# report actual input values of CONFIG_FILES etc. instead of their
|
||||
# values after options handling.
|
||||
ac_log="
|
||||
This file was extended by tinmop $as_me 0.4.2, which was
|
||||
This file was extended by tinmop $as_me 0.5.0, which was
|
||||
generated by GNU Autoconf 2.69. Invocation command line was
|
||||
|
||||
CONFIG_FILES = $CONFIG_FILES
|
||||
|
@ -7219,7 +7400,7 @@ _ACEOF
|
|||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
||||
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
||||
ac_cs_version="\\
|
||||
tinmop config.status 0.4.2
|
||||
tinmop config.status 0.5.0
|
||||
configured by $0, generated by GNU Autoconf 2.69,
|
||||
with options \\"\$ac_cs_config\\"
|
||||
|
||||
|
|
|
@ -15,13 +15,13 @@ dnl You should have received a copy of the GNU General Public License
|
|||
dnl along with this program.
|
||||
dnl If not, see [[http://www.gnu.org/licenses/][http://www.gnu.org/licenses/]].
|
||||
|
||||
AC_INIT([tinmop],[0.4.2],[https://notabug.org/cage/tinmop/],[tinmop])
|
||||
AC_INIT([tinmop],[0.5.0],[https://notabug.org/cage/tinmop/],[tinmop])
|
||||
|
||||
AM_INIT_AUTOMAKE([-Wall foreign])
|
||||
|
||||
AM_GNU_GETTEXT([external])
|
||||
|
||||
AC_CHECK_LIB([idn2], [idn2_to_ascii_8z], [], AC_MSG_ERROR([Can not this function find libidn2.]))
|
||||
PKG_CHECK_MODULES([IDN], [libidn2])
|
||||
|
||||
AC_CHECK_LIB([ssl], [SSL_get_version], [], AC_MSG_ERROR([Can not find libssl.]))
|
||||
|
||||
|
|
|
@ -518,4 +518,10 @@ chats-list-window.input.selected.foreground = black
|
|||
|
||||
# actual chat window
|
||||
|
||||
chat-window.date-format.value = "[%hour:%min]"
|
||||
chat-window.date-format.value = "[%hour:%min]"
|
||||
|
||||
# gemlog subscriptions
|
||||
|
||||
gemini-subscription-window.background = black
|
||||
|
||||
gemini-subscription-window.foreground = cyan
|
||||
|
|
|
@ -145,6 +145,10 @@
|
|||
|
||||
(define-key "M-c" #'open-chats-list-window)
|
||||
|
||||
(define-key "M-g s o" #'gemini-open-gemlog-window)
|
||||
|
||||
(define-key "M-g s r" #'gemlog-refresh-all)
|
||||
|
||||
;; focus
|
||||
|
||||
(define-key "f1" #'focus-to-tags-window)
|
||||
|
@ -335,6 +339,8 @@
|
|||
|
||||
(define-key "r" #'gemini-refresh-page *gemini-message-keymap*)
|
||||
|
||||
(define-key "s" #'gemini-subscribe-gemlog *gemini-message-keymap*)
|
||||
|
||||
;; gemini stream window keymap
|
||||
|
||||
(define-key "a" #'gemini-abort-download *gemini-downloads-keymap*)
|
||||
|
@ -357,6 +363,18 @@
|
|||
|
||||
(define-key "C-J" #'gemini-delete-certificate *gemini-certificates-keymap*)
|
||||
|
||||
;; gemini subscription window
|
||||
|
||||
(define-key "C-J" #'show-gemlog-to-screen *gemlog-subscription-keymap*)
|
||||
|
||||
(define-key "up" #'gemlogs-subscription-go-up *gemlog-subscription-keymap*)
|
||||
|
||||
(define-key "down" #'gemlogs-subscription-go-down *gemlog-subscription-keymap*)
|
||||
|
||||
(define-key "q" #'close-gemlog-window *gemlog-subscription-keymap*)
|
||||
|
||||
(define-key "d" #'gemlog-cancel-subscription *gemlog-subscription-keymap*)
|
||||
|
||||
;; tags keymap
|
||||
|
||||
(define-key "up" #'tag-go-up *tags-keymap*)
|
||||
|
|
268
po/it.po
268
po/it.po
|
@ -8,8 +8,8 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: tinmop 0.0.1\n"
|
||||
"Report-Msgid-Bugs-To: https://notabug.org/cage/tinmop/\n"
|
||||
"POT-Creation-Date: 2021-01-06 11:46+0100\n"
|
||||
"PO-Revision-Date: 2020-12-31 19:21+0100\n"
|
||||
"POT-Creation-Date: 2021-01-10 13:02+0100\n"
|
||||
"PO-Revision-Date: 2021-01-10 13:04+0100\n"
|
||||
"Last-Translator: cage <cage@invalid.org>\n"
|
||||
"Language-Team: Italian\n"
|
||||
"Language: it\n"
|
||||
|
@ -169,7 +169,7 @@ msgstr "Opzioni diponibili"
|
|||
msgid "Error: command ~a not found"
|
||||
msgstr "Errore: comando ~a non trovato"
|
||||
|
||||
#: src/conditions.lisp:70 src/conditions.lisp:74 src/db.lisp:2671
|
||||
#: src/conditions.lisp:70 src/conditions.lisp:74 src/db.lisp:2718
|
||||
#: src/message-rendering-utils.lisp:156 src/message-rendering-utils.lisp:190
|
||||
#: src/message-rendering-utils.lisp:195
|
||||
msgid "unknown"
|
||||
|
@ -179,19 +179,19 @@ msgstr "sconosciuto"
|
|||
msgid "Conversations"
|
||||
msgstr "Conversazioni"
|
||||
|
||||
#: src/db.lisp:182
|
||||
#: src/db.lisp:188
|
||||
msgid "federated"
|
||||
msgstr "federata"
|
||||
|
||||
#: src/db.lisp:184
|
||||
#: src/db.lisp:190
|
||||
msgid "local"
|
||||
msgstr "locale"
|
||||
|
||||
#: src/db.lisp:186
|
||||
#: src/db.lisp:192
|
||||
msgid "direct"
|
||||
msgstr "diretta"
|
||||
|
||||
#: src/db.lisp:188
|
||||
#: src/db.lisp:194
|
||||
msgid "home"
|
||||
msgstr "home"
|
||||
|
||||
|
@ -260,59 +260,59 @@ msgstr "Visualizzo il sorgente di: ~a"
|
|||
msgid "Current gemini streams"
|
||||
msgstr "Flussi di dati gemini attuali"
|
||||
|
||||
#: src/gemini/client.lisp:161
|
||||
#: src/gemini/client.lisp:164
|
||||
#, lisp-format
|
||||
msgid "The server responded with the error ~a: ~a"
|
||||
msgstr "Il server ha risposto con l'errore ~a: ~a"
|
||||
|
||||
#: src/gemini/client.lisp:172
|
||||
#: src/gemini/client.lisp:175
|
||||
#, lisp-format
|
||||
msgid "The certificate of host ~a has changed from your latest visit."
|
||||
msgstr "Il certificato dell'host ~a è cambiato dall'ultima visita."
|
||||
|
||||
#: src/html-utils.lisp:108
|
||||
#: src/html-utils.lisp:118
|
||||
msgid "No address found"
|
||||
msgstr "nessun indirizzo trovato"
|
||||
|
||||
#: src/keybindings.lisp:417
|
||||
#: src/keybindings.lisp:420
|
||||
msgid "Enter"
|
||||
msgstr "Invio"
|
||||
|
||||
#: src/keybindings.lisp:419
|
||||
#: src/keybindings.lisp:422
|
||||
msgid "Delete"
|
||||
msgstr "Canc"
|
||||
|
||||
#: src/keybindings.lisp:421
|
||||
#: src/keybindings.lisp:424
|
||||
msgid "Page-up"
|
||||
msgstr "Pagina-su"
|
||||
|
||||
#: src/keybindings.lisp:423
|
||||
#: src/keybindings.lisp:426
|
||||
msgid "Page-down"
|
||||
msgstr "Pagina-giù"
|
||||
|
||||
#: src/keybindings.lisp:479
|
||||
#: src/keybindings.lisp:482
|
||||
msgid "No documentation available, you can help! :-)"
|
||||
msgstr "Nessuna documentazione disponbile, aiutaci! :-)"
|
||||
|
||||
#: src/keybindings.lisp:517
|
||||
#: src/keybindings.lisp:520
|
||||
msgid "Focused window keys"
|
||||
msgstr "Tasti finestra attiva"
|
||||
|
||||
#: src/keybindings.lisp:518
|
||||
#: src/keybindings.lisp:521
|
||||
msgid "Global keys"
|
||||
msgstr "Mappa tasti globale"
|
||||
|
||||
#: src/keybindings.lisp:537
|
||||
#: src/keybindings.lisp:540
|
||||
msgid "Quick help"
|
||||
msgstr "Aiuto rapido"
|
||||
|
||||
#: src/keybindings.lisp:539 src/line-oriented-window.lisp:258
|
||||
#: src/keybindings.lisp:542 src/line-oriented-window.lisp:261
|
||||
#: src/open-message-link-window.lisp:106 src/open-message-link-window.lisp:193
|
||||
#: src/program-events.lisp:441
|
||||
msgid "Invalid regular expression"
|
||||
msgstr "Espressione regolare non valida"
|
||||
|
||||
#: src/line-oriented-window.lisp:327 src/ui-goodies.lisp:103
|
||||
#: src/line-oriented-window.lisp:330 src/ui-goodies.lisp:103
|
||||
#: src/ui-goodies.lisp:120
|
||||
msgid "Information"
|
||||
msgstr "Informazione"
|
||||
|
@ -473,7 +473,21 @@ msgid_plural "Got ~a notifications"
|
|||
msgstr[0] "Hai ~a notifica"
|
||||
msgstr[1] "Hai ~a notifiche"
|
||||
|
||||
#: src/program-events.lisp:1239
|
||||
#: src/program-events.lisp:1149
|
||||
#, lisp-format
|
||||
msgid "Unable to subscribe to ~s"
|
||||
msgstr "Non posso abbonarmi a ~s: "
|
||||
|
||||
#: src/program-events.lisp:1194
|
||||
msgid "No subtitle"
|
||||
msgstr "Nessun sottotitolo"
|
||||
|
||||
#: src/program-events.lisp:1205
|
||||
#, lisp-format
|
||||
msgid "~a ~:[(not opened)~;(opened)~]~%"
|
||||
msgstr "~a ~:[(aperto)~;(non aperto)~]~%\""
|
||||
|
||||
#: src/program-events.lisp:1330
|
||||
msgid "no label"
|
||||
msgstr "nessuna etichetta"
|
||||
|
||||
|
@ -503,7 +517,7 @@ msgstr "Menzioni: "
|
|||
msgid "Subject: "
|
||||
msgstr "Oggetto del messaggio: "
|
||||
|
||||
#: src/software-configuration.lisp:531
|
||||
#: src/software-configuration.lisp:532
|
||||
msgid "This message was crypted."
|
||||
msgstr "Questo messaggion era cifrato."
|
||||
|
||||
|
@ -614,7 +628,7 @@ msgid "Jump to message: "
|
|||
msgstr "Vai al messaggio: "
|
||||
|
||||
#: src/ui-goodies.lisp:229 src/ui-goodies.lisp:253 src/ui-goodies.lisp:359
|
||||
#: src/ui-goodies.lisp:1101
|
||||
#: src/ui-goodies.lisp:1128
|
||||
msgid "Search key: "
|
||||
msgstr "Criterio di ricerca: "
|
||||
|
||||
|
@ -634,415 +648,433 @@ msgstr "Il focus e' cambiato"
|
|||
msgid "focus passed on threads window"
|
||||
msgstr "Il focus è passato alla finestra delle discussioni."
|
||||
|
||||
#: src/ui-goodies.lisp:406
|
||||
#: src/ui-goodies.lisp:408
|
||||
msgid "Focus passed on message window"
|
||||
msgstr "Il focus è passato alla finestra del messaggio."
|
||||
|
||||
#: src/ui-goodies.lisp:421
|
||||
#: src/ui-goodies.lisp:424
|
||||
msgid "Focus passed on send message window"
|
||||
msgstr "Il focus è passato alla finestra di spedizione dei messaggi."
|
||||
|
||||
#: src/ui-goodies.lisp:436
|
||||
#: src/ui-goodies.lisp:440
|
||||
msgid "Focus passed on follow requests window"
|
||||
msgstr "Il focus è passato alla finestra delle richieste di seguirti."
|
||||
|
||||
#: src/ui-goodies.lisp:451
|
||||
#: src/ui-goodies.lisp:456
|
||||
msgid "Focus passed on tags window"
|
||||
msgstr "Il focus è passato alla finestra delle sottoscrizioni."
|
||||
|
||||
#: src/ui-goodies.lisp:465
|
||||
#: src/ui-goodies.lisp:471
|
||||
msgid "Focus passed on conversation window"
|
||||
msgstr "Il focus è passato alla finestra delle conversazioni."
|
||||
|
||||
#: src/ui-goodies.lisp:480
|
||||
#: src/ui-goodies.lisp:487
|
||||
msgid "Focus passed on attach window"
|
||||
msgstr "Il focus è passato alla finestra degli allegati."
|
||||
|
||||
#: src/ui-goodies.lisp:495
|
||||
#: src/ui-goodies.lisp:503
|
||||
msgid "Focus passed on link window"
|
||||
msgstr "Il focus è passato alla finestra dei link."
|
||||
|
||||
#: src/ui-goodies.lisp:510
|
||||
#: src/ui-goodies.lisp:519
|
||||
msgid "Focus passed on gemini-stream window"
|
||||
msgstr "Il focus è passato alla finestra dei flussi di dati gemini."
|
||||
|
||||
#: src/ui-goodies.lisp:525
|
||||
#: src/ui-goodies.lisp:535
|
||||
msgid "Focus passed on chats list window"
|
||||
msgstr "Il focus è passato alla finestra delle chat."
|
||||
|
||||
#: src/ui-goodies.lisp:540
|
||||
#: src/ui-goodies.lisp:551
|
||||
msgid "Focus passed on TLS certificates window."
|
||||
msgstr "Il focus è passato alla finestra dei certificati TLS."
|
||||
|
||||
#: src/ui-goodies.lisp:562
|
||||
#: src/ui-goodies.lisp:566
|
||||
msgid "Focus passed on gemlog subscriptions window."
|
||||
msgstr "Il focus è passato alla finestra degli abbonamenti ai gemlog."
|
||||
|
||||
#: src/ui-goodies.lisp:589
|
||||
msgid "Search for commands (regexp): "
|
||||
msgstr "Cerca tra i comandi (espressione regolare):"
|
||||
|
||||
#: src/ui-goodies.lisp:573
|
||||
#: src/ui-goodies.lisp:600
|
||||
#, lisp-format
|
||||
msgid "Saving messages in ~s"
|
||||
msgstr "Salvo i messaggi in ~s"
|
||||
|
||||
#: src/ui-goodies.lisp:574
|
||||
#: src/ui-goodies.lisp:601
|
||||
#, lisp-format
|
||||
msgid "Saved message in ~s"
|
||||
msgstr "Salvati i messaggi in ~s"
|
||||
|
||||
#: src/ui-goodies.lisp:577 src/ui-goodies.lisp:595
|
||||
#: src/ui-goodies.lisp:604 src/ui-goodies.lisp:622
|
||||
msgid "No folder specified."
|
||||
msgstr "Nessuna cartella indicata."
|
||||
|
||||
#: src/ui-goodies.lisp:579
|
||||
#: src/ui-goodies.lisp:606
|
||||
msgid "Move to folder: "
|
||||
msgstr "Sposta nella cartella: "
|
||||
|
||||
#: src/ui-goodies.lisp:593
|
||||
#: src/ui-goodies.lisp:620
|
||||
#, lisp-format
|
||||
msgid "Folder ~s does not exists."
|
||||
msgstr "La cartella ~s non esiste."
|
||||
|
||||
#: src/ui-goodies.lisp:597
|
||||
#: src/ui-goodies.lisp:624
|
||||
msgid "Change folder: "
|
||||
msgstr "Spostati nella cartella: "
|
||||
|
||||
#: src/ui-goodies.lisp:608
|
||||
#: src/ui-goodies.lisp:635
|
||||
msgid "No timeline specified."
|
||||
msgstr "Nessuna timeline indicata."
|
||||
|
||||
#: src/ui-goodies.lisp:610
|
||||
#: src/ui-goodies.lisp:637
|
||||
msgid "This timeline is protected."
|
||||
msgstr "Questa timeline è protetta."
|
||||
|
||||
#: src/ui-goodies.lisp:614
|
||||
#: src/ui-goodies.lisp:641
|
||||
msgid "Change timeline: "
|
||||
msgstr "Spostati nella timeline: "
|
||||
|
||||
#: src/ui-goodies.lisp:630
|
||||
#: src/ui-goodies.lisp:657
|
||||
msgid "Downloading messages."
|
||||
msgstr "Scarico i messaggi."
|
||||
|
||||
#: src/ui-goodies.lisp:634 src/ui-goodies.lisp:727
|
||||
#: src/ui-goodies.lisp:661 src/ui-goodies.lisp:754
|
||||
msgid "Messages downloaded."
|
||||
msgstr "Messaggi scaricati"
|
||||
|
||||
#: src/ui-goodies.lisp:706
|
||||
#: src/ui-goodies.lisp:733
|
||||
msgid "Expanding thread"
|
||||
msgstr "Espandi l'albero dei messaggi"
|
||||
|
||||
#: src/ui-goodies.lisp:726
|
||||
#: src/ui-goodies.lisp:753
|
||||
msgid "Downloading tags messages."
|
||||
msgstr "Scarico i messaggi dell'etichetta."
|
||||
|
||||
#: src/ui-goodies.lisp:739
|
||||
#: src/ui-goodies.lisp:766
|
||||
msgid "Favorite this message?"
|
||||
msgstr "Conservare tra i favoriti questo messaggio?"
|
||||
|
||||
#: src/ui-goodies.lisp:748
|
||||
#: src/ui-goodies.lisp:775
|
||||
msgid "Favouring message."
|
||||
msgstr "Conservo il messaggio tra i favoriti."
|
||||
|
||||
#: src/ui-goodies.lisp:749
|
||||
#: src/ui-goodies.lisp:776
|
||||
msgid "Favoured message."
|
||||
msgstr "Messaggio conservato tra i favoriti."
|
||||
|
||||
#: src/ui-goodies.lisp:754
|
||||
#: src/ui-goodies.lisp:781
|
||||
msgid "Remove this message from your favourites?"
|
||||
msgstr "Rimuovere dai preferiti questo messaggio?"
|
||||
|
||||
#: src/ui-goodies.lisp:763
|
||||
#: src/ui-goodies.lisp:790
|
||||
msgid "Unfavouring message."
|
||||
msgstr "Rimuovo messaggio dai favoriti."
|
||||
|
||||
#: src/ui-goodies.lisp:764
|
||||
#: src/ui-goodies.lisp:791
|
||||
msgid "Unfavoured message."
|
||||
msgstr "Rimuosso messaggio dai favoriti."
|
||||
|
||||
#: src/ui-goodies.lisp:769
|
||||
#: src/ui-goodies.lisp:796
|
||||
msgid "Boost this message?"
|
||||
msgstr "Rilancia questo messaggio?"
|
||||
|
||||
#: src/ui-goodies.lisp:778
|
||||
#: src/ui-goodies.lisp:805
|
||||
msgid "Boosting message."
|
||||
msgstr "Rilancio il messaggio."
|
||||
|
||||
#: src/ui-goodies.lisp:779
|
||||
#: src/ui-goodies.lisp:806
|
||||
msgid "Boosted message."
|
||||
msgstr "Messaggio rilanciato."
|
||||
|
||||
#: src/ui-goodies.lisp:784
|
||||
#: src/ui-goodies.lisp:811
|
||||
msgid "Unboost this message?"
|
||||
msgstr "Ritira il rilancio del messaggio?"
|
||||
|
||||
#: src/ui-goodies.lisp:793
|
||||
#: src/ui-goodies.lisp:820
|
||||
msgid "Uboosting message."
|
||||
msgstr "Ritiro il rilancio del messaggio."
|
||||
|
||||
#: src/ui-goodies.lisp:794
|
||||
#: src/ui-goodies.lisp:821
|
||||
msgid "Unboosted message."
|
||||
msgstr "Ritirato il rilancio del messaggio."
|
||||
|
||||
#: src/ui-goodies.lisp:802
|
||||
#: src/ui-goodies.lisp:829
|
||||
#, lisp-format
|
||||
msgid "Ignore ~s?"
|
||||
msgstr "Ignorare ~s?"
|
||||
|
||||
#: src/ui-goodies.lisp:805
|
||||
#: src/ui-goodies.lisp:832
|
||||
#, lisp-format
|
||||
msgid "Ignoring ~s"
|
||||
msgstr "Ignoro ~s"
|
||||
|
||||
#: src/ui-goodies.lisp:806
|
||||
#: src/ui-goodies.lisp:833
|
||||
#, lisp-format
|
||||
msgid "User ~s ignored"
|
||||
msgstr "Utente ~s ignorato"
|
||||
|
||||
#: src/ui-goodies.lisp:816
|
||||
#: src/ui-goodies.lisp:843
|
||||
msgid "No username specified."
|
||||
msgstr "Nessun nome utente indicato."
|
||||
|
||||
#: src/ui-goodies.lisp:818
|
||||
#: src/ui-goodies.lisp:845
|
||||
msgid "Unignore username: "
|
||||
msgstr "Riprendere a leggere i messaggi di:"
|
||||
|
||||
#: src/ui-goodies.lisp:847
|
||||
#: src/ui-goodies.lisp:874
|
||||
#, lisp-format
|
||||
msgid "File ~s does not exists."
|
||||
msgstr "Il file ~s non esiste."
|
||||
|
||||
#: src/ui-goodies.lisp:849
|
||||
#: src/ui-goodies.lisp:876
|
||||
msgid "Message ready to be sent"
|
||||
msgstr "Messaggio pronto per essere spedito"
|
||||
|
||||
#: src/ui-goodies.lisp:851
|
||||
#: src/ui-goodies.lisp:878
|
||||
msgid "Add attachment: "
|
||||
msgstr "Aggiungi allegato: "
|
||||
|
||||
#: src/ui-goodies.lisp:861
|
||||
#: src/ui-goodies.lisp:888
|
||||
msgid "New subject: "
|
||||
msgstr "Nuovo oggetto del messaggio: "
|
||||
|
||||
#: src/ui-goodies.lisp:870
|
||||
#: src/ui-goodies.lisp:897
|
||||
msgid "New visibility: "
|
||||
msgstr "Nuovo livello di visibilità: "
|
||||
|
||||
#: src/ui-goodies.lisp:880
|
||||
#: src/ui-goodies.lisp:907
|
||||
msgid "Add mentions: "
|
||||
msgstr "Aggiungi menzione: "
|
||||
|
||||
#: src/ui-goodies.lisp:933
|
||||
#: src/ui-goodies.lisp:960
|
||||
#, lisp-format
|
||||
msgid "Your message is ~a character too long."
|
||||
msgid_plural "Your message is ~a characters too long."
|
||||
msgstr[0] "Il tuo messaggio e più lungo del limite ammesso di ~a carattere."
|
||||
msgstr[1] "Il tuo messaggio e più lungo del limite ammesso di ~a caratteri."
|
||||
|
||||
#: src/ui-goodies.lisp:957
|
||||
#: src/ui-goodies.lisp:984
|
||||
msgid "Add subject: "
|
||||
msgstr "Oggetto del messaggio: "
|
||||
|
||||
#: src/ui-goodies.lisp:1056
|
||||
#: src/ui-goodies.lisp:1083
|
||||
#, lisp-format
|
||||
msgid "The maximum allowed number of media is ~a."
|
||||
msgstr "Il numero massimo di file da allegare è ~a."
|
||||
|
||||
#: src/ui-goodies.lisp:1059
|
||||
#: src/ui-goodies.lisp:1086
|
||||
msgid "Sending message"
|
||||
msgstr "Spedisco il messaggio"
|
||||
|
||||
#: src/ui-goodies.lisp:1208
|
||||
#: src/ui-goodies.lisp:1235
|
||||
msgid "Delete this certificate? [Y/n] "
|
||||
msgstr "Cancella questo certificato? [s/N] "
|
||||
|
||||
#: src/ui-goodies.lisp:1227
|
||||
#: src/ui-goodies.lisp:1256
|
||||
#, lisp-format
|
||||
msgid "Canceling subscription for ~s"
|
||||
msgstr "Annullamento dell'abbonamento per ~s"
|
||||
|
||||
#: src/ui-goodies.lisp:1271
|
||||
msgid "updating gemlog's subscriptions"
|
||||
msgstr "Aggiornamento degli abbonamenti ai gemlog."
|
||||
|
||||
#: src/ui-goodies.lisp:1290
|
||||
msgid "Follow: "
|
||||
msgstr "Segui: "
|
||||
|
||||
#: src/ui-goodies.lisp:1230
|
||||
#: src/ui-goodies.lisp:1293
|
||||
#, lisp-format
|
||||
msgid "Following ~a"
|
||||
msgstr "Segui ~a"
|
||||
|
||||
#: src/ui-goodies.lisp:1231
|
||||
#: src/ui-goodies.lisp:1294
|
||||
#, lisp-format
|
||||
msgid "Followed ~a"
|
||||
msgstr "Adesso segui ~a "
|
||||
|
||||
#: src/ui-goodies.lisp:1235
|
||||
#: src/ui-goodies.lisp:1298
|
||||
msgid "Unfollow: "
|
||||
msgstr "Abbandona: "
|
||||
|
||||
#: src/ui-goodies.lisp:1238
|
||||
#: src/ui-goodies.lisp:1301
|
||||
#, lisp-format
|
||||
msgid "Unfollowing ~a"
|
||||
msgstr "Abbandona ~a"
|
||||
|
||||
#: src/ui-goodies.lisp:1239
|
||||
#: src/ui-goodies.lisp:1302
|
||||
#, lisp-format
|
||||
msgid "Unfollowed ~a"
|
||||
msgstr "Hai abbandonato ~a"
|
||||
|
||||
#: src/ui-goodies.lisp:1268
|
||||
#: src/ui-goodies.lisp:1331
|
||||
msgid "Confirm operation?"
|
||||
msgstr "Confermi l'operazione?"
|
||||
|
||||
#: src/ui-goodies.lisp:1306
|
||||
#: src/ui-goodies.lisp:1369
|
||||
msgid "Updating conversations."
|
||||
msgstr "Aggiorno le conversazioni"
|
||||
|
||||
#: src/ui-goodies.lisp:1307
|
||||
#: src/ui-goodies.lisp:1370
|
||||
msgid "Conversations updated."
|
||||
msgstr "Conversazioni aggiornate"
|
||||
|
||||
#: src/ui-goodies.lisp:1317
|
||||
#: src/ui-goodies.lisp:1380
|
||||
msgid "Open conversation: "
|
||||
msgstr "Apri una conversazione: "
|
||||
|
||||
#: src/ui-goodies.lisp:1352
|
||||
#: src/ui-goodies.lisp:1415
|
||||
msgid "Old name: "
|
||||
msgstr "Nome precedente: "
|
||||
|
||||
#: src/ui-goodies.lisp:1366
|
||||
#: src/ui-goodies.lisp:1429
|
||||
#, lisp-format
|
||||
msgid "A conversation with name ~a already exists."
|
||||
msgstr "Una conversazione con nome ~a esiste già."
|
||||
|
||||
#: src/ui-goodies.lisp:1372
|
||||
#: src/ui-goodies.lisp:1435
|
||||
msgid "New name: "
|
||||
msgstr "Nuovo nome: "
|
||||
|
||||
#: src/ui-goodies.lisp:1388
|
||||
#: src/ui-goodies.lisp:1451
|
||||
#, lisp-format
|
||||
msgid "Ignore conversation ~s? [y/N] "
|
||||
msgstr "Ignorare la conversazione ~s? [s/N] "
|
||||
|
||||
#: src/ui-goodies.lisp:1404
|
||||
#: src/ui-goodies.lisp:1467
|
||||
#, lisp-format
|
||||
msgid "Delete conversation ~s? [y/N] "
|
||||
msgstr "Eliminare la conversazione ~s? [s/N] "
|
||||
|
||||
#: src/ui-goodies.lisp:1423
|
||||
#: src/ui-goodies.lisp:1486
|
||||
#, lisp-format
|
||||
msgid "Comment too long by ~a character"
|
||||
msgid_plural "Comment too long by ~a characters"
|
||||
msgstr[0] "Il commento è troppo lungo di ~a caratteri"
|
||||
msgstr[1] "Il commento è troppo lungo di ~a caratteri"
|
||||
|
||||
#: src/ui-goodies.lisp:1430
|
||||
#: src/ui-goodies.lisp:1493
|
||||
#, lisp-format
|
||||
msgid "Reporting user: ~s"
|
||||
msgstr "Segnalo l'utente ~s"
|
||||
|
||||
#: src/ui-goodies.lisp:1431
|
||||
#: src/ui-goodies.lisp:1494
|
||||
msgid "Report trasmitted."
|
||||
msgstr "Segnalazione trasmessa."
|
||||
|
||||
#: src/ui-goodies.lisp:1434
|
||||
#: src/ui-goodies.lisp:1497
|
||||
msgid "Comment on reports: "
|
||||
msgstr "Commento sulla segnalazione: "
|
||||
|
||||
#: src/ui-goodies.lisp:1450 src/ui-goodies.lisp:1483 src/ui-goodies.lisp:1501
|
||||
#: src/ui-goodies.lisp:1513 src/ui-goodies.lisp:1546 src/ui-goodies.lisp:1564
|
||||
#, lisp-format
|
||||
msgid "User ~s does not exists in database"
|
||||
msgstr "L'utente ~s non esiste nel database"
|
||||
|
||||
#: src/ui-goodies.lisp:1453 src/ui-goodies.lisp:1486 src/ui-goodies.lisp:1504
|
||||
#: src/ui-goodies.lisp:1516 src/ui-goodies.lisp:1549 src/ui-goodies.lisp:1567
|
||||
msgid "Username: "
|
||||
msgstr "Nome utente: "
|
||||
|
||||
#: src/ui-goodies.lisp:1463
|
||||
#: src/ui-goodies.lisp:1526
|
||||
#, lisp-format
|
||||
msgid "Added crypto key for user ~s"
|
||||
msgstr "Aggiunta chiave crittografica per l'utente ~s"
|
||||
|
||||
#: src/ui-goodies.lisp:1466
|
||||
#: src/ui-goodies.lisp:1529
|
||||
msgid "Key: "
|
||||
msgstr "Chiave: "
|
||||
|
||||
#: src/ui-goodies.lisp:1480
|
||||
#: src/ui-goodies.lisp:1543
|
||||
#, lisp-format
|
||||
msgid "Generated key for user ~s"
|
||||
msgstr "Generata chiave crittografica per l'utente ~s"
|
||||
|
||||
#: src/ui-goodies.lisp:1481
|
||||
#: src/ui-goodies.lisp:1544
|
||||
#, lisp-format
|
||||
msgid "user ~s key ~s"
|
||||
msgstr "utente ~s chiave ~s"
|
||||
|
||||
#: src/ui-goodies.lisp:1497
|
||||
#: src/ui-goodies.lisp:1560
|
||||
#, lisp-format
|
||||
msgid "Added key for user ~s: ~a"
|
||||
msgstr "Aggiunta chiave crittografica per l'utente ~s: ~a"
|
||||
|
||||
#: src/ui-goodies.lisp:1514
|
||||
#: src/ui-goodies.lisp:1577
|
||||
msgid "About this software"
|
||||
msgstr "Sul programma"
|
||||
|
||||
#: src/ui-goodies.lisp:1526
|
||||
#: src/ui-goodies.lisp:1589
|
||||
msgid "Clearing pagination data"
|
||||
msgstr "Elimina i dati della paginazione"
|
||||
|
||||
#: src/ui-goodies.lisp:1545
|
||||
#: src/ui-goodies.lisp:1608
|
||||
msgid "Invalid choices, usa a space separated list of positive integers."
|
||||
msgstr ""
|
||||
"Il formato ammesso è costituito da una lista di interi positivi separati da "
|
||||
"spazi."
|
||||
|
||||
#: src/ui-goodies.lisp:1562
|
||||
#: src/ui-goodies.lisp:1625
|
||||
#, lisp-format
|
||||
msgid "Invalid choices, index choice out of range (max ~a)."
|
||||
msgstr "Intervallo dei valori delle scelte non valido (massimo ~a)."
|
||||
|
||||
#: src/ui-goodies.lisp:1564
|
||||
#: src/ui-goodies.lisp:1627
|
||||
msgid "Voting... "
|
||||
msgstr "Votazione in corso..."
|
||||
|
||||
#: src/ui-goodies.lisp:1565
|
||||
#: src/ui-goodies.lisp:1628
|
||||
msgid "Choice sent."
|
||||
msgstr "Voto inserito."
|
||||
|
||||
#: src/ui-goodies.lisp:1574
|
||||
#: src/ui-goodies.lisp:1637
|
||||
msgid "Type the index (or space separated indices) of selected choices: "
|
||||
msgstr "Inserisci gli indici associati alle opzioni separati da spazi: "
|
||||
|
||||
#: src/ui-goodies.lisp:1575
|
||||
#: src/ui-goodies.lisp:1638
|
||||
msgid "This in not a poll"
|
||||
msgstr "Questo messaggio non è un sondaggio."
|
||||
|
||||
#: src/ui-goodies.lisp:1643
|
||||
#: src/ui-goodies.lisp:1706
|
||||
msgid "Add message (enter to quit): "
|
||||
msgstr "Aggiungi un messaggio (invio per abbandonare): "
|
||||
|
||||
#: src/ui-goodies.lisp:1668 src/ui-goodies.lisp:1681
|
||||
#: src/ui-goodies.lisp:1731 src/ui-goodies.lisp:1744
|
||||
msgid "Type the new label of the chat: "
|
||||
msgstr "Digita la nuova etichetta della chat: "
|
||||
|
||||
#: src/ui-goodies.lisp:1689
|
||||
#: src/ui-goodies.lisp:1752
|
||||
#, lisp-format
|
||||
msgid "Chat ~a with ~a created"
|
||||
msgstr "Chat ~a con ~a creata"
|
||||
|
||||
#: src/ui-goodies.lisp:1693
|
||||
#: src/ui-goodies.lisp:1756
|
||||
msgid "Type the user to chat with: "
|
||||
msgstr "Digita l'utente con cui vuoi iniziare una chat: "
|
||||
|
||||
#: src/ui-goodies.lisp:1720
|
||||
#: src/ui-goodies.lisp:1783
|
||||
msgid "This is not a valid gemini address"
|
||||
msgstr "Questo non è un indirizzo gemini valido"
|
||||
|
||||
#: src/ui-goodies.lisp:1721
|
||||
#: src/ui-goodies.lisp:1784
|
||||
msgid "Open Gemini url: "
|
||||
msgstr "Apri un indirizzo gemini: "
|
||||
|
||||
#: src/ui-goodies.lisp:1794 src/ui-goodies.lisp:1807
|
||||
#: src/ui-goodies.lisp:1870
|
||||
#, lisp-format
|
||||
msgid "Subscribing to ~s"
|
||||
msgstr "Abbonati a ~s: "
|
||||
|
||||
#: src/ui-goodies.lisp:1883 src/ui-goodies.lisp:1896
|
||||
#, lisp-format
|
||||
msgid "Command ~s completed"
|
||||
msgstr "Comando ~s completato"
|
||||
|
||||
#: src/ui-goodies.lisp:1796
|
||||
#: src/ui-goodies.lisp:1885
|
||||
msgid "Send to command: "
|
||||
msgstr "Manda al comando: "
|
||||
|
||||
#: src/ui-goodies.lisp:1809
|
||||
#: src/ui-goodies.lisp:1898
|
||||
msgid "Send message to command: "
|
||||
msgstr "Manda il messaggio al comando: "
|
||||
|
||||
|
|
266
po/tinmop.pot
266
po/tinmop.pot
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: tinmop 0.4.2\n"
|
||||
"Report-Msgid-Bugs-To: https://notabug.org/cage/tinmop/\n"
|
||||
"POT-Creation-Date: 2021-01-06 11:46+0100\n"
|
||||
"POT-Creation-Date: 2021-01-10 13:02+0100\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
@ -165,7 +165,7 @@ msgstr ""
|
|||
msgid "Error: command ~a not found"
|
||||
msgstr ""
|
||||
|
||||
#: src/conditions.lisp:70 src/conditions.lisp:74 src/db.lisp:2671
|
||||
#: src/conditions.lisp:70 src/conditions.lisp:74 src/db.lisp:2718
|
||||
#: src/message-rendering-utils.lisp:156 src/message-rendering-utils.lisp:190
|
||||
#: src/message-rendering-utils.lisp:195
|
||||
msgid "unknown"
|
||||
|
@ -175,19 +175,19 @@ msgstr ""
|
|||
msgid "Conversations"
|
||||
msgstr ""
|
||||
|
||||
#: src/db.lisp:182
|
||||
#: src/db.lisp:188
|
||||
msgid "federated"
|
||||
msgstr ""
|
||||
|
||||
#: src/db.lisp:184
|
||||
#: src/db.lisp:190
|
||||
msgid "local"
|
||||
msgstr ""
|
||||
|
||||
#: src/db.lisp:186
|
||||
#: src/db.lisp:192
|
||||
msgid "direct"
|
||||
msgstr ""
|
||||
|
||||
#: src/db.lisp:188
|
||||
#: src/db.lisp:194
|
||||
msgid "home"
|
||||
msgstr ""
|
||||
|
||||
|
@ -251,59 +251,59 @@ msgstr ""
|
|||
msgid "Current gemini streams"
|
||||
msgstr ""
|
||||
|
||||
#: src/gemini/client.lisp:161
|
||||
#: src/gemini/client.lisp:164
|
||||
#, lisp-format
|
||||
msgid "The server responded with the error ~a: ~a"
|
||||
msgstr ""
|
||||
|
||||
#: src/gemini/client.lisp:172
|
||||
#: src/gemini/client.lisp:175
|
||||
#, lisp-format
|
||||
msgid "The certificate of host ~a has changed from your latest visit."
|
||||
msgstr ""
|
||||
|
||||
#: src/html-utils.lisp:108
|
||||
#: src/html-utils.lisp:118
|
||||
msgid "No address found"
|
||||
msgstr ""
|
||||
|
||||
#: src/keybindings.lisp:417
|
||||
#: src/keybindings.lisp:420
|
||||
msgid "Enter"
|
||||
msgstr ""
|
||||
|
||||
#: src/keybindings.lisp:419
|
||||
#: src/keybindings.lisp:422
|
||||
msgid "Delete"
|
||||
msgstr ""
|
||||
|
||||
#: src/keybindings.lisp:421
|
||||
#: src/keybindings.lisp:424
|
||||
msgid "Page-up"
|
||||
msgstr ""
|
||||
|
||||
#: src/keybindings.lisp:423
|
||||
#: src/keybindings.lisp:426
|
||||
msgid "Page-down"
|
||||
msgstr ""
|
||||
|
||||
#: src/keybindings.lisp:479
|
||||
#: src/keybindings.lisp:482
|
||||
msgid "No documentation available, you can help! :-)"
|
||||
msgstr ""
|
||||
|
||||
#: src/keybindings.lisp:517
|
||||
#: src/keybindings.lisp:520
|
||||
msgid "Focused window keys"
|
||||
msgstr ""
|
||||
|
||||
#: src/keybindings.lisp:518
|
||||
#: src/keybindings.lisp:521
|
||||
msgid "Global keys"
|
||||
msgstr ""
|
||||
|
||||
#: src/keybindings.lisp:537
|
||||
#: src/keybindings.lisp:540
|
||||
msgid "Quick help"
|
||||
msgstr ""
|
||||
|
||||
#: src/keybindings.lisp:539 src/line-oriented-window.lisp:258
|
||||
#: src/keybindings.lisp:542 src/line-oriented-window.lisp:261
|
||||
#: src/open-message-link-window.lisp:106 src/open-message-link-window.lisp:193
|
||||
#: src/program-events.lisp:441
|
||||
msgid "Invalid regular expression"
|
||||
msgstr ""
|
||||
|
||||
#: src/line-oriented-window.lisp:327 src/ui-goodies.lisp:103
|
||||
#: src/line-oriented-window.lisp:330 src/ui-goodies.lisp:103
|
||||
#: src/ui-goodies.lisp:120
|
||||
msgid "Information"
|
||||
msgstr ""
|
||||
|
@ -460,7 +460,21 @@ msgid_plural "Got ~a notifications"
|
|||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: src/program-events.lisp:1239
|
||||
#: src/program-events.lisp:1149
|
||||
#, lisp-format
|
||||
msgid "Unable to subscribe to ~s"
|
||||
msgstr ""
|
||||
|
||||
#: src/program-events.lisp:1194
|
||||
msgid "No subtitle"
|
||||
msgstr ""
|
||||
|
||||
#: src/program-events.lisp:1205
|
||||
#, lisp-format
|
||||
msgid "~a ~:[(not opened)~;(opened)~]~%"
|
||||
msgstr ""
|
||||
|
||||
#: src/program-events.lisp:1330
|
||||
msgid "no label"
|
||||
msgstr ""
|
||||
|
||||
|
@ -490,7 +504,7 @@ msgstr ""
|
|||
msgid "Subject: "
|
||||
msgstr ""
|
||||
|
||||
#: src/software-configuration.lisp:531
|
||||
#: src/software-configuration.lisp:532
|
||||
msgid "This message was crypted."
|
||||
msgstr ""
|
||||
|
||||
|
@ -599,7 +613,7 @@ msgid "Jump to message: "
|
|||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:229 src/ui-goodies.lisp:253 src/ui-goodies.lisp:359
|
||||
#: src/ui-goodies.lisp:1101
|
||||
#: src/ui-goodies.lisp:1128
|
||||
msgid "Search key: "
|
||||
msgstr ""
|
||||
|
||||
|
@ -619,413 +633,431 @@ msgstr ""
|
|||
msgid "focus passed on threads window"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:406
|
||||
#: src/ui-goodies.lisp:408
|
||||
msgid "Focus passed on message window"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:421
|
||||
#: src/ui-goodies.lisp:424
|
||||
msgid "Focus passed on send message window"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:436
|
||||
#: src/ui-goodies.lisp:440
|
||||
msgid "Focus passed on follow requests window"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:451
|
||||
#: src/ui-goodies.lisp:456
|
||||
msgid "Focus passed on tags window"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:465
|
||||
#: src/ui-goodies.lisp:471
|
||||
msgid "Focus passed on conversation window"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:480
|
||||
#: src/ui-goodies.lisp:487
|
||||
msgid "Focus passed on attach window"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:495
|
||||
#: src/ui-goodies.lisp:503
|
||||
msgid "Focus passed on link window"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:510
|
||||
#: src/ui-goodies.lisp:519
|
||||
msgid "Focus passed on gemini-stream window"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:525
|
||||
#: src/ui-goodies.lisp:535
|
||||
msgid "Focus passed on chats list window"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:540
|
||||
#: src/ui-goodies.lisp:551
|
||||
msgid "Focus passed on TLS certificates window."
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:562
|
||||
#: src/ui-goodies.lisp:566
|
||||
msgid "Focus passed on gemlog subscriptions window."
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:589
|
||||
msgid "Search for commands (regexp): "
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:573
|
||||
#: src/ui-goodies.lisp:600
|
||||
#, lisp-format
|
||||
msgid "Saving messages in ~s"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:574
|
||||
#: src/ui-goodies.lisp:601
|
||||
#, lisp-format
|
||||
msgid "Saved message in ~s"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:577 src/ui-goodies.lisp:595
|
||||
#: src/ui-goodies.lisp:604 src/ui-goodies.lisp:622
|
||||
msgid "No folder specified."
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:579
|
||||
#: src/ui-goodies.lisp:606
|
||||
msgid "Move to folder: "
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:593
|
||||
#: src/ui-goodies.lisp:620
|
||||
#, lisp-format
|
||||
msgid "Folder ~s does not exists."
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:597
|
||||
#: src/ui-goodies.lisp:624
|
||||
msgid "Change folder: "
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:608
|
||||
#: src/ui-goodies.lisp:635
|
||||
msgid "No timeline specified."
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:610
|
||||
#: src/ui-goodies.lisp:637
|
||||
msgid "This timeline is protected."
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:614
|
||||
#: src/ui-goodies.lisp:641
|
||||
msgid "Change timeline: "
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:630
|
||||
#: src/ui-goodies.lisp:657
|
||||
msgid "Downloading messages."
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:634 src/ui-goodies.lisp:727
|
||||
#: src/ui-goodies.lisp:661 src/ui-goodies.lisp:754
|
||||
msgid "Messages downloaded."
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:706
|
||||
#: src/ui-goodies.lisp:733
|
||||
msgid "Expanding thread"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:726
|
||||
#: src/ui-goodies.lisp:753
|
||||
msgid "Downloading tags messages."
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:739
|
||||
#: src/ui-goodies.lisp:766
|
||||
msgid "Favorite this message?"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:748
|
||||
#: src/ui-goodies.lisp:775
|
||||
msgid "Favouring message."
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:749
|
||||
#: src/ui-goodies.lisp:776
|
||||
msgid "Favoured message."
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:754
|
||||
#: src/ui-goodies.lisp:781
|
||||
msgid "Remove this message from your favourites?"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:763
|
||||
#: src/ui-goodies.lisp:790
|
||||
msgid "Unfavouring message."
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:764
|
||||
#: src/ui-goodies.lisp:791
|
||||
msgid "Unfavoured message."
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:769
|
||||
#: src/ui-goodies.lisp:796
|
||||
msgid "Boost this message?"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:778
|
||||
#: src/ui-goodies.lisp:805
|
||||
msgid "Boosting message."
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:779
|
||||
#: src/ui-goodies.lisp:806
|
||||
msgid "Boosted message."
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:784
|
||||
#: src/ui-goodies.lisp:811
|
||||
msgid "Unboost this message?"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:793
|
||||
#: src/ui-goodies.lisp:820
|
||||
msgid "Uboosting message."
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:794
|
||||
#: src/ui-goodies.lisp:821
|
||||
msgid "Unboosted message."
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:802
|
||||
#: src/ui-goodies.lisp:829
|
||||
#, lisp-format
|
||||
msgid "Ignore ~s?"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:805
|
||||
#: src/ui-goodies.lisp:832
|
||||
#, lisp-format
|
||||
msgid "Ignoring ~s"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:806
|
||||
#: src/ui-goodies.lisp:833
|
||||
#, lisp-format
|
||||
msgid "User ~s ignored"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:816
|
||||
#: src/ui-goodies.lisp:843
|
||||
msgid "No username specified."
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:818
|
||||
#: src/ui-goodies.lisp:845
|
||||
msgid "Unignore username: "
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:847
|
||||
#: src/ui-goodies.lisp:874
|
||||
#, lisp-format
|
||||
msgid "File ~s does not exists."
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:849
|
||||
#: src/ui-goodies.lisp:876
|
||||
msgid "Message ready to be sent"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:851
|
||||
#: src/ui-goodies.lisp:878
|
||||
msgid "Add attachment: "
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:861
|
||||
#: src/ui-goodies.lisp:888
|
||||
msgid "New subject: "
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:870
|
||||
#: src/ui-goodies.lisp:897
|
||||
msgid "New visibility: "
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:880
|
||||
#: src/ui-goodies.lisp:907
|
||||
msgid "Add mentions: "
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:933
|
||||
#: src/ui-goodies.lisp:960
|
||||
#, lisp-format
|
||||
msgid "Your message is ~a character too long."
|
||||
msgid_plural "Your message is ~a characters too long."
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: src/ui-goodies.lisp:957
|
||||
#: src/ui-goodies.lisp:984
|
||||
msgid "Add subject: "
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1056
|
||||
#: src/ui-goodies.lisp:1083
|
||||
#, lisp-format
|
||||
msgid "The maximum allowed number of media is ~a."
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1059
|
||||
#: src/ui-goodies.lisp:1086
|
||||
msgid "Sending message"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1208
|
||||
#: src/ui-goodies.lisp:1235
|
||||
msgid "Delete this certificate? [Y/n] "
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1227
|
||||
#: src/ui-goodies.lisp:1256
|
||||
#, lisp-format
|
||||
msgid "Canceling subscription for ~s"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1271
|
||||
msgid "updating gemlog's subscriptions"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1290
|
||||
msgid "Follow: "
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1230
|
||||
#: src/ui-goodies.lisp:1293
|
||||
#, lisp-format
|
||||
msgid "Following ~a"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1231
|
||||
#: src/ui-goodies.lisp:1294
|
||||
#, lisp-format
|
||||
msgid "Followed ~a"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1235
|
||||
#: src/ui-goodies.lisp:1298
|
||||
msgid "Unfollow: "
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1238
|
||||
#: src/ui-goodies.lisp:1301
|
||||
#, lisp-format
|
||||
msgid "Unfollowing ~a"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1239
|
||||
#: src/ui-goodies.lisp:1302
|
||||
#, lisp-format
|
||||
msgid "Unfollowed ~a"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1268
|
||||
#: src/ui-goodies.lisp:1331
|
||||
msgid "Confirm operation?"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1306
|
||||
#: src/ui-goodies.lisp:1369
|
||||
msgid "Updating conversations."
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1307
|
||||
#: src/ui-goodies.lisp:1370
|
||||
msgid "Conversations updated."
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1317
|
||||
#: src/ui-goodies.lisp:1380
|
||||
msgid "Open conversation: "
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1352
|
||||
#: src/ui-goodies.lisp:1415
|
||||
msgid "Old name: "
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1366
|
||||
#: src/ui-goodies.lisp:1429
|
||||
#, lisp-format
|
||||
msgid "A conversation with name ~a already exists."
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1372
|
||||
#: src/ui-goodies.lisp:1435
|
||||
msgid "New name: "
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1388
|
||||
#: src/ui-goodies.lisp:1451
|
||||
#, lisp-format
|
||||
msgid "Ignore conversation ~s? [y/N] "
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1404
|
||||
#: src/ui-goodies.lisp:1467
|
||||
#, lisp-format
|
||||
msgid "Delete conversation ~s? [y/N] "
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1423
|
||||
#: src/ui-goodies.lisp:1486
|
||||
#, lisp-format
|
||||
msgid "Comment too long by ~a character"
|
||||
msgid_plural "Comment too long by ~a characters"
|
||||
msgstr[0] ""
|
||||
msgstr[1] ""
|
||||
|
||||
#: src/ui-goodies.lisp:1430
|
||||
#: src/ui-goodies.lisp:1493
|
||||
#, lisp-format
|
||||
msgid "Reporting user: ~s"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1431
|
||||
#: src/ui-goodies.lisp:1494
|
||||
msgid "Report trasmitted."
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1434
|
||||
#: src/ui-goodies.lisp:1497
|
||||
msgid "Comment on reports: "
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1450 src/ui-goodies.lisp:1483 src/ui-goodies.lisp:1501
|
||||
#: src/ui-goodies.lisp:1513 src/ui-goodies.lisp:1546 src/ui-goodies.lisp:1564
|
||||
#, lisp-format
|
||||
msgid "User ~s does not exists in database"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1453 src/ui-goodies.lisp:1486 src/ui-goodies.lisp:1504
|
||||
#: src/ui-goodies.lisp:1516 src/ui-goodies.lisp:1549 src/ui-goodies.lisp:1567
|
||||
msgid "Username: "
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1463
|
||||
#: src/ui-goodies.lisp:1526
|
||||
#, lisp-format
|
||||
msgid "Added crypto key for user ~s"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1466
|
||||
#: src/ui-goodies.lisp:1529
|
||||
msgid "Key: "
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1480
|
||||
#: src/ui-goodies.lisp:1543
|
||||
#, lisp-format
|
||||
msgid "Generated key for user ~s"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1481
|
||||
#: src/ui-goodies.lisp:1544
|
||||
#, lisp-format
|
||||
msgid "user ~s key ~s"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1497
|
||||
#: src/ui-goodies.lisp:1560
|
||||
#, lisp-format
|
||||
msgid "Added key for user ~s: ~a"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1514
|
||||
#: src/ui-goodies.lisp:1577
|
||||
msgid "About this software"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1526
|
||||
#: src/ui-goodies.lisp:1589
|
||||
msgid "Clearing pagination data"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1545
|
||||
#: src/ui-goodies.lisp:1608
|
||||
msgid "Invalid choices, usa a space separated list of positive integers."
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1562
|
||||
#: src/ui-goodies.lisp:1625
|
||||
#, lisp-format
|
||||
msgid "Invalid choices, index choice out of range (max ~a)."
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1564
|
||||
#: src/ui-goodies.lisp:1627
|
||||
msgid "Voting... "
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1565
|
||||
#: src/ui-goodies.lisp:1628
|
||||
msgid "Choice sent."
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1574
|
||||
#: src/ui-goodies.lisp:1637
|
||||
msgid "Type the index (or space separated indices) of selected choices: "
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1575
|
||||
#: src/ui-goodies.lisp:1638
|
||||
msgid "This in not a poll"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1643
|
||||
#: src/ui-goodies.lisp:1706
|
||||
msgid "Add message (enter to quit): "
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1668 src/ui-goodies.lisp:1681
|
||||
#: src/ui-goodies.lisp:1731 src/ui-goodies.lisp:1744
|
||||
msgid "Type the new label of the chat: "
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1689
|
||||
#: src/ui-goodies.lisp:1752
|
||||
#, lisp-format
|
||||
msgid "Chat ~a with ~a created"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1693
|
||||
#: src/ui-goodies.lisp:1756
|
||||
msgid "Type the user to chat with: "
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1720
|
||||
#: src/ui-goodies.lisp:1783
|
||||
msgid "This is not a valid gemini address"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1721
|
||||
#: src/ui-goodies.lisp:1784
|
||||
msgid "Open Gemini url: "
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1794 src/ui-goodies.lisp:1807
|
||||
#: src/ui-goodies.lisp:1870
|
||||
#, lisp-format
|
||||
msgid "Subscribing to ~s"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1883 src/ui-goodies.lisp:1896
|
||||
#, lisp-format
|
||||
msgid "Command ~s completed"
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1796
|
||||
#: src/ui-goodies.lisp:1885
|
||||
msgid "Send to command: "
|
||||
msgstr ""
|
||||
|
||||
#: src/ui-goodies.lisp:1809
|
||||
#: src/ui-goodies.lisp:1898
|
||||
msgid "Send message to command: "
|
||||
msgstr ""
|
||||
|
||||
|
|
181
src/db.lisp
181
src/db.lisp
|
@ -122,6 +122,12 @@
|
|||
(define-constant +table-gemini-tofu-cert+ :gemini-tofu-cert
|
||||
:test #'eq)
|
||||
|
||||
(define-constant +table-gemini-subscription+ :gemini-subscription
|
||||
:test #'eq)
|
||||
|
||||
(define-constant +table-gemlog-entries+ :gemlog-entries
|
||||
:test #'eq)
|
||||
|
||||
(define-constant +federated-timeline+ "federated"
|
||||
:test #'string=)
|
||||
|
||||
|
@ -525,6 +531,35 @@
|
|||
" UNIQUE(host) ON CONFLICT FAIL"
|
||||
+make-close+)))
|
||||
|
||||
(defun make-gemini-subscription ()
|
||||
(query-low-level (strcat (prepare-table +table-gemini-subscription+
|
||||
:autoincrementp nil
|
||||
:autogenerated-id-p nil)
|
||||
" url TEXT PRIMARY KEY, "
|
||||
" title TEXT, "
|
||||
" subtitle TEXT "
|
||||
+make-close+)))
|
||||
|
||||
(defun make-gemlog-entries ()
|
||||
(query-low-level (strcat (prepare-table +table-gemlog-entries+
|
||||
:autoincrementp nil
|
||||
:autogenerated-id-p nil)
|
||||
" url TEXT PRIMARY KEY, "
|
||||
" \"gemlog-id\" TEXT NON NULL "
|
||||
(make-foreign +table-gemini-subscription+
|
||||
:url
|
||||
+cascade+
|
||||
+cascade+
|
||||
t)
|
||||
;; timestamp
|
||||
" date TEXT NOT NULL, "
|
||||
" title TEXT, "
|
||||
" snippet TEXT, "
|
||||
;; boolean
|
||||
" seenp INTEGER DEFAULT 0, "
|
||||
" UNIQUE(url) ON CONFLICT FAIL"
|
||||
+make-close+)))
|
||||
|
||||
(defun build-all-indices ()
|
||||
(create-table-index +table-status+ '(:folder :timeline :status-id))
|
||||
(create-table-index +table-account+ '(:id :acct))
|
||||
|
@ -535,7 +570,9 @@
|
|||
(create-table-index +table-pagination-status+ '(:folder :timeline :status-id))
|
||||
(create-table-index +table-conversation+ '(:id))
|
||||
(create-table-index +table-cache+ '(:id :key))
|
||||
(create-table-index +table-gemini-tofu-cert+ '(:host)))
|
||||
(create-table-index +table-gemini-tofu-cert+ '(:host))
|
||||
(create-table-index +table-gemini-subscription+ '(:url))
|
||||
(create-table-index +table-gemlog-entries+ '(:url)))
|
||||
|
||||
(defmacro gen-delete (suffix &rest names)
|
||||
`(progn
|
||||
|
@ -560,7 +597,9 @@
|
|||
+table-poll+
|
||||
+table-chat-message+
|
||||
+table-chat+
|
||||
+table-gemini-tofu-cert+))
|
||||
+table-gemini-tofu-cert+
|
||||
+table-gemini-subscription+
|
||||
+table-gemlog-entries+))
|
||||
|
||||
(defun build-views ())
|
||||
|
||||
|
@ -592,6 +631,8 @@
|
|||
(make-chat-message)
|
||||
(make-chat)
|
||||
(make-tofu-certs)
|
||||
(make-gemini-subscription)
|
||||
(make-gemlog-entries)
|
||||
(build-all-indices)
|
||||
(fs:set-file-permissions (db-path) (logior fs:+s-irusr+ fs:+s-iwusr+))))
|
||||
|
||||
|
@ -1710,6 +1751,10 @@ row."
|
|||
|
||||
(gen-access-message-row title :title)
|
||||
|
||||
(gen-access-message-row subtitle :subtitle)
|
||||
|
||||
(gen-access-message-row url :url)
|
||||
|
||||
(gen-access-message-row expire-date :expire-date)
|
||||
|
||||
(gen-access-message-row chat-id :chat-id)
|
||||
|
@ -1734,6 +1779,8 @@ row."
|
|||
|
||||
(gen-access-message-row cache-created-at :created-at)
|
||||
|
||||
(gen-access-message-row seenp :seenp)
|
||||
|
||||
(defun row-votes-count (row)
|
||||
(and row (db-getf row :votes-count 0)))
|
||||
|
||||
|
@ -2816,3 +2863,133 @@ than `days-in-the-past' days (default: `(swconf:config-purge-cache-days-offset)'
|
|||
(:= :type +cache-tls-certificate-type+)))
|
||||
(order-by (:desc :updated-at)))))
|
||||
(fetch-all-rows query)))
|
||||
|
||||
(defun gemini-subscribe-url (url title subtitle)
|
||||
(query (make-insert +table-gemini-subscription+
|
||||
(:url :title :subtitle)
|
||||
(url title subtitle))))
|
||||
|
||||
(defun gemini-find-subscription (url)
|
||||
(when-let* ((query (select :*
|
||||
(from +table-gemini-subscription+)
|
||||
(where (:= :url url))))
|
||||
(row (fetch-single query)))
|
||||
row))
|
||||
|
||||
(defun row-unseen-count (row)
|
||||
(and row
|
||||
(db-getf row :unseen-count 0)))
|
||||
|
||||
(defun row-seen-count (row)
|
||||
(and row
|
||||
(db-getf row :seen-count 0)))
|
||||
|
||||
(defun gemini-all-subscriptions ()
|
||||
(when-let* ((query (select (:gemini-subscription.*
|
||||
(:as (select (fields (:count :url))
|
||||
(from :gemlog-entries)
|
||||
(where (:and (:= :gemlog-entries.seenp
|
||||
(prepare-for-db nil :to-integer t))
|
||||
(:= :gemlog-entries.gemlog-id
|
||||
:gemini-subscription.url))))
|
||||
:unseen-count)
|
||||
(:as (select (fields (:count :url))
|
||||
(from :gemlog-entries)
|
||||
(where (:and (:= :gemlog-entries.seenp
|
||||
(prepare-for-db t :to-integer t))
|
||||
(:= :gemlog-entries.gemlog-id
|
||||
:gemini-subscription.url))))
|
||||
:seen-count))
|
||||
(from +table-gemini-subscription+)
|
||||
(order-by :title)))
|
||||
(rows (fetch-all-rows query)))
|
||||
rows))
|
||||
|
||||
(defun gemini-cancel-subscription (gemlog-url)
|
||||
(query (delete-from +table-gemini-subscription+ (where (:= :url gemlog-url)))))
|
||||
|
||||
(defun find-gemlog-entry (post-url)
|
||||
(when-let* ((query (select :*
|
||||
(from +table-gemlog-entries+)
|
||||
(where (:= :url post-url))))
|
||||
(row (fetch-single query)))
|
||||
row))
|
||||
|
||||
(defun add-gemlog-entries (gemlog-iri post-url post-title post-date seenp)
|
||||
(query (make-insert +table-gemlog-entries+
|
||||
(:url
|
||||
:gemlog-id
|
||||
:date
|
||||
:title
|
||||
:seenp)
|
||||
(post-url
|
||||
gemlog-iri
|
||||
(decode-datetime-string post-date)
|
||||
post-title
|
||||
(prepare-for-db seenp :to-integer t)))))
|
||||
|
||||
(defun gemlog-mark-as-seen (post-url)
|
||||
(let ((update-query (make-update +table-gemlog-entries+
|
||||
(:seenp)
|
||||
((prepare-for-db t :to-integer t))
|
||||
(:= :url post-url))))
|
||||
(query update-query)))
|
||||
|
||||
(gen-access-message-row gemlog-url :gemlog-url)
|
||||
|
||||
(gen-access-message-row gemlog-title :gemlog-title)
|
||||
|
||||
(gen-access-message-row gemlog-subtitle :gemlog-subtitle)
|
||||
|
||||
(gen-access-message-row post-date :post-date)
|
||||
|
||||
(gen-access-message-row post-title :post-title)
|
||||
|
||||
(gen-access-message-row post-link :post-link)
|
||||
|
||||
(gen-access-message-row post-seenp :seenp)
|
||||
|
||||
(defun gemlog-entries (gemlog-url &key (unseen-only nil) (seen-only nil))
|
||||
(assert (not (and unseen-only
|
||||
seen-only)))
|
||||
(when-let* ((query (select ((:as :gemini-subscription.url :gemlog-url)
|
||||
(:as :gemini-subscription.title :gemlog-title)
|
||||
(:as :gemini-subscription.subtitle :gemlog-subtitle)
|
||||
(:as :gemlog-entries.date :post-date)
|
||||
(:as :gemlog-entries.title :post-title)
|
||||
(:as :gemlog-entries.url :post-link)
|
||||
(:as :gemlog-entries.seenp :seenp))
|
||||
(from :gemlog-entries)
|
||||
(join :gemini-subscription
|
||||
:on (:= :gemlog-entries.gemlog-id
|
||||
:gemini-subscription.url))
|
||||
(where (:= :gemini-subscription.url gemlog-url))))
|
||||
(unordered-rows (fetch-all-rows query))
|
||||
(actual-rows (cond
|
||||
(unseen-only
|
||||
(remove-if-not (lambda (row) (db-nil-p (row-seenp row)))
|
||||
unordered-rows))
|
||||
(seen-only
|
||||
(remove-if (lambda (row) (db-nil-p (row-seenp row)))
|
||||
unordered-rows))
|
||||
(t
|
||||
unordered-rows))))
|
||||
(num:multisort actual-rows (list (num:gen-multisort-test (lambda (a b)
|
||||
(if (and (db-nil-p a)
|
||||
(db-nil-p b))
|
||||
a
|
||||
(db-nil-p a)))
|
||||
(lambda (a b)
|
||||
(if (and (db-nil-p a)
|
||||
(db-nil-p b))
|
||||
b
|
||||
(db-nil-p b)))
|
||||
(lambda (a)
|
||||
(db-getf a :seenp)))
|
||||
(num:gen-multisort-test string>
|
||||
string<
|
||||
(lambda (a)
|
||||
(row-post-date a)))))))
|
||||
|
||||
(defun delete-gemlog-entry (gemlog-url)
|
||||
(query (delete-from +table-gemlog-entries+ (where (:= :url gemlog-url)))))
|
||||
|
|
|
@ -0,0 +1,98 @@
|
|||
;; tinmop: an humble gemini and pleroma client
|
||||
;; Copyright (C) 2021 cage
|
||||
|
||||
;; This program is free software: you can redistribute it and/or modify
|
||||
;; it under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation, either version 3 of the License, or
|
||||
;; (at your option) any later version.
|
||||
|
||||
;; This program is distributed in the hope that it will be useful,
|
||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;; GNU General Public License for more details.
|
||||
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with this program.
|
||||
;; If not, see [[http://www.gnu.org/licenses/][http://www.gnu.org/licenses/]].
|
||||
|
||||
(in-package :gemini-subscription-window)
|
||||
|
||||
(defclass gemini-subscription-window (focus-marked-window
|
||||
simple-line-navigation-window
|
||||
title-window
|
||||
border-window)
|
||||
())
|
||||
|
||||
(defmethod refresh-config :after ((object gemini-subscription-window))
|
||||
(open-attach-window:refresh-view-links-window-config object
|
||||
swconf:+key-gemini-subscription-window+)
|
||||
(refresh-config-sizes object swconf:+key-thread-window+)
|
||||
(win-move object
|
||||
(- (win-width *main-window*)
|
||||
(win-width object))
|
||||
0)
|
||||
(win-move object
|
||||
(- (win-width *main-window*)
|
||||
(win-width object))
|
||||
0)
|
||||
object)
|
||||
|
||||
(defun gemlog->text (gemlog-db-row window)
|
||||
(format nil
|
||||
"~a ~s ~a/~a"
|
||||
(tui:text-ellipsis (db:row-title gemlog-db-row)
|
||||
(truncate (/ (win-width window)
|
||||
3)))
|
||||
(when (db:row-subtitle gemlog-db-row)
|
||||
(tui:text-ellipsis (db:row-subtitle gemlog-db-row)
|
||||
(truncate (/ (win-width window)
|
||||
3)))
|
||||
(_ "No subtitle"))
|
||||
(db:row-unseen-count gemlog-db-row)
|
||||
(+ (db:row-unseen-count gemlog-db-row)
|
||||
(db:row-seen-count gemlog-db-row))))
|
||||
|
||||
(defmethod resync-rows-db ((object gemini-subscription-window)
|
||||
&key
|
||||
(redraw t)
|
||||
(suggested-message-index nil))
|
||||
(with-accessors ((rows rows)
|
||||
(selected-line-bg selected-line-bg)
|
||||
(selected-line-fg selected-line-fg)) object
|
||||
(flet ((make-rows (gemlogs bg fg)
|
||||
(mapcar (lambda (gemlog)
|
||||
(make-instance 'line
|
||||
:normal-text (gemlog->text gemlog object)
|
||||
:selected-text (gemlog->text gemlog object)
|
||||
:fields gemlog
|
||||
:normal-bg fg
|
||||
:normal-fg bg
|
||||
:selected-bg bg
|
||||
:selected-fg fg))
|
||||
gemlogs)))
|
||||
(with-croatoan-window (croatoan-window object)
|
||||
(setf rows (make-rows (db:gemini-all-subscriptions)
|
||||
selected-line-bg
|
||||
selected-line-fg))
|
||||
(when suggested-message-index
|
||||
(select-row object suggested-message-index))
|
||||
(when redraw
|
||||
(win-clear object)
|
||||
(draw object))))))
|
||||
|
||||
(defun open-gemini-subscription-window ()
|
||||
(let* ((low-level-window (make-croatoan-window :enable-function-keys t)))
|
||||
(setf *gemini-subscription-window*
|
||||
(make-instance 'gemini-subscription-window
|
||||
:top-row-padding 0
|
||||
:title (_ "Subscribed gemlogs")
|
||||
:single-row-height 1
|
||||
:uses-border-p t
|
||||
:keybindings keybindings:*gemlog-subscription-keymap*
|
||||
:croatoan-window low-level-window))
|
||||
(refresh-config *gemini-subscription-window*)
|
||||
(resync-rows-db *gemini-subscription-window* :redraw nil)
|
||||
(when (rows *gemini-subscription-window*)
|
||||
(select-row *gemini-subscription-window* 0))
|
||||
(draw *gemini-subscription-window*)
|
||||
*gemini-subscription-window*))
|
|
@ -149,6 +149,9 @@
|
|||
(or (code= code +30+)
|
||||
(code= code +31+)))
|
||||
|
||||
(defun response-success-p (code)
|
||||
(code= code +20+))
|
||||
|
||||
(define-condition gemini-protocol-error (error)
|
||||
((error-code
|
||||
:initarg :error-code
|
||||
|
|
|
@ -19,6 +19,41 @@
|
|||
|
||||
(defparameter *raw-mode* nil)
|
||||
|
||||
(define-constant +h1-prefix+ "#" :test #'string=)
|
||||
|
||||
(define-constant +h2-prefix+ "##" :test #'string=)
|
||||
|
||||
(define-constant +h3-prefix+ "###" :test #'string=)
|
||||
|
||||
(define-constant +list-bullet-prefix+ "* " :test #'string=)
|
||||
|
||||
(define-constant +quote-prefix+ ">" :test #'string=)
|
||||
|
||||
(define-constant +preformatted-prefix+ "```" :test #'string=)
|
||||
|
||||
(define-constant +link-prefix+ "=>" :test #'string=)
|
||||
|
||||
(defmacro gen-geminize-line (name prefix)
|
||||
`(defun ,(format-fn-symbol t "geminize-~a" name) (text)
|
||||
(strcat ,prefix text)))
|
||||
|
||||
(gen-geminize-line h1 +h1-prefix+)
|
||||
|
||||
(gen-geminize-line h2 +h2-prefix+)
|
||||
|
||||
(gen-geminize-line h3 +h3-prefix+)
|
||||
|
||||
(gen-geminize-line list +list-bullet-prefix+)
|
||||
|
||||
(gen-geminize-line quote +quote-prefix+)
|
||||
|
||||
(gen-geminize-line link +link-prefix+)
|
||||
|
||||
(defun make-gemini-link (url title)
|
||||
(format nil "~a ~a"
|
||||
(geminize-link url)
|
||||
title))
|
||||
|
||||
(defrule space (or #\Space #\Tab)
|
||||
(:constant nil))
|
||||
|
||||
|
|
|
@ -37,6 +37,13 @@
|
|||
(:shadowing-import-from :misc :random-elt :shuffle)
|
||||
(:export
|
||||
:+gemini-scheme+
|
||||
:geminize-h1
|
||||
:geminize-h2
|
||||
:geminize-h3
|
||||
:geminize-list
|
||||
:geminize-quote
|
||||
:geminize-link
|
||||
:make-gemini-link
|
||||
:gemini-link
|
||||
:target
|
||||
:name
|
||||
|
@ -91,6 +98,7 @@
|
|||
:response-input-p
|
||||
:response-sensitive-input-p
|
||||
:response-redirect-p
|
||||
:response-success-p
|
||||
:absolute-url-p
|
||||
:init-default-gemini-theme
|
||||
:gemini-file-response
|
||||
|
@ -107,3 +115,21 @@
|
|||
:close-ssl-socket
|
||||
:make-client-certificate
|
||||
:request))
|
||||
|
||||
(defpackage :gemini-subscription
|
||||
(:use
|
||||
:cl
|
||||
:alexandria
|
||||
:cl-ppcre
|
||||
:config
|
||||
:constants
|
||||
:text-utils
|
||||
:misc
|
||||
:alexandria
|
||||
:gemini-constants
|
||||
:gemini-parser
|
||||
:gemini-client)
|
||||
(:shadowing-import-from :misc :random-elt :shuffle)
|
||||
(:export
|
||||
:subscribe
|
||||
:refresh))
|
||||
|
|
|
@ -0,0 +1,109 @@
|
|||
;; tinmop: an humble gemini and pleroma client
|
||||
;; Copyright (C) 2020 cage
|
||||
|
||||
;; This program is free software: you can redistribute it and/or modify
|
||||
;; it under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation, either version 3 of the License, or
|
||||
;; (at your option) any later version.
|
||||
|
||||
;; This program is distributed in the hope that it will be useful,
|
||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;; GNU General Public License for more details.
|
||||
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
(in-package :gemini-subscription)
|
||||
|
||||
(defun slurp-gemini-url (url)
|
||||
"Read 'full' data from gemini address `url'; note that specs says
|
||||
that gemini flow is streamed by default so this function has limited
|
||||
use as there is a chance that it would not returns. Anyway for gemlog
|
||||
subscription (for example) could be used.
|
||||
|
||||
TODO: No redirection is followed"
|
||||
(let ((iri (iri:iri-parse url)))
|
||||
(multiple-value-bind (status description meta response socket)
|
||||
(gemini-client:request (uri:host iri)
|
||||
(uri:path iri)
|
||||
:query (uri:query iri)
|
||||
:port (uri:port iri)
|
||||
:fragment (uri:fragment iri))
|
||||
(declare (ignore meta description))
|
||||
(when (response-success-p status)
|
||||
(let ((data (misc:make-fresh-array 0 0 '(unsigned-byte 8) nil)))
|
||||
(loop for new-byte = (read-byte response nil nil)
|
||||
while new-byte do
|
||||
(vector-push-extend new-byte data))
|
||||
(gemini-client:close-ssl-socket socket)
|
||||
data)))))
|
||||
|
||||
(defun link-post-timestamp (link-text)
|
||||
"Returns a local-time object parsing a gemlog entry's link text
|
||||
|
||||
A link text entry is like 'aaaa-mm-dd post title'
|
||||
|
||||
This function parses the 'aaaa-mm-dd' part.
|
||||
"
|
||||
(when (>= (length link-text) 10)
|
||||
(local-time:parse-timestring link-text :start 0 :end 10 :fail-on-error nil)))
|
||||
|
||||
(defun link-post-title (link-text)
|
||||
"Returns the title of gemlog entry from link text
|
||||
|
||||
A link text entry is like 'aaaa-mm-dd post title'
|
||||
|
||||
This function return the 'post-title' substring."
|
||||
(misc:safe-subseq link-text 10))
|
||||
|
||||
(defun link-post-timestamp-p (link-text)
|
||||
"Is this a valid gemlog link text?"
|
||||
(link-post-timestamp link-text))
|
||||
|
||||
(defun subscribe (url)
|
||||
"Subscribe to a gemlog that can be found at 'url'"
|
||||
(labels ((subtitle-p (nodes h2-pos)
|
||||
(when h2-pos
|
||||
(let ((res t))
|
||||
(loop for i from h2-pos downto 0 do
|
||||
(let ((node (elt nodes i)))
|
||||
(when (and node
|
||||
(not (html-utils:tag= :h1
|
||||
(html-utils:children node))))
|
||||
(return-from subtitle-p nil))))
|
||||
res))))
|
||||
(when-let* ((data (slurp-gemini-url url))
|
||||
(page (babel:octets-to-string data))
|
||||
(parsed (parse-gemini-file page))
|
||||
(iri (iri:iri-parse url))
|
||||
(title (first (html-utils:children (html-utils:find-tag :h1
|
||||
parsed)))))
|
||||
(let* ((maybe-subtitle-pos (html-utils:position-tag :h2 parsed))
|
||||
(subtitle (when (subtitle-p parsed maybe-subtitle-pos)
|
||||
(first (html-utils:children (elt parsed
|
||||
maybe-subtitle-pos))))))
|
||||
(when (not (db:gemini-find-subscription url))
|
||||
(db:gemini-subscribe-url url title subtitle))
|
||||
t))))
|
||||
|
||||
(defun refresh (url)
|
||||
"Refresh gemlog entries that can be found at 'url'. The gemlog must
|
||||
be subscribed before (see: 'gemini-subscription:subcribe'"
|
||||
(when-let* ((data (slurp-gemini-url url))
|
||||
(page (babel:octets-to-string data))
|
||||
(parsed (parse-gemini-file page))
|
||||
(gemlog-iri (iri:iri-parse url)))
|
||||
(let ((links (remove-if-not (lambda (a) (link-post-timestamp-p (name a)))
|
||||
(sexp->links parsed
|
||||
(uri:host gemlog-iri)
|
||||
(uri:port gemlog-iri)
|
||||
(uri:path gemlog-iri)))))
|
||||
(loop for link in links do
|
||||
(when (not (db:find-gemlog-entry (to-s (target link))))
|
||||
(let ((date (link-post-timestamp (name link))))
|
||||
(db:add-gemlog-entries (to-s gemlog-iri)
|
||||
(target link)
|
||||
(link-post-title (name link))
|
||||
date
|
||||
nil)))))))
|
|
@ -1,5 +1,7 @@
|
|||
(in-package :idn)
|
||||
|
||||
(pkg-config-cflags "libidn2")
|
||||
|
||||
(include "idn2.h")
|
||||
|
||||
(cenum (idn2-rc)
|
||||
|
|
|
@ -65,6 +65,16 @@
|
|||
(attribute-key attribute)))
|
||||
(attributes node)))
|
||||
|
||||
(defun find-tag (tag node)
|
||||
"find tag on a node list, does not descend into children"
|
||||
(find-if (lambda (a) (tag= tag a))
|
||||
node))
|
||||
|
||||
(defun position-tag (tag node)
|
||||
"find position of tag on a node list, does not descend into children"
|
||||
(position-if (lambda (a) (tag= tag a))
|
||||
node))
|
||||
|
||||
(defun html->text (html &key (add-link-footnotes t))
|
||||
"Transform html to text, note that if `add-link-footnotes` is non nil footnotes that marks html link in the text are added aftere the body of the message
|
||||
|
||||
|
|
|
@ -264,6 +264,9 @@ produces a tree and graft the latter on `existing-tree'"
|
|||
(defparameter *chat-message-keymap* (make-starting-comand-tree)
|
||||
"The keymap for message-window when shows chat.")
|
||||
|
||||
(defparameter *gemlog-subscription-keymap* (make-starting-comand-tree)
|
||||
"The keymap for gemlog subscriptions window.")
|
||||
|
||||
(defun define-key (key-sequence function &optional (existing-keymap *global-keymap*))
|
||||
"Define a key sequence that trigger a function:
|
||||
|
||||
|
|
|
@ -185,8 +185,11 @@
|
|||
(setf (selected (elt rows index)) t)))
|
||||
(ignore-selecting-action (e)
|
||||
(declare (ignore e))
|
||||
nil))
|
||||
object))
|
||||
nil)
|
||||
(set-default-index (e)
|
||||
(declare (ignore e))
|
||||
(setf row-selected-index 0)))
|
||||
object))
|
||||
|
||||
(defmethod selected-row ((object row-oriented-widget))
|
||||
"Return the current selected row"
|
||||
|
|
|
@ -472,8 +472,8 @@ to the array"
|
|||
(let ((first-byte (read-byte stream nil nil)))
|
||||
(when first-byte
|
||||
(let ((raw (loop
|
||||
for c = (read-byte stream nil 10)
|
||||
while (/= c 10)
|
||||
for c = (read-byte stream nil (char-code #\Newline))
|
||||
while (/= c (char-code #\Newline))
|
||||
collect c)))
|
||||
(push first-byte raw)
|
||||
(when add-newline-stopper
|
||||
|
|
|
@ -393,6 +393,8 @@
|
|||
:children
|
||||
:tag=
|
||||
:find-attribute
|
||||
:find-tag
|
||||
:position-tag
|
||||
:html->text))
|
||||
|
||||
(defpackage :resources-utils
|
||||
|
@ -738,6 +740,7 @@
|
|||
:+table-attachment+
|
||||
:+table-saved-status+
|
||||
:+table-crypto-data+
|
||||
:+table-gemini-subscription+
|
||||
:+federated-timeline+
|
||||
:+local-timeline+
|
||||
:+home-timeline+
|
||||
|
@ -828,6 +831,8 @@
|
|||
:row-poll-expired-p
|
||||
:row-poll-multiple-vote-p
|
||||
:row-title
|
||||
:row-subtitle
|
||||
:row-url
|
||||
:row-expire-date
|
||||
:row-account-id
|
||||
:row-updated-at
|
||||
|
@ -840,6 +845,7 @@
|
|||
:row-cache-type
|
||||
:row-cache-accessed-at
|
||||
:row-cache-created-at
|
||||
:row-seenp
|
||||
:next-status-tree
|
||||
:previous-status-tree
|
||||
:message-tree-root-equal
|
||||
|
@ -944,7 +950,25 @@
|
|||
:tofu-passes-p
|
||||
:tofu-delete
|
||||
:ssl-cert-find
|
||||
:find-tls-certificates-rows))
|
||||
:find-tls-certificates-rows
|
||||
:gemini-subscribe-url
|
||||
:gemini-find-subscription
|
||||
:gemini-all-subscriptions
|
||||
:row-seen-count
|
||||
:row-unseen-count
|
||||
:find-gemlog-entry
|
||||
:gemini-cancel-subscription
|
||||
:add-gemlog-entries
|
||||
:gemlog-mark-as-seen
|
||||
:gemlog-url
|
||||
:gemlog-title
|
||||
:gemlog-subtitle
|
||||
:row-post-date
|
||||
:row-post-title
|
||||
:row-post-link
|
||||
:row-post-seenp
|
||||
:gemlog-entries
|
||||
:delete-gemlog-entry))
|
||||
|
||||
(defpackage :date-formatter
|
||||
(:use
|
||||
|
@ -1006,6 +1030,7 @@
|
|||
:+key-message-window+
|
||||
:+key-chat-window+
|
||||
:+key-chats-list-window+
|
||||
:+key-gemini-subscription-window+
|
||||
:+key-favourite+
|
||||
:+key-sensitive+
|
||||
:+key-boosted+
|
||||
|
@ -1200,6 +1225,7 @@
|
|||
:*open-message-link-window*
|
||||
:*gemini-streams-window*
|
||||
:*gemini-certificates-window*
|
||||
:*gemini-subscription-window*
|
||||
:*chats-list-window*))
|
||||
|
||||
(defpackage :complete
|
||||
|
@ -1323,6 +1349,10 @@
|
|||
:gemini-abort-downloading-event
|
||||
:gemini-compact-lines-event
|
||||
:gemini-enqueue-download-event
|
||||
:gemini-gemlog-subscribe-event
|
||||
:gemlog-cancel-subscription-event
|
||||
:gemlog-show-event
|
||||
:gemlog-refresh-all-event
|
||||
:get-chat-messages-event
|
||||
:get-chats-event
|
||||
:chat-show-event
|
||||
|
@ -1483,6 +1513,7 @@
|
|||
:*gemini-certificates-keymap*
|
||||
:*chats-list-keymap*
|
||||
:*chat-message-keymap*
|
||||
:*gemlog-subscription-keymap*
|
||||
:define-key
|
||||
:init-keyboard-mapping
|
||||
:find-keymap-node
|
||||
|
@ -1753,6 +1784,7 @@
|
|||
:select-row
|
||||
:selected-row
|
||||
:ignore-selecting-action
|
||||
:set-default-index
|
||||
:selected-row-fields
|
||||
:selected-row-delete
|
||||
:search-row
|
||||
|
@ -1940,6 +1972,26 @@
|
|||
(:export
|
||||
:open-gemini-certificates-window))
|
||||
|
||||
(defpackage :gemini-subscription-window
|
||||
(:use
|
||||
:cl
|
||||
:alexandria
|
||||
:cl-ppcre
|
||||
:access
|
||||
:croatoan
|
||||
:config
|
||||
:constants
|
||||
:text-utils
|
||||
:misc
|
||||
:mtree
|
||||
:specials
|
||||
:windows
|
||||
:line-oriented-window
|
||||
:tui-utils)
|
||||
(:shadowing-import-from :misc :random-elt :shuffle)
|
||||
(:export
|
||||
:open-gemini-subscription-window))
|
||||
|
||||
(defpackage :command-window
|
||||
(:use
|
||||
:cl
|
||||
|
@ -2335,6 +2387,14 @@
|
|||
:gemini-streams-window-close
|
||||
:gemini-streams-window-open-stream
|
||||
:gemini-refresh-page
|
||||
:gemini-subscribe-gemlog
|
||||
:gemini-open-gemlog-window
|
||||
:gemlogs-subscription-go-up
|
||||
:gemlogs-subscription-go-down
|
||||
:close-gemlog-window
|
||||
:show-gemlog-to-screen
|
||||
:gemlog-refresh-all
|
||||
:gemlog-cancel-subscription
|
||||
:send-to-pipe
|
||||
:send-message-to-pipe))
|
||||
|
||||
|
|
|
@ -1138,6 +1138,97 @@
|
|||
(with-accessors ((stream-object payload)) object
|
||||
(gemini-viewer:push-db-stream stream-object)))
|
||||
|
||||
(defclass gemini-gemlog-subscribe-event (program-event) ())
|
||||
|
||||
(defmethod process-event ((object gemini-gemlog-subscribe-event))
|
||||
(with-accessors ((url payload)) object
|
||||
(let ((subscribedp (gemini-subscription:subscribe url)))
|
||||
(if subscribedp
|
||||
(gemini-subscription:refresh url)
|
||||
(ui:notify (format nil
|
||||
(_ "Unable to subscribe to ~s")
|
||||
url)
|
||||
:as-error t)))))
|
||||
|
||||
(defclass gemlog-cancel-subscription-event (program-event) ())
|
||||
|
||||
(defmethod process-event ((object gemlog-cancel-subscription-event))
|
||||
(with-accessors ((gemlog-url payload)) object
|
||||
(db:gemini-cancel-subscription gemlog-url)
|
||||
(handler-bind ((conditions:out-of-bounds
|
||||
(lambda (e)
|
||||
(invoke-restart 'line-oriented-window:set-default-index e))))
|
||||
(line-oriented-window:resync-rows-db specials:*gemini-subscription-window*
|
||||
:suggested-message-index 0
|
||||
:redraw t))))
|
||||
|
||||
(defclass gemlog-show-event (program-event)
|
||||
((title
|
||||
:initarg :title
|
||||
:accessor title)
|
||||
(subtitle
|
||||
:initarg :subtitle
|
||||
:accessor subtitle)
|
||||
(gemlog-url
|
||||
:initarg :gemlog-url
|
||||
:accessor gemlog-url)
|
||||
(entries
|
||||
:initarg :entries
|
||||
:accessor entries)))
|
||||
|
||||
(defmethod process-event ((object gemlog-show-event))
|
||||
(with-accessors ((title title)
|
||||
(subtitle subtitle)
|
||||
(entries entries)
|
||||
(gemlog-url gemlog-url)) object
|
||||
(let* ((gemini-page (with-output-to-string (stream)
|
||||
(format stream
|
||||
"~a~2%"
|
||||
(gemini-parser:geminize-h1 title))
|
||||
(if subtitle
|
||||
(format stream
|
||||
"~a~2%"
|
||||
(gemini-parser:geminize-h2 subtitle))
|
||||
(format stream
|
||||
"~a~2%"
|
||||
(gemini-parser:geminize-h2 (_ "No subtitle"))))
|
||||
(loop for entry in entries do
|
||||
(let* ((link (db:row-post-link entry))
|
||||
(date-format (swconf:date-fmt swconf:+key-message-window+))
|
||||
(date (db:row-post-date entry))
|
||||
(encoded-date (db-utils:encode-datetime-string date))
|
||||
(title (text-utils:strcat (format-time encoded-date date-format)
|
||||
" "
|
||||
(db:row-post-title entry)))
|
||||
(seenp (db:row-post-seenp entry)))
|
||||
(format stream
|
||||
(_ "~a ~:[(not opened)~;(opened)~]~%")
|
||||
(gemini-parser:make-gemini-link link
|
||||
title)
|
||||
seenp)))))
|
||||
(url (iri:iri-parse gemlog-url))
|
||||
(parsed (gemini-parser:parse-gemini-file gemini-page))
|
||||
(links (gemini-parser:sexp->links parsed
|
||||
(uri:host url)
|
||||
(uri:port url)
|
||||
(uri:path url)))
|
||||
(theme gemini-client::*gemini-page-theme*))
|
||||
(gemini-viewer::maybe-initialize-metadata specials:*message-window*)
|
||||
(refresh-gemini-message-window links
|
||||
gemini-page
|
||||
(gemini-parser:sexp->text parsed theme)
|
||||
nil)
|
||||
(setf (windows:keybindings specials:*message-window*)
|
||||
keybindings:*gemini-message-keymap*)
|
||||
(windows:draw specials:*message-window*))))
|
||||
|
||||
(defclass gemlog-refresh-all-event (program-event) ())
|
||||
|
||||
(defmethod process-event ((object gemlog-refresh-all-event))
|
||||
(let ((all-subscribed-gemlogs (mapcar #'db:row-url (db:gemini-all-subscriptions))))
|
||||
(loop for subscription in all-subscribed-gemlogs do
|
||||
(gemini-subscription:refresh subscription))))
|
||||
|
||||
;;;; pleroma
|
||||
|
||||
(defclass get-chat-messages-event (program-event)
|
||||
|
|
|
@ -17,9 +17,11 @@
|
|||
|
||||
(in-package :scheduled-events)
|
||||
|
||||
(define-constant +refresh-all-chats-data-frequency+ 10000 :test #'=)
|
||||
(define-constant +refresh-all-chats-data-frequency+ 10000 :test #'=)
|
||||
|
||||
(define-constant +refresh-all-chats-messages-frequency+ 50 :test #'=)
|
||||
(define-constant +refresh-all-chats-messages-frequency+ 50 :test #'=)
|
||||
|
||||
(define-constant +refresh-gemlog-subscriptions-frequency+ 50000 :test #'=)
|
||||
|
||||
(defun triggedp (ticks frequency)
|
||||
(= (rem ticks frequency)
|
||||
|
@ -30,12 +32,16 @@
|
|||
(when (triggedp ticks ,frequency)
|
||||
,@body-if-triggered)))
|
||||
|
||||
(gen-scheduler-function (refresh-refresh-all-chats-data
|
||||
(gen-scheduler-function (refresh-all-chats-data
|
||||
+refresh-all-chats-data-frequency+)
|
||||
(ui:notify (_ "Updating all chats."))
|
||||
(ui:update-all-chats-data))
|
||||
|
||||
(gen-scheduler-function (refresh-refresh-all-chats-messages
|
||||
(gen-scheduler-function (refresh-gemlog-subscriptions
|
||||
+refresh-gemlog-subscriptions-frequency+)
|
||||
(ui:gemlog-refresh-all))
|
||||
|
||||
(gen-scheduler-function (refresh-all-chats-messages
|
||||
+refresh-all-chats-messages-frequency+)
|
||||
(when (message-window:display-chat-p *message-window*)
|
||||
(ui:update-all-chats-messages)
|
||||
|
@ -44,5 +50,6 @@
|
|||
(program-events:push-event show-event))))
|
||||
|
||||
(defun run-scheduled-events (ticks)
|
||||
(refresh-refresh-all-chats-messages ticks)
|
||||
(refresh-refresh-all-chats-data ticks))
|
||||
(refresh-all-chats-messages ticks)
|
||||
(refresh-all-chats-data ticks)
|
||||
(refresh-gemlog-subscriptions ticks))
|
||||
|
|
|
@ -367,6 +367,7 @@
|
|||
message-window
|
||||
chat-window
|
||||
chats-list-window
|
||||
gemini-subscription-window
|
||||
attachment-header
|
||||
max-numbers-allowed-attachments
|
||||
max-message-length
|
||||
|
|
|
@ -58,5 +58,8 @@
|
|||
(defparameter *gemini-certificates-window* nil
|
||||
"The window that shows all gemini client certificates.")
|
||||
|
||||
(defparameter *gemini-subscription-window* nil
|
||||
"The window that shows all the subscribed gemlogs.")
|
||||
|
||||
(defparameter *chats-list-window* nil
|
||||
"The window that shows all the chats.")
|
||||
|
|
|
@ -388,6 +388,8 @@ Metadata includes:
|
|||
(if print-message
|
||||
(_ "focus passed on threads window")
|
||||
nil)
|
||||
*gemini-subscription-window*
|
||||
*gemini-certificates-window*
|
||||
*chats-list-window*
|
||||
*gemini-streams-window*
|
||||
*open-message-link-window*
|
||||
|
@ -404,7 +406,8 @@ Metadata includes:
|
|||
*message-window*
|
||||
:documentation "Move focus on message window"
|
||||
:info-change-focus-message (_ "Focus passed on message window")
|
||||
:windows-lose-focus (*gemini-certificates-window*
|
||||
:windows-lose-focus (*gemini-subscription-window*
|
||||
*gemini-certificates-window*
|
||||
*chats-list-window*
|
||||
*gemini-streams-window*
|
||||
*open-message-link-window*
|
||||
|
@ -419,7 +422,8 @@ Metadata includes:
|
|||
*send-message-window*
|
||||
:documentation "Move focus on send message window"
|
||||
:info-change-focus-message (_ "Focus passed on send message window")
|
||||
:windows-lose-focus (*gemini-certificates-window*
|
||||
:windows-lose-focus (*gemini-subscription-window*
|
||||
*gemini-certificates-window*
|
||||
*chats-list-window*
|
||||
*gemini-streams-window*
|
||||
*open-message-link-window*
|
||||
|
@ -434,7 +438,8 @@ Metadata includes:
|
|||
*follow-requests-window*
|
||||
:documentation "Move focus on follow requests window"
|
||||
:info-change-focus-message (_ "Focus passed on follow requests window")
|
||||
:windows-lose-focus (*gemini-certificates-window*
|
||||
:windows-lose-focus (*gemini-subscription-window*
|
||||
*gemini-certificates-window*
|
||||
*chats-list-window*
|
||||
*gemini-streams-window*
|
||||
*open-message-link-window*
|
||||
|
@ -449,7 +454,8 @@ Metadata includes:
|
|||
*tags-window*
|
||||
:documentation "Move focus on tags window"
|
||||
:info-change-focus-message (_ "Focus passed on tags window")
|
||||
:windows-lose-focus (*gemini-certificates-window*
|
||||
:windows-lose-focus (*gemini-subscription-window*
|
||||
*gemini-certificates-window*
|
||||
*chats-list-window*
|
||||
*gemini-streams-window*
|
||||
*open-message-link-window*
|
||||
|
@ -463,7 +469,8 @@ Metadata includes:
|
|||
*conversations-window*
|
||||
:documentation "Move focus on conversations window"
|
||||
:info-change-focus-message (_ "Focus passed on conversation window")
|
||||
:windows-lose-focus (*gemini-certificates-window*
|
||||
:windows-lose-focus (*gemini-subscription-window*
|
||||
*gemini-certificates-window*
|
||||
*chats-list-window*
|
||||
*gemini-streams-window*
|
||||
*open-message-link-window*
|
||||
|
@ -478,7 +485,8 @@ Metadata includes:
|
|||
*open-attach-window*
|
||||
:documentation "Move focus on open-attach window"
|
||||
:info-change-focus-message (_ "Focus passed on attach window")
|
||||
:windows-lose-focus (*gemini-certificates-window*
|
||||
:windows-lose-focus (*gemini-subscription-window*
|
||||
*gemini-certificates-window*
|
||||
*chats-list-window*
|
||||
*gemini-streams-window*
|
||||
*open-message-link-window*
|
||||
|
@ -493,7 +501,8 @@ Metadata includes:
|
|||
*open-message-link-window*
|
||||
:documentation "Move focus on open-link window"
|
||||
:info-change-focus-message (_ "Focus passed on link window")
|
||||
:windows-lose-focus (*gemini-certificates-window*
|
||||
:windows-lose-focus (*gemini-subscription-window*
|
||||
*gemini-certificates-window*
|
||||
*chats-list-window*
|
||||
*gemini-streams-window*
|
||||
*conversations-window*
|
||||
|
@ -508,7 +517,8 @@ Metadata includes:
|
|||
*gemini-streams-window*
|
||||
:documentation "Move focus on open gemini streams window"
|
||||
:info-change-focus-message (_ "Focus passed on gemini-stream window")
|
||||
:windows-lose-focus (*gemini-certificates-window*
|
||||
:windows-lose-focus (*gemini-subscription-window*
|
||||
*gemini-certificates-window*
|
||||
*chats-list-window*
|
||||
*open-message-link-window*
|
||||
*conversations-window*
|
||||
|
@ -523,7 +533,8 @@ Metadata includes:
|
|||
*chats-list-window*
|
||||
:documentation "Move focus on chats list window"
|
||||
:info-change-focus-message (_ "Focus passed on chats list window")
|
||||
:windows-lose-focus (*gemini-certificates-window*
|
||||
:windows-lose-focus (*gemini-subscription-window*
|
||||
*gemini-certificates-window*
|
||||
*gemini-streams-window*
|
||||
*open-message-link-window*
|
||||
*conversations-window*
|
||||
|
@ -538,7 +549,23 @@ Metadata includes:
|
|||
*gemini-certificates-window*
|
||||
:documentation "Move focus on open-gemini certificates window"
|
||||
:info-change-focus-message (_ "Focus passed on TLS certificates window.")
|
||||
:windows-lose-focus (*chats-list-window*
|
||||
:windows-lose-focus (*gemini-subscription-window*
|
||||
*chats-list-window*
|
||||
*gemini-streams-window*
|
||||
*conversations-window*
|
||||
*open-attach-window*
|
||||
*tags-window*
|
||||
*follow-requests-window*
|
||||
*thread-window*
|
||||
*message-window*
|
||||
*send-message-window*))
|
||||
|
||||
(gen-focus-to-window open-gemini-subscription-window
|
||||
*gemini-subscription-window*
|
||||
:documentation "Move focus on open-gemini certificates window"
|
||||
:info-change-focus-message (_ "Focus passed on gemlog subscriptions window.")
|
||||
:windows-lose-focus (*gemini-certificates-window*
|
||||
*chats-list-window*
|
||||
*gemini-streams-window*
|
||||
*conversations-window*
|
||||
*open-attach-window*
|
||||
|
@ -1208,6 +1235,42 @@ certificate).
|
|||
:prompt (_ "Delete this certificate? [Y/n] ")
|
||||
:complete-fn #'complete:complete-always-empty)))
|
||||
|
||||
(defun gemini-open-gemlog-window ()
|
||||
"Open a window with all the gemlog subscribed."
|
||||
(gemini-subscription-window:open-gemini-subscription-window)
|
||||
(focus-to-open-gemini-subscription-window))
|
||||
|
||||
(defun close-gemlog-window ()
|
||||
(close-window-and-return-to-threads *gemini-subscription-window*))
|
||||
|
||||
(defmacro with-selected-gemlog-id ((fields gemlog-id) &body body)
|
||||
`(when-let* ((,fields (line-oriented-window:selected-row-fields *gemini-subscription-window*))
|
||||
(,gemlog-id (db:row-url ,fields)))
|
||||
,@body))
|
||||
|
||||
(defun gemlog-cancel-subscription ()
|
||||
(with-selected-gemlog-id (fields gemlog-id)
|
||||
(when-let* ((entries (db:gemlog-entries gemlog-id))
|
||||
(event (make-instance 'program-events:gemlog-cancel-subscription-event
|
||||
:payload gemlog-id)))
|
||||
(with-blocking-notify-procedure ((format nil (_ "Canceling subscription for ~s") gemlog-id))
|
||||
(program-events:push-event event)))))
|
||||
|
||||
(defun show-gemlog-to-screen ()
|
||||
(with-selected-gemlog-id (fields gemlog-id)
|
||||
(when-let* ((entries (db:gemlog-entries gemlog-id))
|
||||
(event (make-instance 'program-events:gemlog-show-event
|
||||
:gemlog-url gemlog-id
|
||||
:title (db:row-title fields)
|
||||
:subtitle (db:row-subtitle fields)
|
||||
:entries entries)))
|
||||
(program-events:push-event event)
|
||||
(focus-to-message-window))))
|
||||
|
||||
(defun gemlog-refresh-all ()
|
||||
(with-blocking-notify-procedure ((_ "updating gemlog's subscriptions"))
|
||||
(program-events:push-event (make-instance 'program-events:gemlog-refresh-all-event))))
|
||||
|
||||
(defun prompt-for-username (prompt complete-function event
|
||||
notify-starting-message
|
||||
notify-ending-message)
|
||||
|
@ -1783,6 +1846,32 @@ mot recent updated to least recent"
|
|||
(push-event event-abort)
|
||||
(push-event event-open)))
|
||||
|
||||
(defun gemlogs-subscription-move (amount)
|
||||
(ignore-errors
|
||||
(line-oriented-window:unselect-all *gemini-subscription-window*)
|
||||
(line-oriented-window:row-move *gemini-subscription-window* amount)
|
||||
(draw *gemini-subscription-window*)))
|
||||
|
||||
(defun gemlogs-subscription-go-down ()
|
||||
(follow-request-move 1))
|
||||
|
||||
(defun gemlogs-subscription-go-up ()
|
||||
(follow-request-move -1))
|
||||
|
||||
(defun gemini-subscribe-gemlog ()
|
||||
"Subscribe to the gemlog shown in the main window.
|
||||
|
||||
The page must be formatted according to gemini subscription specifications:
|
||||
|
||||
gemini://gemini.circumlunar.space/docs/companion/subscription.gmi
|
||||
|
||||
"
|
||||
(when-let ((url (gemini-viewer:current-gemini-url)))
|
||||
(with-blocking-notify-procedure ((format nil (_ "Subscribing to ~s") url))
|
||||
(let ((event (make-instance 'gemini-gemlog-subscribe-event
|
||||
:payload url)))
|
||||
(push-event event)))))
|
||||
|
||||
(defun send-to-pipe ()
|
||||
"Send contents of window to a command"
|
||||
(flet ((on-input-complete (command)
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
(defsystem :tinmop
|
||||
:author "cage"
|
||||
:license "GPLv3"
|
||||
:version "0.4.2"
|
||||
:version "0.5.0"
|
||||
:pathname "src"
|
||||
:serial t
|
||||
:defsystem-depends-on ("cffi-grovel")
|
||||
|
@ -89,7 +89,8 @@
|
|||
:components ((:file "package")
|
||||
(:file "gemini-constants")
|
||||
(:file "gemini-parser")
|
||||
(:file "client")))
|
||||
(:file "client")
|
||||
(:file "subscription")))
|
||||
(:file "command-line")
|
||||
(:file "specials")
|
||||
(:file "keybindings")
|
||||
|
@ -113,6 +114,7 @@
|
|||
(:file "open-attach-window")
|
||||
(:file "open-message-link-window")
|
||||
(:file "gemini-client-certificates-window")
|
||||
(:file "gemini-subscription-window")
|
||||
(:file "command-window")
|
||||
(:file "sending-message")
|
||||
(:file "follow-requests")
|
||||
|
|
Loading…
Reference in New Issue