[[معرفی Obsidian Web Clipper|Web Clipper]] از منطق الگو برای شرط‌ها، حلقه‌ها و تخصیص متغیرها پشتیبانی می‌کند. این سینتکس از زبان‌های الگوسازی [Twig](https://twig.symfony.com/) و [Liquid](https://shopify.github.io/liquid/) الهام گرفته است. > [!warning] نیاز به آخرین نسخه > قابلیت‌های منطق نیاز به Obsidian Web Clipper نسخه 1.0.0 دارند که هنوز در همه فروشگاه‌های افزونه تأیید نشده است. ## شرط‌ها از `{% if %}` برای گنجاندن مشروط محتوا بر اساس متغیرها یا عبارات استفاده کنید. ```twig {% if author %} Author: {{author}} {% endif %} ``` از `{% else %}` برای ارائه محتوای جایگزین و از `{% elseif %}` برای زنجیره کردن چندین شرط استفاده کنید: ```twig {% if status == "published" %} Live article {% elseif status == "draft" %} Draft article {% else %} Unknown status {% endif %} ``` ### عملگرهای مقایسه‌ای عملگرهای مقایسه‌ای زیر پشتیبانی می‌شوند: | عملگر | توضیحات | |----------|-------------| | `==` | برابر با | | `!=` | نابرابر با | | `>` | بزرگ‌تر از | | `<` | کوچک‌تر از | | `>=` | بزرگ‌تر یا مساوی با | | `<=` | کوچک‌تر یا مساوی با | | `contains` | بررسی اینکه رشته شامل زیررشته است یا آرایه شامل مقدار است | نمونه‌ها: - `{% if title == "Home" %}` — برابری رشته‌ای - `{% if price >= 100 %}` — مقایسه عددی - `{% if title contains "Review" %}` — بررسی زیررشته - `{% if tags contains "important" %}` — عضویت در آرایه ### عملگرهای منطقی شرط‌ها را با استفاده از عملگرهای منطقی ترکیب کنید: | عملگر | جایگزین | توضیحات | | -------- | ----------- | ----------------------------------- | | `and` | `&&` | هر دو شرط باید درست باشند | | `or` | \|\| | حداقل یکی از شرط‌ها باید درست باشد | | `not` | `!` | یک شرط را نقض می‌کند | نمونه‌ها: - `{% if author and published %}` — هر دو باید وجود داشته باشند - `{% if draft or archived %}` — هر یک از شرط‌ها - `{% if not hidden %}` — نقض - `{% if (premium or featured) and published %}` — شرط‌های گروه‌بندی‌شده ### درستی (Truthiness) وقتی یک متغیر بدون عملگر مقایسه‌ای استفاده می‌شود، از نظر «درستی» ارزیابی می‌شود: - `false`، `null`، `undefined`، رشته خالی `""` و `0` **نادرست (falsy)** در نظر گرفته می‌شوند. - آرایه‌های خالی `[]` **نادرست (falsy)** در نظر گرفته می‌شوند. - بقیه موارد **درست (truthy)** هستند. ```twig {% if content %} Has content {% endif %} ``` ## تخصیص متغیر از `{% set %}` برای ایجاد یا تغییر متغیرها در الگوی خود استفاده کنید: ```twig {% set slug = title|lower|replace:" ":"-" %} File: {{slug}}.md ``` متغیرها می‌توانند تنظیم شوند روی: - متغیرهای دیگر: `{% set name = author %}` - مقادیر ثابت: `{% set count = 5 %}` یا `{% set label = "Draft" %}` - عبارات با فیلترها: `{% set excerpt = content|truncate:100 %}` - نتایج سلکتور: `{% set comments = selector:.comment %}` متغیرهایی که با `{% set %}` تنظیم شده‌اند می‌توانند در منطق الگوی بعدی و در خروجی `{{variable}}` استفاده شوند. ## مقادیر جایگزین از عملگر `??` برای ارائه مقادیر جایگزین زمانی که یک متغیر خالی یا تعریف‌نشده است استفاده کنید: ```twig {{title ?? "Untitled"}} ``` اگر `title` خالی، تعریف‌نشده یا نادرست باشد، مقدار جایگزین `"Untitled"` به جای آن استفاده خواهد شد. این یک خلاصه‌نویسی برای دستور `if` معادل است: ```twig {% if title %}{{title}}{% else %}Untitled{% endif %} ``` ### زنجیره کردن مقادیر جایگزین می‌توانید چندین مقدار جایگزین را زنجیره کنید: ```twig {{title ?? headline ?? "No title"}} ``` این ابتدا `title` را در صورت موجود بودن استفاده می‌کند، سپس `headline` و در غیر این صورت رشته `"No title"`. ### با فیلترها فیلترها محکم‌تر از `??` اتصال دارند، بنابراین فیلترها قبل از بررسی مقدار جایگزین اعمال می‌شوند: ```twig {{title|upper ?? "UNTITLED"}} ``` این ابتدا `upper` را روی `title` اعمال می‌کند، سپس در صورت خالی بودن نتیجه به `"UNTITLED"` بازمی‌گردد. برای اعمال فیلترها روی مقدار جایگزین، از پرانتز یا عبارات جداگانه استفاده کنید: ```twig {{title ?? "Untitled"|lower}} ``` این `title` را در صورت موجود بودن استفاده می‌کند، در غیر این صورت `lower` را روی مقدار جایگزین اعمال می‌کند و نتیجه `"untitled"` خواهد بود. ## حلقه‌ها از `{% for %}` برای تکرار روی آرایه‌ها استفاده کنید: ```twig {% for item in schema:author %} - {{item.name}} {% endfor %} ``` ### منابع حلقه می‌توانید روی موارد زیر حلقه بزنید: - آرایه‌های اسکیما: `{% for item in schema:author %}` - نتایج سلکتور: `{% for comment in selector:.comment %}` - متغیرهای تنظیم‌شده قبلی: `{% set items = selector:.item %}{% for item in items %}` ### متغیرهای حلقه درون یک حلقه، به شیء `loop` با ویژگی‌های زیر دسترسی دارید: | متغیر | توضیحات | |----------|-------------| | `loop.index` | تکرار فعلی (از ۱ شروع می‌شود) | | `loop.index0` | تکرار فعلی (از ۰ شروع می‌شود) | | `loop.first` | `true` اگر اولین تکرار باشد | | `loop.last` | `true` اگر آخرین تکرار باشد | | `loop.length` | تعداد کل آیتم‌ها | ```twig {% for tag in tags %} {{loop.index}}. {{tag}} {% if loop.last %} (end of list){% endif %} {% endfor %} ``` برای سازگاری با نسخه‌های قبلی، می‌توانید از `item_index` (که `item` نام متغیر تکرارکننده شماست) برای دریافت موقعیت از ۰ استفاده کنید: ```twig {% for tag in tags %} {{tag_index}}. {{tag}} {% endfor %} ``` ### دسترسی به آیتم‌های آرایه با شاخص از نماد براکت برای دسترسی به عناصر آرایه بر اساس شاخص استفاده کنید: ```twig {{items[0]}} {{items[loop.index0]}} ``` این زمانی مفید است که نیاز دارید به آیتم‌های چندین آرایه به صورت موازی دسترسی داشته باشید: ```twig {% set transcripts = selector:.transcript-text %} {% set timestamps = selector:.timestamp %} {% for line in transcripts %} {{timestamps[loop.index0]}} - {{line}} {% endfor %} ``` نماد براکت همچنین با ویژگی‌های شیء کار می‌کند: ```twig {{user["name"]}} {{data["my-key"]}} ``` ### حلقه‌های تودرتو حلقه‌ها می‌توانند برای ساختارهای داده پیچیده تودرتو شوند: ```twig {% for section in sections %} ## {{section.title}} {% for item in section.items %} - {{item}} {% endfor %} {% endfor %} ``` ## ترکیب منطق شرط‌ها و حلقه‌ها می‌توانند ترکیب شوند: ```twig {% for item in items %} {% if item.active %} - {{item.name}} {% endif %} {% endfor %} ``` ## ترتیب ارزیابی منطق الگو به ترتیب زیر پردازش می‌شود: 1. **منطق الگو** — `{% if %}`، `{% for %}`، `{% set %}` و `{{variables}}` ابتدا ارزیابی می‌شوند 2. **متغیرهای پرامپت** — [[متغیرها#متغیرهای پرامپت|متغیرهای پرامپت]] مانند `{{"summarize this"|prompt}}` پس از تکمیل منطق الگو به تفسیرگر ارسال می‌شوند این بدان معناست که می‌توانید از منطق الگو برای ساخت پویای پرامپت‌ها استفاده کنید، اما نتایج پرامپت برای استفاده در شرط‌ها یا حلقه‌ها در دسترس نیستند.