More powerful match criteria for fragments

This commit is contained in:
Kovid Goyal 2020-09-19 07:31:17 +05:30
parent 7b3e345a2a
commit 581126c748
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
5 changed files with 16 additions and 10 deletions

View File

@ -14,13 +14,12 @@ following contents:
# Open any file with a fragment in vim, fragments are generated
# by the hyperlink_grep kitten and nothing else so far.
protocol file
has_fragment yes
fragment_matches [0-9]+
action launch --type=overlay vim +${FRAGMENT} ${FILE_PATH}
# Open text files without fragments in the editor
protocol file
mime text/*
has_fragment no
action launch --type=overlay ${EDITOR} ${FILE_PATH}

View File

@ -75,8 +75,9 @@ lines. The various available criteria are:
``url``
A regular expression that must match against the entire (unquoted) URL
``has_fragment``
A boolean (``yes/no``) on whether the URL has a fragment or not.
``fragment_matches``
A regular expression that must match against the fragment (part after #) in
the URL
``mime``
A comma separated list of MIME types, for example: ``text/*, image/*,

View File

@ -12,7 +12,7 @@ from typing import (
)
from urllib.parse import ParseResult, unquote, urlparse
from .conf.utils import to_bool, to_cmdline
from .conf.utils import to_cmdline
from .config import KeyAction, parse_key_action
from .constants import config_dir
from .typing import MatchType
@ -53,7 +53,7 @@ def parse(lines: Iterable[str]) -> Generator[OpenAction, None, None]:
x = parse_key_action(rest)
if x is not None:
actions.append(x)
elif key in ('mime', 'ext', 'protocol', 'file', 'path', 'url', 'has_fragment'):
elif key in ('mime', 'ext', 'protocol', 'file', 'path', 'url', 'fragment_matches'):
if key != 'url':
rest = rest.lower()
match_criteria.append(MatchCriteria(cast(MatchType, key), rest))
@ -107,8 +107,14 @@ def url_matches_criterion(purl: 'ParseResult', url: str, unquoted_path: str, mc:
return True
return False
if mc.type == 'has_fragment':
return to_bool(mc.value) == bool(purl.fragment)
if mc.type == 'fragment_matches':
import re
try:
pat = re.compile(mc.value)
except re.error:
return False
return pat.search(unquote(purl.fragment)) is not None
if mc.type == 'path':
import fnmatch

View File

@ -43,7 +43,7 @@ from .config import ( # noqa; noqa
)
EdgeLiteral = Literal['left', 'top', 'right', 'bottom']
MatchType = Literal['mime', 'ext', 'protocol', 'file', 'path', 'url', 'has_fragment']
MatchType = Literal['mime', 'ext', 'protocol', 'file', 'path', 'url', 'fragment_matches']
GRT_a = Literal['t', 'T', 'q', 'p', 'd']
GRT_f = Literal[24, 32, 100]
GRT_t = Literal['d', 'f', 't', 's']

View File

@ -29,7 +29,7 @@ class TestOpenActions(BaseTest):
spec = '''
protocol file
mime text/*
has_fragment yes
fragment_matches .
AcTion launch $EDITOR $FILE_PATH $FRAGMENT
action