Filters allow you to modify [[variables]] in [[Obsidian Web Clipper/Templates|Web Clipper templates]]. Filters are applied to variables using the syntax `{{variable|filter}}`. - Filters work for any kind of [[Variables|variable]] including `meta`, `selector`, and `schema` variables. - Filters can be chained, e.g. `{{variable|filter1|filter2}}`, and are applied in the order they are added. ## Dates and numbers Filters that convert dates and numbers. - `date` converts a date to the specified format, [see reference](https://day.js.org/docs/en/display/format). - `{{date|date:"YYYY-MM-DD"}}` converts the current date to "YYYY-MM-DD". - Use `date:("outputFormat", "inputFormat")` to specify the input format, e.g. `"12/01/2024"|date:("YYYY-MM-DD", "MM/DD/YYYY")` parses "12/01/2024" and returns `"2024-12-01"`. - `date_modify` modifies a date by adding or subtracting a specified amount of time, [see reference](https://day.js.org/docs/en/manipulate/add). - `"2024-12-01"|date_modify:"+1 year"` returns `"2025-12-01"` - `"2024-12-01"|date_modify:"- 2 months"` returns `"2024-10-01"` - `round` rounds a number to the nearest integer or to a specified number of decimal places. - Without parameters: `3.7|round` returns `4`. - With decimal places specified: `3.14159|round:2` returns `3.14`. ## Text conversion and capitalization Filters that convert text strings from one format to another. - `camel` converts text to `camelCase`. - `capitalize` capitalizes the first character of the value and converts the rest to lowercase, e.g. `"hELLO wORLD"|capitalize` returns `"Hello world"`. - `kebab` converts text to `kebab-case`. - `lower` converts text to `lowercase`. - `pascal` converts text to `PascalCase`. - `replace` replaces occurrences of specified text: - Simple replacement: `"hello!"|replace:",":""` removes all commas. - Multiple replacements: `"hello world"|replace:("e":"a","o":"0")` returns `"hall0 w0rld"`. - Replacements are applied in the order they are specified. - To remove specified text, use `""` as the replacement value. - Special characters including `: | { } ( ) ' "` should be escaped with a backslash when used in the search term, e.g. `\:` to search for a literal colon. - `safe_name` converts text to a safe file name. - By default, `safe_name` applies the most conservative sanitization rules. - OS-specific rules can be applied with `safe_name:os` where `os` can be `windows`, `mac`, or `linux` to only apply the rules for that operating system. - `snake` converts text to `snake_case`. - `title` converts text to `Title Case`, e.g. `"hello world"|title` returns `"Hello World"`. - `trim` removes white space from both ends of a string. - `" hello world "|trim` returns `"hello world"`. - `uncamel` converts camelCase or PascalCase to space-separated words, which you can further format with other filters like `title` or `capitalize`. - `"camelCase"|uncamel` returns `"camel case"`. - `"PascalCase"|uncamel` returns `"pascal case"`. - `upper` converts a value to uppercase, e.g. `"hello world"|upper` returns `"HELLO WORLD"`. ## Text formatting Filters that apply [[Basic formatting syntax]] and [[Advanced formatting syntax]] to text. - `blockquote` adds a Markdown quote prefix (`> `) to each line of the input. - `callout` creates a [[Callouts|callout]] with optional parameters: `{{variable|callout:("type", "title", foldState)}}` - `type` is the callout type, and defaults to "info" - `title` is the callout title, and defaults to empty - `foldState` is a boolean to set the fold state (true for folded, false for unfolded, null for not foldable) - `footnote` converts an array or object into a list of Markdown footnotes. - For arrays: `["first item","second item"]|footnote` returns: `[^1]: first item` etc. - For objects: `{"First Note": "Content 1", "Second Note": "Content 2"}|footnote` returns: `[^first-note]: Content 1` etc. - `fragment_link` converts strings and arrays into [text fragment](https://developer.mozilla.org/en-US/docs/Web/URI/Fragment/Text_fragments) links. Defaults to "link" for the link text. - `highlights|fragment` returns `Highlight content [link](text-fragment-url)` - `highlights|fragment:"custom title"` returns `Highlight content [custom title](text-fragment-url)` - `image` converts strings, arrays, or objects into Markdown image syntax. - For strings: `"image.jpg"|image:"alt text"` returns `![alt text](image.jpg)`. - For arrays: `["image1.jpg","image2.jpg"]|image:"alt text"` returns an array of Markdown image strings with the same alt text for all images. - For objects: `{"image1.jpg": "Alt 1", "image2.jpg": "Alt 2"}|image` returns Markdown image strings with alt text from the object keys. - `link` converts strings, arrays, or objects into Markdown link syntax (not to be confused with a [[Link notes|wikilink]]). - For strings: `"url"|link:"author"` returns `[author](url)`. - For arrays: `["url1","url2"]|link:"author"` returns an array of Markdown links with the same text for all links. - For objects: `{"url1": "Author 1", "url2": "Author 2"}|link` returns Markdown links with the text that matches the object keys. - `list` converts an array to a bullet list. - Use `list:task` to convert to a task list. - Use `list:numbered` to convert to a numbered list. - Use `list:numbered-task` to convert to a task list with numbers. - `table` converts an array or array of objects into a Markdown table: - For an array of objects, it uses the object keys as headers. - For an array of arrays, it creates a table with each nested array as a row. - For a simple array, it creates a single-column table with "Value" as the header. - `wikilink` converts strings, arrays, or objects into Obsidian wikilink syntax. - For strings: `"page"|wikilink` returns `[[page]]`. - For strings with alias: `"page"|wikilink:"alias"` returns `[[page|alias]]`. - For arrays: `["page1","page2"]|wikilink` returns an array of wikilinks without aliases. - For arrays with alias: `["page1","page2"]|wikilink:"alias"` returns an array of wikilinks with the same alias for all links. - For objects: `{"page1": "alias1", "page2": "alias2"}|wikilink` returns wikilinks with the keys as page names and values as aliases. ## HTML processing Filters that process HTML content and convert HTML to Markdown. Note that your input [[Variables|variable]] must contain HTML content, e.g. using `{{fullHtml}}`, `{{contentHtml}}` or a `{{selectorHtml:}}` variable. - `markdown` converts a string to an [[Obsidian Flavored Markdown]] formatted string. - Useful when combined with variables that return HTML such as `{{contentHtml}}`, `{{fullHtml}}`, and selector variables like `{{selectorHtml:cssSelector}}`. - `remove_html` removes specified HTML elements and their content from a string. - Supports tag name, class, or id, e.g. `{{contentHtml|remove_html:("img,.class-name,#element-id")}}` - To remove only HTML tags or attributes without removing the content use the `strip_tags` or `strip_attr` filters. - `strip_attr` removes all HTML attributes from a string. - Use `strip_attr:("class, id")` to keep specific attributes. - Example: `"<div class="test" id="example">Content</div>"|strip_attr:("class")` returns `<div id="example">Content</div>`. - `strip_md` removes all Markdown formatting and returns a plain text string, e.g. turning `**text**` into `text`. - Turns formatted text into unformatted plain text, including bold, italic, highlights, headers, code, blockquotes, tables, task lists, and wikilinks. - Entirely removes tables, footnotes, images, and HTML elements. - `strip_tags` removes all HTML tags from a string. Unlike `remove_html` this doesn't remove the content within the tags. - Use `strip_tags:("p,strong,em")` to keep specific tags. - Example: `"<p>Hello <b>world</b>!</p>"|strip_tags:("b")` returns `Hello <b>world</b>!`. ## Arrays and objects Filters that process arrays and objects. - `first` returns the first element of an array as a string. - `["a","b","c"]|first` returns `"a"`. - If the input is not an array, it returns the input unchanged. - `join` combines elements of an array into a string. - `["a","b","c"]|join` returns `"a,b,c"`. - A custom separator can be specified: `["a","b","c"]|join:" "` returns `"a b c"`. Use `join:"\n"` to separate elements with a line break. - It can be useful after `split` or `slice`: `"a,b,c,d"|split:","|slice:1,3|join:" "` returns `"b c"`. - `last` returns the last element of an array as a string. - `["a","b","c"]|last` returns `"c"`. - If the input is not an array, it returns the input unchanged. - `map` applies a transformation to each element of an array. - Syntax: `map:item => item.property` or `map:item => item.nested.property` for nested properties. - Example: `[{gem: "obsidian", color: "black"}, {gem: "amethyst", color: "purple"}]|map:item => item.gem` returns `["obsidian", "amethyst"]`. - Parentheses are needed for object literals and complex expressions: `map:item => ({key: value})`. - Example: `[{gem: "obsidian", color: "black"}, {gem: "amethyst", color: "purple"}]|map:item => ({name: item.gem, color: item.color})` returns `[{name: "obsidian", color: "black"}, {name: "amethyst", color: "purple"}]`. - String literals are supported and automatically wrapped in an object with a `str` property: - Example: `["rock", "pop"]|map:item => "genres/${item}"` returns `[{str: "genres/rock"}, {str: "genres/pop"}]`. - The `str` property is used to store the result of string literal transformations. - Can be combined with `template` filter, e.g. `map:item => ({name: ${item.gem}, color: item.color})|template:"- ${name} is ${color}\n"` - `object` manipulates object data: - `object:array` converts an object to an array of key-value pairs. - `object:keys` returns an array of the object's keys. - `object:values` returns an array of the object's values. - Example: `{"a":1,"b":2}|object:array` returns `[["a",1],["b",2]]`. - `slice` extracts a portion of a string or array. - For strings: `"hello"|slice:1,4` returns `"ell"`. - For arrays: `["a","b","c","d"]|slice:1,3` returns `["b","c"]`. - If only one parameter is provided, it slices from that index to the end: `"hello"|slice:2` returns `"llo"`. - Negative indices count from the end: `"hello"|slice:-3` returns `"llo"`. - The second parameter is exclusive: `"hello"|slice:1,4` includes characters at indices 1, 2, and 3. - Using a negative second parameter excludes elements from the end: `"hello"|slice:0,-2` returns `"hel"`. - `split` divides a string into an array of substrings. - `"a,b,c"|split:","` returns `["a","b","c"]`. - `"hello world"|split:" "` returns `["hello","world"]`. - If no separator is provided, it splits on every character: `"hello"|split` returns `["h","e","l","l","o"]`. - Regular expressions can be used as separators: `"a1b2c3"|split:[0-9]` returns `["a","b","c"]`. - `template` applies a template string to an object or array of objects. - Syntax: `object|template:"Template with ${variable}"`. - Access nested properties: `{"gem":{"name":"Obsidian"}}|template:"${gem.name}"` returns `"Obsidian"`. - For objects: `{"gem":"obsidian","hardness":5}|template:"${gem} has a hardness of ${hardness}"` returns `"obsidian has a hardness of 5"`. - For arrays: `[{"gem":"obsidian","hardness":5},{"gem":"amethyst","hardness":7}]|template:"- ${gem} has a hardness of ${hardness}\n"` returns a formatted list. - Works with string literals from `map` by accessing the `str` property: - Example: `["rock", "pop"]|map:item => "genres/${item}"|template:"${str}"` returns `"genres/rock\ngenres/pop"`. - The `str` property is automatically used when applying `template` to objects created by `map` with string literals.