mirror of
https://codeberg.org/fediverse/fep.git
synced 2026-08-09 14:05:53 +00:00
Deploying from 7b86e20b33 [SKIP CI]
This commit is contained in:
@@ -1383,6 +1383,15 @@
|
||||
<td><a href="https://codeberg.org/fediverse/fep/src/branch/main/fep/c195/fep-c195.md"><img src='../assets/codeberg.png' width=20 height=20 alt='codeberg'></a></td>
|
||||
<td>Informational</td>
|
||||
<td></td>
|
||||
<td><a href="https://codeberg.org/fediverse/fep/issues/790">#790</a></td>
|
||||
<td><a href="https://codeberg.org/steve-bate/fep/issues">Discussions</a></td>
|
||||
<td>2026-03-17</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="../fep/f011/">FEP-f011: Full-Text Search Query Syntax for ActivityPub</a></td>
|
||||
<td><a href="https://codeberg.org/fediverse/fep/src/branch/main/fep/f011/fep-f011.md"><img src='../assets/codeberg.png' width=20 height=20 alt='codeberg'></a></td>
|
||||
<td>Informational</td>
|
||||
<td></td>
|
||||
<td>-</td>
|
||||
<td><a href="https://codeberg.org/steve-bate/fep/issues">Discussions</a></td>
|
||||
<td>2026-03-17</td>
|
||||
|
||||
@@ -681,6 +681,7 @@
|
||||
<th>Authors</th>
|
||||
<th>Status</th>
|
||||
<th>Date received</th>
|
||||
<th>Tracking issue</th>
|
||||
<th>Discussions</th>
|
||||
<th>Repository</th>
|
||||
</tr>
|
||||
@@ -690,6 +691,7 @@
|
||||
<td>Steve Bate <a href="mailto:svc-fep@stevebate.net">svc-fep@stevebate.net</a></td>
|
||||
<td><code>DRAFT</code></td>
|
||||
<td>2026-03-17</td>
|
||||
<td><a href="https://codeberg.org/fediverse/fep/issues/790">#790</a></td>
|
||||
<td><a href="https://codeberg.org/steve-bate/fep/issues">Discussions</a></td>
|
||||
<td><a href="https://codeberg.org/fediverse/fep/src/branch/main/fep/c195/fep-c195.md">codeberg</a></td>
|
||||
</tr>
|
||||
|
||||
@@ -0,0 +1,100 @@
|
||||
// Tested with: http://lab.antlr.org/
|
||||
|
||||
grammar Query;
|
||||
|
||||
// ================== Parser rules ==================
|
||||
|
||||
// New explicit start rule
|
||||
query
|
||||
: expr EOF
|
||||
;
|
||||
|
||||
expr
|
||||
: or_expr
|
||||
;
|
||||
|
||||
|
||||
or_expr
|
||||
: and_expr (OR and_expr)*
|
||||
;
|
||||
|
||||
and_expr
|
||||
: unary ((AND unary) | unary)*
|
||||
;
|
||||
|
||||
unary
|
||||
: NOT unary
|
||||
| primary
|
||||
;
|
||||
|
||||
primary
|
||||
: term
|
||||
| phrase
|
||||
| regex
|
||||
| range
|
||||
| facet_expr
|
||||
| LPAREN expr RPAREN
|
||||
;
|
||||
|
||||
facet_expr
|
||||
: WORD COLON (primary | LPAREN expr RPAREN)
|
||||
;
|
||||
|
||||
range
|
||||
: (LBRACK | LBRACE) bound TO bound (RBRACK | RBRACE)
|
||||
;
|
||||
|
||||
bound
|
||||
: WORD
|
||||
| phrase
|
||||
;
|
||||
|
||||
term
|
||||
: WORD
|
||||
;
|
||||
|
||||
// Parser-level wrappers for PHRASE and REGEX tokens
|
||||
phrase
|
||||
: PHRASE
|
||||
;
|
||||
|
||||
regex
|
||||
: REGEX
|
||||
;
|
||||
|
||||
// ================== Lexer rules ==================
|
||||
|
||||
// Keywords
|
||||
AND : 'AND';
|
||||
OR : 'OR';
|
||||
NOT : 'NOT';
|
||||
TO : 'TO';
|
||||
|
||||
// Delimiters / punctuation
|
||||
COLON : ':';
|
||||
LPAREN : '(';
|
||||
RPAREN : ')';
|
||||
LBRACK : '[';
|
||||
RBRACK : ']';
|
||||
LBRACE : '{';
|
||||
RBRACE : '}';
|
||||
|
||||
// WORD: run of non-space, non-delimiter, non-quote, non-slash characters.
|
||||
WORD
|
||||
: ~[ \t\r\n"/:(){}[\]]+
|
||||
;
|
||||
|
||||
// phrase := '"' <any-char-except-quote>* '"'
|
||||
PHRASE
|
||||
: '"' (~["\r\n])+ '"'
|
||||
;
|
||||
|
||||
// regex := '/' <regex-body> '/'
|
||||
REGEX
|
||||
: '/' (~[/\r\n])+ '/'
|
||||
;
|
||||
|
||||
// All whitespace skipped
|
||||
WS
|
||||
: [ \t\r\n]+ -> skip
|
||||
;
|
||||
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"@context": [
|
||||
"https://www.w3.org/ns/activitystreams",
|
||||
{
|
||||
"fepf011": "https://w3id.org/fep/f011#",
|
||||
"endpoints": {
|
||||
"@id": "https://www.w3.org/ns/activitypub#endpoints",
|
||||
"@context": {
|
||||
"search": {
|
||||
"@id": "fepf011:search",
|
||||
"@type": "@id"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,965 @@
|
||||
|
||||
<!doctype html>
|
||||
<html lang="en" class="no-js">
|
||||
<head>
|
||||
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||
|
||||
<meta name="description" content="This proposal defines a full-text search syntax for ActivityPub client support. The syntax supports Terms and quoted phrases Faceted search (facet value) Boolean operators (AND, OR, NOT) Parenthesized groups Implicit AND between adjacent expressions Regex literals (/.../) Inclusive, exclusive, and mixed range bounds ([a TO b], {a TO b}, [a TO b}) ">
|
||||
|
||||
|
||||
|
||||
<link rel="canonical" href="https://helge.codeberg.page/fep/fep/f011/">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="icon" href="../../assets/logo.png">
|
||||
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.5">
|
||||
|
||||
|
||||
|
||||
<title>FEP-f011: Full-Text Search Query Syntax for ActivityPub - Fediverse Enhancement Proposals</title>
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css">
|
||||
|
||||
|
||||
<link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="../../styles/theme.css">
|
||||
|
||||
<script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo">
|
||||
|
||||
|
||||
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
|
||||
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
|
||||
<label class="md-overlay" for="__drawer"></label>
|
||||
<div data-md-component="skip">
|
||||
|
||||
|
||||
<a href="#fep-f011-full-text-search-query-syntax-for-activitypub" class="md-skip">
|
||||
Skip to content
|
||||
</a>
|
||||
|
||||
</div>
|
||||
<div data-md-component="announce">
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<header class="md-header" data-md-component="header">
|
||||
<nav class="md-header__inner md-grid" aria-label="Header">
|
||||
<a href="../.." title="Fediverse Enhancement Proposals" class="md-header__button md-logo" aria-label="Fediverse Enhancement Proposals" data-md-component="logo">
|
||||
|
||||
<img src="../../assets/logo.png" alt="logo">
|
||||
|
||||
</a>
|
||||
<label class="md-header__button md-icon" for="__drawer">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
|
||||
</label>
|
||||
<div class="md-header__title" data-md-component="header-title">
|
||||
<div class="md-header__ellipsis">
|
||||
<div class="md-header__topic">
|
||||
<span class="md-ellipsis">
|
||||
Fediverse Enhancement Proposals
|
||||
</span>
|
||||
</div>
|
||||
<div class="md-header__topic" data-md-component="header-topic">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
FEP-f011: Full-Text Search Query Syntax for ActivityPub
|
||||
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<form class="md-header__option" data-md-component="palette">
|
||||
|
||||
|
||||
|
||||
|
||||
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_0">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_1" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_1">
|
||||
|
||||
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_0" hidden>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
|
||||
</label>
|
||||
|
||||
|
||||
</form>
|
||||
|
||||
|
||||
|
||||
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<label class="md-header__button md-icon" for="__search">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
||||
</label>
|
||||
<div class="md-search" data-md-component="search" role="dialog">
|
||||
<label class="md-search__overlay" for="__search"></label>
|
||||
<div class="md-search__inner" role="search">
|
||||
<form class="md-search__form" name="search">
|
||||
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
|
||||
<label class="md-search__icon md-icon" for="__search">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
|
||||
</label>
|
||||
<nav class="md-search__options" aria-label="Search">
|
||||
|
||||
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
|
||||
</button>
|
||||
</nav>
|
||||
|
||||
</form>
|
||||
<div class="md-search__output">
|
||||
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
|
||||
<div class="md-search-result" data-md-component="search-result">
|
||||
<div class="md-search-result__meta">
|
||||
Initializing search
|
||||
</div>
|
||||
<ol class="md-search-result__list" role="presentation"></ol>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="md-header__source">
|
||||
<a href="https://codeberg.org/fediverse/fep" title="Go to repository" class="md-source" data-md-component="source">
|
||||
<div class="md-source__icon md-icon">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
|
||||
</div>
|
||||
<div class="md-source__repository">
|
||||
fediverse/fep
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
</nav>
|
||||
|
||||
</header>
|
||||
|
||||
<div class="md-container" data-md-component="container">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
|
||||
<div class="md-grid">
|
||||
<ul class="md-tabs__list">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-tabs__item">
|
||||
<a href="../.." class="md-tabs__link">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Fediverse Enhancement Proposals
|
||||
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-tabs__item">
|
||||
<a href="../../final/" class="md-tabs__link">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Final
|
||||
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-tabs__item">
|
||||
<a href="../../draft/" class="md-tabs__link">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Draft
|
||||
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-tabs__item">
|
||||
<a href="../../withdrawn/" class="md-tabs__link">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Withdrawn
|
||||
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
|
||||
|
||||
<main class="md-main" data-md-component="main">
|
||||
<div class="md-main__inner md-grid">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" hidden>
|
||||
<div class="md-sidebar__scrollwrap">
|
||||
<div class="md-sidebar__inner">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
|
||||
<label class="md-nav__title" for="__drawer">
|
||||
<a href="../.." title="Fediverse Enhancement Proposals" class="md-nav__button md-logo" aria-label="Fediverse Enhancement Proposals" data-md-component="logo">
|
||||
|
||||
<img src="../../assets/logo.png" alt="logo">
|
||||
|
||||
</a>
|
||||
Fediverse Enhancement Proposals
|
||||
</label>
|
||||
|
||||
<div class="md-nav__source">
|
||||
<a href="https://codeberg.org/fediverse/fep" title="Go to repository" class="md-source" data-md-component="source">
|
||||
<div class="md-source__icon md-icon">
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
|
||||
</div>
|
||||
<div class="md-source__repository">
|
||||
fediverse/fep
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<ul class="md-nav__list" data-md-scrollfix>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../.." class="md-nav__link">
|
||||
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
Fediverse Enhancement Proposals
|
||||
|
||||
|
||||
|
||||
</span>
|
||||
|
||||
|
||||
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../../final/" class="md-nav__link">
|
||||
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
Final
|
||||
|
||||
|
||||
|
||||
</span>
|
||||
|
||||
|
||||
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../../draft/" class="md-nav__link">
|
||||
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
Draft
|
||||
|
||||
|
||||
|
||||
</span>
|
||||
|
||||
|
||||
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../../withdrawn/" class="md-nav__link">
|
||||
|
||||
|
||||
|
||||
<span class="md-ellipsis">
|
||||
|
||||
|
||||
Withdrawn
|
||||
|
||||
|
||||
|
||||
</span>
|
||||
|
||||
|
||||
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
|
||||
<div class="md-sidebar__scrollwrap">
|
||||
<div class="md-sidebar__inner">
|
||||
|
||||
|
||||
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<label class="md-nav__title" for="__toc">
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
Table of contents
|
||||
</label>
|
||||
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#summary" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
Summary
|
||||
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#terminology" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
Terminology
|
||||
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#query-syntax" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
Query Syntax
|
||||
|
||||
</span>
|
||||
</a>
|
||||
|
||||
<nav class="md-nav" aria-label="Query Syntax">
|
||||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#grammar" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
Grammar
|
||||
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#token-rules" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
Token Rules
|
||||
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#operator-precedence" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
Operator Precedence
|
||||
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#faceted-expressions" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
Faceted Expressions
|
||||
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#range-expressions" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
Range Expressions
|
||||
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#search-endpoint-discovery" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
Search Endpoint Discovery
|
||||
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#http-usage" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
HTTP Usage
|
||||
|
||||
</span>
|
||||
</a>
|
||||
|
||||
<nav class="md-nav" aria-label="HTTP Usage">
|
||||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#responses" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
Responses
|
||||
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#example-1-simple-primary-term" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
Example 1: Simple Primary Term
|
||||
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#example-2-faceted-unfaceted-phrase" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
Example 2: Faceted + Unfaceted phrase
|
||||
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#example-3-boolean-grouping" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
Example 3: Boolean + Grouping
|
||||
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#example-4-regex" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
Example 4: Regex
|
||||
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#example-5-range" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
Example 5: Range
|
||||
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#error-handling" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
Error Handling
|
||||
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#interoperability-notes" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
Interoperability Notes
|
||||
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#implementations" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
Implementations
|
||||
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#copyright" class="md-nav__link">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
Copyright
|
||||
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="md-content" data-md-component="content">
|
||||
|
||||
<article class="md-content__inner md-typeset">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<h1 id="fep-f011-full-text-search-query-syntax-for-activitypub">FEP-f011: Full-Text Search Query Syntax for ActivityPub<a class="headerlink" href="#fep-f011-full-text-search-query-syntax-for-activitypub" title="Permanent link">¶</a></h1>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Authors</th>
|
||||
<th>Status</th>
|
||||
<th>Date received</th>
|
||||
<th>Discussions</th>
|
||||
<th>Repository</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Steve Bate <a href="mailto:svc-fep@stevebate.net">svc-fep@stevebate.net</a></td>
|
||||
<td><code>DRAFT</code></td>
|
||||
<td>2026-03-17</td>
|
||||
<td><a href="https://codeberg.org/steve-bate/fep/issues">Discussions</a></td>
|
||||
<td><a href="https://codeberg.org/fediverse/fep/src/branch/main/fep/f011/fep-f011.md">codeberg</a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h2 id="summary">Summary<a class="headerlink" href="#summary" title="Permanent link">¶</a></h2>
|
||||
<p>This proposal defines a full-text search syntax for ActivityPub client support.</p>
|
||||
<p>The syntax supports:</p>
|
||||
<ul>
|
||||
<li>Terms and quoted phrases</li>
|
||||
<li>Faceted search (<code>facet:value</code>)</li>
|
||||
<li>Boolean operators (<code>AND</code>, <code>OR</code>, <code>NOT</code>)</li>
|
||||
<li>Parenthesized groups</li>
|
||||
<li>Implicit <code>AND</code> between adjacent expressions</li>
|
||||
<li>Regex literals (<code>/.../</code>)</li>
|
||||
<li>Inclusive, exclusive, and mixed range bounds (<code>[a TO b]</code>, <code>{a TO b}</code>, <code>[a TO b}</code>)</li>
|
||||
</ul>
|
||||
<h2 id="terminology">Terminology<a class="headerlink" href="#terminology" title="Permanent link">¶</a></h2>
|
||||
<p>The term <em>query string</em> means the value of the <code>q</code> query parameter in an HTTP request
|
||||
against a search endpoint.</p>
|
||||
<p>The term <em>faceted expression</em> means <code><facet>:expr</code>, where <code>expr</code> may be a term,
|
||||
phrase, regex, range, or parenthesized subexpression and the <em>facet</em> is typically a JSON property path.</p>
|
||||
<p>The term <em>unfaceted expression</em> means a term, phrase, regex, or group that does not
|
||||
have a facet prefix.</p>
|
||||
<h2 id="query-syntax">Query Syntax<a class="headerlink" href="#query-syntax" title="Permanent link">¶</a></h2>
|
||||
<h3 id="grammar">Grammar<a class="headerlink" href="#grammar" title="Permanent link">¶</a></h3>
|
||||
<p>The (simplified) grammar proposed by this FEP is:</p>
|
||||
<div class="highlight"><pre><span></span><code><span class="k">query </span><span class="err">:</span><span class="o">=</span> <span class="k">or_expr</span>
|
||||
<span class="k">or_expr </span><span class="err">:=</span> <span class="k">and_expr </span><span class="p">(</span><span class="s2">"OR"</span> <span class="k">and_expr</span><span class="p">)</span><span class="err">*</span>
|
||||
<span class="k">and_expr </span><span class="err">:=</span> <span class="k">unary </span><span class="p">((</span><span class="s2">"AND"</span> <span class="k">unary</span><span class="p">)</span> <span class="p">|</span> <span class="p">(</span><span class="k">implicit_and unary</span><span class="p">))</span><span class="err">*</span>
|
||||
<span class="k">unary </span><span class="err">:=</span> <span class="s2">"NOT"</span> <span class="k">unary </span><span class="p">|</span> <span class="k">primary</span>
|
||||
<span class="k">primary </span><span class="err">:=</span> <span class="k">term </span><span class="p">|</span> <span class="k">phrase </span><span class="p">|</span> <span class="k">regex </span><span class="p">|</span> <span class="k">range </span><span class="p">|</span> <span class="k">field_expr </span><span class="p">|</span> <span class="s2">"("</span> <span class="k">query </span><span class="s2">")"</span>
|
||||
<span class="k">field_expr </span><span class="err">:=</span> <span class="k">WORD </span><span class="s2">":"</span> <span class="p">(</span><span class="k">primary </span><span class="p">|</span> <span class="s2">"("</span> <span class="k">query </span><span class="s2">")"</span><span class="p">)</span>
|
||||
<span class="k">range </span><span class="err">:=</span> <span class="p">(</span><span class="s2">"["</span> <span class="p">|</span> <span class="s2">"{"</span><span class="p">)</span> <span class="k">bound TO bound </span><span class="p">(</span><span class="s2">"]"</span> <span class="p">|</span> <span class="s2">"}"</span><span class="p">)</span>
|
||||
<span class="k">bound </span><span class="err">:=</span> <span class="k">WORD </span><span class="p">|</span> <span class="k">phrase</span>
|
||||
<span class="k">phrase </span><span class="err">:=</span> <span class="s1">'"'</span> <span class="err"><</span><span class="k">any-char-except-quote</span><span class="err">>*</span> <span class="s1">'"'</span>
|
||||
<span class="k">regex </span><span class="err">:=</span> <span class="s2">"/"</span> <span class="err"><</span><span class="k">regex-body</span><span class="err">></span> <span class="s2">"/"</span>
|
||||
<span class="k">term </span><span class="err">:=</span> <span class="k">WORD</span>
|
||||
</code></pre></div>
|
||||
<p>An AND is implicit when two primaries are adjacent. The "regex-body" SHOULD conform to <a href="https://www.rfc-editor.org/rfc/rfc9485.html#name-pcre-re2-and-ruby-regexps" title="This document specifies I-Regexp, a flavor of regular expression that is limited in scope with the goal of interoperation across many different regular expression libraries.">RFC9485</a> (Interoperable Regular Expression Format).</p>
|
||||
<p>A full ABNF grammar is <a href="fep-f011.abnf">available</a>. This can be used with parser generators like <a href="https://www.antlr.org/">ANTLR</a>.</p>
|
||||
<h3 id="token-rules">Token Rules<a class="headerlink" href="#token-rules" title="Permanent link">¶</a></h3>
|
||||
<ul>
|
||||
<li><code>AND</code>, <code>OR</code>, <code>NOT</code>, and <code>TO</code> are recognized as operators only in uppercase.</li>
|
||||
<li><code>WORD</code> excludes whitespace and these delimiters: <code>()[]{}":/</code>.</li>
|
||||
<li>Regex literals use slash delimiters and support escaped slash characters.</li>
|
||||
</ul>
|
||||
<h3 id="operator-precedence">Operator Precedence<a class="headerlink" href="#operator-precedence" title="Permanent link">¶</a></h3>
|
||||
<p>The parser evaluates operators in this order:</p>
|
||||
<ol>
|
||||
<li>Parenthesized expressions</li>
|
||||
<li>Unary <code>NOT</code></li>
|
||||
<li><code>AND</code> (explicit and implicit)</li>
|
||||
<li><code>OR</code></li>
|
||||
</ol>
|
||||
<p><code>AND</code> and <code>OR</code> are left-associative.</p>
|
||||
<h3 id="faceted-expressions">Faceted Expressions<a class="headerlink" href="#faceted-expressions" title="Permanent link">¶</a></h3>
|
||||
<p>A fielded expression has this form:</p>
|
||||
<div class="highlight"><pre><span></span><code><facet>:value
|
||||
<facet>:"some phrase"
|
||||
<facet>:/xy.*/
|
||||
<facet>:[10 TO 20]
|
||||
<facet>:(cats OR dogs)
|
||||
</code></pre></div>
|
||||
<p><code><facet>:(...)</code> applies the nested expression to the facet value.</p>
|
||||
<h3 id="range-expressions">Range Expressions<a class="headerlink" href="#range-expressions" title="Permanent link">¶</a></h3>
|
||||
<p>Ranges support inclusive and exclusive delimiters independently:</p>
|
||||
<ul>
|
||||
<li><code>[a TO b]</code> inclusive lower and upper bounds</li>
|
||||
<li><code>{a TO b}</code> exclusive lower and upper bounds</li>
|
||||
<li><code>[a TO b}</code> inclusive lower, exclusive upper</li>
|
||||
<li><code>{a TO b]</code> exclusive lower, inclusive upper</li>
|
||||
</ul>
|
||||
<p>Unbounded bounds may use <code>*</code> where supported by the evaluator implementation
|
||||
(e.g., <code>rank:[4 TO *]</code>).</p>
|
||||
<h2 id="search-endpoint-discovery">Search Endpoint Discovery<a class="headerlink" href="#search-endpoint-discovery" title="Permanent link">¶</a></h2>
|
||||
<p>The search endpoint is specified using the <code>search</code> property of the ActivityPub actor <code>endpoints</code> object. For example:</p>
|
||||
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
||||
<span class="w"> </span><span class="nt">"@context"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
|
||||
<span class="w"> </span><span class="s2">"https://w3id.org/fep/f011"</span>
|
||||
<span class="w"> </span><span class="s2">"https://www.w3.org/ns/activitystreams"</span>
|
||||
<span class="w"> </span><span class="p">],</span>
|
||||
<span class="w"> </span><span class="err">...</span>
|
||||
<span class="w"> </span><span class="nt">"endpoints"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
|
||||
<span class="w"> </span><span class="nt">"search"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://server.example/search"</span>
|
||||
<span class="w"> </span><span class="p">}</span>
|
||||
<span class="p">}</span>
|
||||
</code></pre></div>
|
||||
<h2 id="http-usage">HTTP Usage<a class="headerlink" href="#http-usage" title="Permanent link">¶</a></h2>
|
||||
<p>This syntax is used as the <code>q</code> parameter on the search endpoint.</p>
|
||||
<div class="highlight"><pre><span></span><code>GET https://server.example/search?q=<query>
|
||||
</code></pre></div>
|
||||
<h3 id="responses">Responses<a class="headerlink" href="#responses" title="Permanent link">¶</a></h3>
|
||||
<p>Responses MUST be an ActivityPub <code>Collection</code> or <code>OrderedCollection</code>. Paging is optional. If an <code>OrderedCollection</code> is returned, the results SHOULD be considered ranked although the ranking criteria will not be known by the client ( possibilities are relevance/<a href="https://en.wikipedia.org/wiki/Okapi_BM25">BM25</a>, recency, etc.).</p>
|
||||
<h3 id="example-1-simple-primary-term">Example 1: Simple Primary Term<a class="headerlink" href="#example-1-simple-primary-term" title="Permanent link">¶</a></h3>
|
||||
<p>Request: <code>cats</code></p>
|
||||
<div class="highlight"><pre><span></span><code><span class="nf">GET</span> <span class="nn">/search?q=cats</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
|
||||
<span class="na">Host</span><span class="o">:</span> <span class="l">social.example</span>
|
||||
<span class="na">Accept</span><span class="o">:</span> <span class="l">application/activity+json</span>
|
||||
</code></pre></div>
|
||||
<h3 id="example-2-faceted-unfaceted-phrase">Example 2: Faceted + Unfaceted phrase<a class="headerlink" href="#example-2-faceted-unfaceted-phrase" title="Permanent link">¶</a></h3>
|
||||
<p>Request: <code>tag:fediverse language:en "ActivityPub client search"</code></p>
|
||||
<div class="highlight"><pre><span></span><code><span class="nf">GET</span> <span class="nn">/search?q=tag%3Afediverse%20language%3Aen%20%22ActivityPub%20client%20search%22</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
|
||||
<span class="na">Host</span><span class="o">:</span> <span class="l">social.example</span>
|
||||
<span class="na">Accept</span><span class="o">:</span> <span class="l">application/activity+json</span>
|
||||
</code></pre></div>
|
||||
<p>Response:</p>
|
||||
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
||||
<span class="w"> </span><span class="nt">"@context"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://www.w3.org/ns/activitystreams"</span><span class="p">,</span>
|
||||
<span class="w"> </span><span class="nt">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"OrderedCollection"</span><span class="p">,</span>
|
||||
<span class="w"> </span><span class="nt">"id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://social.example/search?q=tag:fediverse language:en \"ActivityPub client search\""</span><span class="p">,</span>
|
||||
<span class="w"> </span><span class="nt">"totalItems"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span>
|
||||
<span class="w"> </span><span class="nt">"orderedItems"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
|
||||
<span class="w"> </span><span class="p">{</span>
|
||||
<span class="w"> </span><span class="nt">"id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://social.example/notes/1"</span><span class="p">,</span>
|
||||
<span class="w"> </span><span class="nt">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Note"</span>
|
||||
<span class="w"> </span><span class="p">}</span>
|
||||
<span class="w"> </span><span class="p">]</span>
|
||||
<span class="p">}</span>
|
||||
</code></pre></div>
|
||||
<h3 id="example-3-boolean-grouping">Example 3: Boolean + Grouping<a class="headerlink" href="#example-3-boolean-grouping" title="Permanent link">¶</a></h3>
|
||||
<p>Request:v<code>(cats OR dogs) AND NOT testing</code></p>
|
||||
<div class="highlight"><pre><span></span><code><span class="nf">GET</span> <span class="nn">/search?q=%28cats%20OR%20dogs%29%20AND%20NOT%20testing</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
|
||||
<span class="na">Host</span><span class="o">:</span> <span class="l">social.example</span>
|
||||
<span class="na">Accept</span><span class="o">:</span> <span class="l">application/activity+json</span>
|
||||
</code></pre></div>
|
||||
<h3 id="example-4-regex">Example 4: Regex<a class="headerlink" href="#example-4-regex" title="Permanent link">¶</a></h3>
|
||||
<p>Request: <code>type:Person preferredUsername:/alic.*/</code></p>
|
||||
<div class="highlight"><pre><span></span><code><span class="err">GET /search?q=type%3APerson%20preferredUsername%3A%2Ffedi.%2A%2F</span>
|
||||
<span class="err">Host: social.example</span>
|
||||
<span class="err">Accept: application/activity+json</span>
|
||||
</code></pre></div>
|
||||
<p>This could be useful for auto completion. Using a <code>type:HashTag</code> search term could similarly be used for hashtag autocompletion.</p>
|
||||
<h3 id="example-5-range">Example 5: Range<a class="headerlink" href="#example-5-range" title="Permanent link">¶</a></h3>
|
||||
<p>Request: <code>rank:[2 TO 4]</code></p>
|
||||
<div class="highlight"><pre><span></span><code><span class="nf">GET</span> <span class="nn">/search?q=rank%3A%5B2%20TO%204%5D</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
|
||||
<span class="na">Host</span><span class="o">:</span> <span class="l">social.example</span>
|
||||
<span class="na">Accept</span><span class="o">:</span> <span class="l">application/activity+json</span>
|
||||
</code></pre></div>
|
||||
<h3 id="error-handling">Error Handling<a class="headerlink" href="#error-handling" title="Permanent link">¶</a></h3>
|
||||
<p>Invalid syntax MUST result in an HTTP client error status.
|
||||
Examples include:</p>
|
||||
<ul>
|
||||
<li>Missing closing <code>)</code></li>
|
||||
<li>Missing value after <code><facet>:</code></li>
|
||||
<li>Unterminated regex literal</li>
|
||||
<li>Missing range delimiter</li>
|
||||
</ul>
|
||||
<p>Implementations MAY include details in a problem response body.</p>
|
||||
<h2 id="interoperability-notes">Interoperability Notes<a class="headerlink" href="#interoperability-notes" title="Permanent link">¶</a></h2>
|
||||
<ul>
|
||||
<li>Operators are case-sensitive (<code>AND</code> is an operator, <code>and</code> is a term).</li>
|
||||
<li>Unfaceted regex and primary term evaluation depends on pre-configured text facets in the evaluation layer.</li>
|
||||
<li>Field capabilities are evaluator-specific</li>
|
||||
<li>This proposal standardizes syntax and parsing behavior, not ranking/scoring.</li>
|
||||
</ul>
|
||||
<h2 id="implementations">Implementations<a class="headerlink" href="#implementations" title="Permanent link">¶</a></h2>
|
||||
<ul>
|
||||
<li><a href="https://github.com/steve-bate/firm">FIRM</a></li>
|
||||
</ul>
|
||||
<h2 id="copyright">Copyright<a class="headerlink" href="#copyright" title="Permanent link">¶</a></h2>
|
||||
<p>CC0 1.0 Universal (CC0 1.0) Public Domain Dedication</p>
|
||||
<p>To the extent possible under law, the authors of this Fediverse Enhancement
|
||||
Proposal have waived all copyright and related or neighboring rights to this work.</p>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</article>
|
||||
</div>
|
||||
|
||||
|
||||
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
|
||||
</div>
|
||||
|
||||
</main>
|
||||
|
||||
<footer class="md-footer">
|
||||
|
||||
<div class="md-footer-meta md-typeset">
|
||||
<div class="md-footer-meta__inner md-grid">
|
||||
<div class="md-copyright">
|
||||
|
||||
|
||||
Made with
|
||||
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
|
||||
Material for MkDocs
|
||||
</a>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
</div>
|
||||
<div class="md-dialog" data-md-component="dialog">
|
||||
<div class="md-dialog__inner md-typeset"></div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script id="__config" type="application/json">{"annotate": null, "base": "../..", "features": ["navigation.tabs"], "search": "../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
|
||||
|
||||
|
||||
<script src="../../assets/javascripts/bundle.79ae519e.min.js"></script>
|
||||
|
||||
<script src="../../javascripts/tablesort@5.3.0/tablesort.min.js"></script>
|
||||
|
||||
<script src="../../javascripts/tablesort.js"></script>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
File diff suppressed because one or more lines are too long
@@ -616,6 +616,10 @@
|
||||
<loc>https://helge.codeberg.page/fep/fep/efda/</loc>
|
||||
<lastmod>2026-03-17</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://helge.codeberg.page/fep/fep/f011/</loc>
|
||||
<lastmod>2026-03-17</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://helge.codeberg.page/fep/fep/f06f/</loc>
|
||||
<lastmod>2026-03-17</lastmod>
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user