1
0
Fork 0

Compare commits

...

13 Commits

Author SHA1 Message Date
cage 6e91a0f4b4 - updated version. 2021-01-10 13:37:16 +01:00
cage 77821cb025 - updated NEWS.org. 2021-01-10 13:18:25 +01:00
cage a02fc51efd - tracking changes. 2021-01-10 13:14:26 +01:00
cage c8fc25dddd - updated italian translation. 2021-01-10 13:05:43 +01:00
cage 44b6c62e44 - [gemini]
- added command to refresh all gemlogs;
  - added scheduled refresh of all gemlogs;
  - fixed sorting of gemlog posts.
2021-01-10 13:01:03 +01:00
cage f09b0f4aa3 - [gemini]
- prevent crash when subscribing to an already subscribed gemlog;
  - added cancel of subscriptions.
2021-01-10 11:35:28 +01:00
cage 03d33bc719 - using pkg-config for checking libidn2 with configure script. 2021-01-09 20:42:56 +01:00
cage 0cb5ef9c29 - used pkg-config in the libidn2 grovel file (thanks to yumh!). 2021-01-09 19:38:58 +01:00
cage eac0b7b5a7 - fixed message. 2021-01-09 16:28:59 +01:00
cage a0f8c83681 - [gemini] added a draft for gemlog subscriptions. 2021-01-09 16:27:40 +01:00
cage 9b4d719e4b - updated italian translation. 2021-01-09 11:02:46 +01:00
cage f6c02041ef - [gemini] added subscription command to gemlog. 2021-01-09 11:01:10 +01:00
cage 7e32091b6f - [gemini]
Started with gemlog subscription, added database table and interface
  and subscribing API.
2021-01-08 18:21:43 +01:00
28 changed files with 1668 additions and 312 deletions

View File

@ -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,

View File

@ -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@

View File

@ -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

276
aclocal.m4 vendored
View File

@ -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

279
configure vendored
View File

@ -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\\"

View File

@ -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.]))

View File

@ -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

View File

@ -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
View File

@ -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: "

View File

@ -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 ""

View File

@ -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)))))

View File

@ -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*))

View File

@ -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

View File

@ -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))

View File

@ -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))

View File

@ -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)))))))

View File

@ -1,5 +1,7 @@
(in-package :idn)
(pkg-config-cflags "libidn2")
(include "idn2.h")
(cenum (idn2-rc)

View File

@ -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

View File

@ -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:

View File

@ -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"

View File

@ -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

View File

@ -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))

View File

@ -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)

View File

@ -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))

View File

@ -367,6 +367,7 @@
message-window
chat-window
chats-list-window
gemini-subscription-window
attachment-header
max-numbers-allowed-attachments
max-message-length

View File

@ -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.")

View File

@ -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)

View File

@ -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")