Контракт

Действие определяет transform(text). То, что оно вернёт, превращается в текст и вставляется туда, где вы пишете.

def transform(text):
    return text.upper()

Верните None, чтобы не вставлять ничего. Для быстрой пробы задайте переменную result на верхнем уровне вместо функции.

Откуда берётся текст

ВводЧто получает действие
НичегоСоздаёт текст с нуля. transform("").
Текущее словоПередаёт слово, которое вы набираете, в transform(text).
ВыделениеПередаёт выделенный текст или ничего, если ничего не выделено.
Текущая строкаПередаёт строку, на которой стоит курсор.
Текущее предложениеПередаёт предложение, в котором стоит курсор.
Текст перед курсоромПередаёт всё, что до курсора.
Текст после курсораПередаёт всё, что идёт после курсора.
Всё полеПередаёт всё поле — по обе стороны от курсора.
Буфер обменаПередаёт текст из буфера обмена. Требуется полный доступ.

«Заменять ввод» решает, встанет ли результат на место того, что пришло. Это касается каждого источника, который читает поле. У «Ничего» и «Буфера обмена» в документе заменять нечего, поэтому их результат всегда вставляется.

def transform(text):
    words = len(text.split())
    return f"{words} words"
Читает текст перед курсором и при выключенной замене введённого добавляет подсчёт.

Просьба к клавиатуре

Действие может пользоваться теми же командами, что и панель, вместо возврата одной строки. Так действие делает больше одной правки или оставляет курсор в нужном месте.

def transform(text):
    replace(len(text), "(" + text + ")")
    move_cursor(-1)
Заключить слово в скобки и вернуть курсор внутрь скобки.

toast() и close() принадлежат панелям: у действия нет своей поверхности, чтобы показать сообщение. В консоли при написании оба всё равно видны.

Язык

Скрипты работают на собственном интерпретаторе Clink, а не на CPython. Он читает полезное подмножество Python: списковые включения, lambda, кортежи, множества, форматы f-строк, try и except. Остальное он отвергает сообщением с номером строки.

Типы

  • int
  • float
  • str
  • bool
  • None
  • list
  • tuple
  • dict
  • set

Ключевые слова

  • if
  • elif
  • else
  • while
  • for
  • in
  • def
  • return
  • break
  • continue
  • pass
  • True
  • False
  • None
  • and
  • or
  • not
  • lambda
  • try
  • except
  • finally
  • raise
  • import
  • from
  • as
  • is
  • del
  • global

Встроенные функции

  • len
  • str
  • repr
  • print
  • int
  • float
  • bool
  • abs
  • round
  • min
  • max
  • sum
  • range
  • sorted
  • reversed
  • list
  • dict
  • set
  • tuple
  • enumerate
  • zip
  • ord
  • chr
  • any
  • all
  • type
  • map
  • filter
  • divmod
  • pow
  • hex
  • bin
  • oct
  • format
  • isinstance
  • callable

Методы строк

  • upper
  • lower
  • casefold
  • title
  • capitalize
  • swapcase
  • strip
  • lstrip
  • rstrip
  • replace
  • split
  • rsplit
  • splitlines
  • join
  • startswith
  • endswith
  • find
  • rfind
  • index
  • rindex
  • count
  • partition
  • rpartition
  • zfill
  • ljust
  • rjust
  • center
  • isdigit
  • isnumeric
  • isalpha
  • isalnum
  • isspace
  • isupper
  • islower
  • istitle
  • removeprefix
  • removesuffix
  • format

Методы списков

  • append
  • extend
  • pop
  • insert
  • remove
  • index
  • count
  • sort
  • reverse
  • clear
  • copy

Методы словарей

  • keys
  • values
  • items
  • get
  • pop
  • popitem
  • setdefault
  • update
  • clear
  • copy

Методы множеств

  • add
  • discard
  • remove
  • pop
  • clear
  • copy
  • update
  • union
  • intersection
  • difference
  • symmetric_difference
  • issubset
  • issuperset
  • isdisjoint

Методы кортежей

  • count
  • index

Методы совпадения регулярного выражения

  • group
  • groups
  • groupdict
  • start
  • end
  • span

Исключения

  • Exception
  • ValueError
  • TypeError
  • KeyError
  • IndexError
  • NameError
  • ZeroDivisionError
  • AttributeError
  • RuntimeError
  • StopIteration

Отклоняется

  • class
  • with
  • nonlocal
  • assert
  • yield
  • async
  • await
  • match

Пространства имён

Импортировать можно эти пространства имён и ничего больше. Каждое только вычисляет: файловой системы, сети и процессов для скрипта попросту нет.

import json

  • dumps
  • loads

import math

  • acos
  • asin
  • atan
  • atan2
  • ceil
  • comb
  • copysign
  • cos
  • degrees
  • e
  • exp
  • fabs
  • factorial
  • floor
  • fmod
  • gcd
  • hypot
  • inf
  • isfinite
  • isinf
  • isnan
  • lcm
  • log
  • log10
  • log2
  • nan
  • pi
  • pow
  • prod
  • radians
  • sin
  • sqrt
  • tan
  • tau
  • trunc

import random

  • choice
  • choices
  • randint
  • random
  • randrange
  • sample
  • seed
  • shuffle
  • uniform

import re

  • DOTALL
  • I
  • IGNORECASE
  • M
  • MULTILINE
  • S
  • escape
  • findall
  • finditer
  • fullmatch
  • match
  • search
  • split
  • sub
  • subn

import sys

  • version

import time

  • format
  • monotonic
  • parts
  • time
import re

def transform(text):
    return re.sub(r"\s+", " ", text).strip()
Схлопывание подряд идущих пробелов регулярным выражением.

Движок регулярных выражений у Clink собственный, и он тратит тот же бюджет шагов, что и остальной скрипт: шаблон, который иначе работал бы вечно, заканчивается ошибкой, а не клавиатурой, переставшей отвечать. Обратные ссылки и lookaround не поддерживаются.

Почему не CPython

У расширения клавиатуры жёсткий потолок памяти, и iOS завершает его без предупреждения, как только он превышен. Полноценная среда Python рядом с клавиатурой не поместится, поэтому Clink несёт маленький интерпретатор, написанный под эту задачу: без импортов, без файлов, без сети и с бюджетом шагов, который останавливает сорвавшийся скрипт, а не клавиатуру.

print уходит в консоль редактора и никогда в то, что вы пишете.

Как поделиться

«Поделиться действием» создаёт файл .clinkext, а «Импортировать действие» возвращает его с новым идентификатором. Действие остаётся меньше 48 000 байт и должно определять def transform(.

Конструктор ›
Загрузить в App Store