כאשר אתה [[יצירת base|יוצר base]] ב-Obsidian, הוא נשמר כקובץ `.base`. בסיסים נערכים בדרך כלל באמצעות ממשק האפליקציה, אך ניתן לערוך את התחביר גם ידנית, ולהטמיע אותו בבלוק קוד.
תחביר ה-[[מבוא ל-Bases|Bases]] מגדיר [[תצוגות]], מסננים ו[[נוסחאות]]. בסיסים חייבים להיות YAML תקני בהתאם לסכמה המוגדרת להלן.
## דוגמא
הנה דוגמא לקובץ base. נעבור על כל חלק בפירוט.
```yaml
filters:
or:
- file.hasTag("tag")
- and:
- file.hasTag("book")
- file.hasLink("Textbook")
- not:
- file.hasTag("book")
- file.inFolder("Required Reading")
formulas:
formatted_price: 'if(price, price.toFixed(2) + " dollars")'
ppu: "(price / age).toFixed(2)"
properties:
status:
displayName: Status
formula.formatted_price:
displayName: "Price"
file.ext:
displayName: Extension
summaries:
customAverage: 'values.mean().round(3)'
views:
- type: table
name: "My table"
limit: 10
groupBy:
property: note.age
direction: DESC
filters:
and:
- 'status != "done"'
- or:
- "formula.ppu > 5"
- "price > 2.1"
order:
- file.name
- file.ext
- note.age
- formula.ppu
- formula.formatted_price
summaries:
formula.ppu: Average
```
### מסננים
כברירת מחדל, בסיס כולל כל קובץ בכספת. אין `from` או `source` כמו ב-SQL או ב-Dataview. החלק `filters` מאפשר לך להגדיר תנאים לצמצום מערך הנתונים.
```yaml
# מסנן פשוט:
filters:
and:
- file.hasTag("tag")
# מסנן מורכב:
filters:
or:
- file.hasTag("tag")
- and:
- file.hasTag("book")
- file.hasLink("Textbook")
- not:
- file.hasTag("book")
- file.inFolder("Required Reading")
```
ישנן שתי הזדמנויות להחיל מסננים:
1. ברמת ה-`filters` הגלובלית (כמוצג למעלה) שם הם חלים על כל התצוגות בבסיס.
2. ברמת ה-`view` שם הם חלים רק על תצוגה ספציפית.
שני חלקים אלה שווים מבחינה פונקציונלית וכאשר מבצעים הערכה עבור תצוגה הם ישורשרו עם `AND`.
החלק `filters` מכיל או הצהרת מסנן בודדת כמחרוזת, או אובייקט מסנן מוגדר רקורסיבית. אובייקטי מסנן עשויים להכיל אחד מ-`and`, `or`, או `not`. מפתחות אלה הם רשימה הטרוגנית של אובייקטי מסנן אחרים או הצהרות מסנן במחרוזות. הצהרת מסנן היא שורה שמתקבל ממנה ערך אמת או שקר כאשר מוחלת על הערה. היא יכולה להיות אחת מהבאות:
- השוואה בסיסית באמצעות אופרטורים אריתמטיים סטנדרטיים.
- פונקציה. מגוון [[פונקציות]] מובנות זמינות, ותוספים יכולים להוסיף פונקציות נוספות.
התחביר והפונקציות הזמינות למסננים ולנוסחאות זהים.
### נוסחאות
החלק `formulas` מגדיר [[נוסחאות|מאפייני נוסחה]] שניתן להציג בכל התצוגות בקובץ הבסיס.
```yaml
formulas:
formatted_price: 'if(price, price.toFixed(2) + " dollars")'
ppu: "(price / age).toFixed(2)"
```
מאפייני נוסחה תומכים באופרטורים אריתמטיים בסיסיים ובמגוון [[פונקציות]] מובנות. בעתיד, תוספים יוכלו להוסיף פונקציות לשימוש בנוסחאות.
ניתן להפנות למאפיינים בדרכים שונות בהתאם לסוג שלהם:
- **מאפייני הערה** הם מאפיינים המוגדרים במטא-נתונים בתחילת הקובץ של ההערה. לדוגמא `note.price` או `note["price"]`.
אם לא צוין קידומת, המאפיין מניח שהוא מאפיין `note`.
- **מאפייני קובץ** מתארים את הקובץ עצמו.
לדוגמא `file.size` או `file.ext`. ניתן גם להפנות ישירות לאובייקט הקובץ, למשל `file.hasLink()`.
- **מאפייני נוסחה** הם נוסחאות אחרות בבסיס.
דוגמא `formula.formatted_price`.
נוסחה יכולה להשתמש בערכים ממאפייני נוסחה אחרים, כל עוד אין הפניה מעגלית.
מאפייני נוסחה נשמרים תמיד כמחרוזות ב-YAML, אך **סוג הנתונים בפלט** בפועל נקבע על ידי סוג הנתונים הבסיסי וערך ההחזרה של הפונקציות שנעשה בהן שימוש.
שימו לב שהשימוש במירכאות מקוננות נחוץ כדי לכלול מילוליות טקסט בשדה YAML. מילוליות טקסט חייבות להיות מוקפות במירכאות בודדות או כפולות.
### מאפיינים
החלק `properties` מאפשר אחסון מידע תצורה על כל מאפיין. האופן שבו ערכי תצורה אלה משמשים תלוי בתצוגה הספציפית. לדוגמא, בטבלאות שם התצוגה משמש עבור כותרות העמודות.
```yaml
properties:
status:
displayName: Status
formula.formatted_price:
displayName: "Price"
file.ext:
displayName: Extension
```
שמות תצוגה אינם משמשים במסננים או בנוסחאות.
### סיכומים
החלק `summaries` יכול לשמש להגדרת נוסחאות סיכום מותאמות אישית. בנוסף להגדרת נוסחאות סיכום כאן, ישנן מספר נוסחאות סיכום ברירת מחדל זמינות.
```yaml
summaries:
customAverage: 'values.mean().round(3)'
```
בדוגמא זו, הנוסחה `customAverage` זהה לברירת המחדל `Average`, אלא שהערך מעוגל למספר שונה של מקומות עשרוניים. בנוסחאות סיכום, מילת המפתח `values` היא רשימה המכילה את כל הערכים עבור אותו מאפיין בכל ההערות בסט התוצאות. נוסחת הסיכום צריכה להחזיר `Value` יחיד.
שימו לב שחלק ה-`summaries` הזה שונה מחלק ה-`summaries` בתצורת התצוגה (מוסבר להלן) שם נוסחאות סיכום מוקצות למאפיינים ספציפיים.
#### נוסחאות סיכום ברירת מחדל
| שם | סוג קלט | תיאור |
| --------- | ---------- | ------------------------------------------------------------- |
| Average | מספר | הממוצע המתמטי של כל המספרים מערכי הקלט. |
| Min | מספר | המספר הקטן ביותר מערכי הקלט. |
| Max | מספר | המספר הגדול ביותר מערכי הקלט. |
| Sum | מספר | הסכום של כל המספרים בקלט. |
| Range | מספר | ההפרש בין `Max` ל-`Min`. |
| Median | מספר | החציון המתמטי של כל המספרים מערכי הקלט. |
| Stddev | מספר | סטיית התקן של כל המספרים מערכי הקלט. |
| Earliest | תאריך | התאריך המוקדם ביותר מערכי הקלט. |
| Latest | תאריך | התאריך המאוחר ביותר מערכי הקלט. |
| Range | תאריך | ההפרש בין `Latest` ל-`Earliest`. |
| Checked | בוליאני | מספר ערכי ה-`true`. |
| Unchecked | בוליאני | מספר ערכי ה-`false`. |
| Empty | כלשהו | מספר הערכים בקלט שהם ריקים. |
| Filled | כלשהו | מספר הערכים בקלט שאינם ריקים. |
| Unique | כלשהו | מספר הערכים הייחודיים בקלט. |
### תצוגות
החלק `views` מגדיר כיצד ניתן לרנדר את הנתונים. כל ערך ברשימת ה-`views` מגדיר תצוגה נפרדת של אותם נתונים, ויכולות להיות כמה תצוגות שונות ככל שנדרש.
```yaml
views:
- type: table
name: "My table"
limit: 10
groupBy:
property: note.age
direction: DESC
filters:
and:
- 'status != "done"'
- or:
- "formula.ppu > 5"
- "price > 2.1"
order:
- file.name
- file.ext
- note.age
- formula.ppu
- formula.formatted_price
summaries:
formula.ppu: Average
```
- `type` בוחר מבין סוגי התצוגה המובנים ואלה שנוספו על ידי תוספים.
- `name` הוא שם התצוגה, וניתן להשתמש בו להגדרת תצוגת ברירת המחדל.
- `filters` זהים בדיוק למתואר למעלה, אך חלים רק על התצוגה.
- `groupBy` מציין מאפיין וכיוון מיון. ערך המאפיין המצוין עבור כל שורה משמש למיקום השורה בקבוצות.
- `summaries` ממפה שמות מאפיינים לסיכום בעל שם. סיכומים מבצעים צבירה על המאפיין בכל השורות.
[[תצוגות]] יכולות להוסיף נתונים נוספים לאחסון כל מידע הנדרש לשמירת מצב או רינדור נכון, אולם מחברי תוספים צריכים להיזהר שלא להשתמש במפתחות שכבר בשימוש על ידי תוסף ליבה Bases. כדוגמא, תצוגת טבלה עשויה להשתמש בכך כדי להגביל את מספר השורות או לבחור באיזו עמודה משתמשים למיון שורות ובאיזה כיוון. סוג תצוגה אחר כגון מפה יכול להשתמש בכך למיפוי איזה מאפיין בהערה מתאים לקו הרוחב ולקו האורך ואיזה מאפיין צריך להיות מוצג ככותרת הסיכה.
בעתיד, API יאפשר לתצוגות לקרוא ולכתוב ערכים אלה, ויאפשר לתצוגה לבנות ממשק משלה לתצורה.
## מאפיינים
ישנם שלושה סוגי מאפיינים המשמשים בבסיסים:
1. **מאפייני הערה**, מאוחסנים במטא-נתונים בתחילת הקובץ של קבצי Markdown.
2. **מאפייני קובץ**, נגישים לכל סוגי הקבצים.
3. **מאפייני נוסחה**, מוגדרים בקובץ ה-`.base` עצמו (ראו למעלה).
### מאפייני הערה
[[מאפיינים|מאפייני הערה]] זמינים רק עבור קבצי Markdown, ומאוחסנים במטא-נתונים בתחילת הקובץ של YAML בכל הערה. ניתן לגשת למאפיינים אלה בפורמט `note.author` או פשוט `author` כקיצור.
### מאפייני קובץ
מאפייני קובץ מתייחסים לקובץ הנבדק או המוערך כעת. מאפייני קובץ זמינים לכל [[פורמטי קבצים נתמכים|סוגי הקבצים]], כולל קבצים מצורפים.
לדוגמא, מסנן `file.ext == "md"` יהיה אמת עבור כל קבצי Markdown ושקר אחרת.
| מאפיין | סוג | תיאור |
| ------------- | ------ | ------------------------------------------------------------- |
| `file.backlinks` | רשימה | רשימת קבצים עם קישורים חוזרים. הערה: מאפיין זה כבד מבחינת ביצועים. כאשר אפשר, הפכו את החיפוש והשתמשו ב-`file.links`. לא מרענן תוצאות אוטומטית כאשר הכספת משתנה. |
| `file.ctime` | תאריך | זמן יצירה |
| `file.embeds` | רשימה | רשימת כל ההטמעות בהערה |
| `file.ext` | מחרוזת | סיומת קובץ |
| `file.file` | קובץ | אובייקט קובץ, שמיש רק בפונקציות ספציפיות |
| `file.folder` | מחרוזת | נתיב תיקיית הקובץ |
| `file.links` | רשימה | רשימת כל הקישורים הפנימיים בהערה, כולל מטא-נתונים בתחילת הקובץ |
| `file.mtime` | תאריך | זמן שינוי |
| `file.name` | מחרוזת | שם הקובץ |
| `file.path` | מחרוזת | נתיב הקובץ |
| `file.properties` | אובייקט | כל המאפיינים על הקובץ. הערה: לא מרענן תוצאות אוטומטית כאשר הכספת משתנה. |
| `file.size` | מספר | גודל קובץ |
| `file.tags` | רשימה | רשימת כל התגים בתוכן הקובץ ובמטא-נתונים בתחילת הקובץ |
### גישה למאפיינים עם `this`
השתמשו באובייקט `this` כדי לגשת למאפייני קובץ. למה `this` מתייחס תלוי בהיכן הבסיס מוצג.
כאשר הבסיס נפתח באזור התוכן הראשי, `this` מצביע על מאפייני קובץ הבסיס עצמו. לדוגמא, שימוש ב-`this.file.folder` מחזיר את נתיב התיקייה בה הבסיס ממוקם.
כאשר הבסיס מוטמע בקובץ אחר, `this` מצביע על מאפייני הקובץ _המטמיע_ (ההערה או ה-Canvas שמכילים את הבסיס). לדוגמא, שימוש ב-`this.file.name` מחזיר את שם הקובץ המטמיע, לא את הבסיס.
כאשר הבסיס נמצא בסרגל צד, `this` מתייחס לקובץ הפעיל באזור התוכן הראשי. זה מאפשר לכם ליצור שאילתות המבוססות על הקובץ הפעיל. לדוגמא, ניתן להשתמש ב-`file.hasLink(this.file)` כדי לשכפל את חלונית הקישורים הנכנסים.
## אופרטורים
### אופרטורים אריתמטיים
אופרטורים אריתמטיים מבצעים חשבון על מספרים. לדוגמא, `radius * (2 * 3.14)`.
| אופרטור | תיאור |
| -------- | ----------- |
| `+` | חיבור |
| `-` | חיסור |
| `*` | כפל |
| `/` | חילוק |
| `%` | מודולו |
| `( )` | סוגריים |
### אריתמטיקת תאריכים
ניתן לשנות תאריכים על ידי הוספה וחיסור של משכי זמן. יחידות משך זמן מקבלות מספר פורמטים:
| יחידה | משך |
| ------------------------ | -------- |
| `y`, `year`, `years` | שנה |
| `M`, `month`, `months` | חודש |
| `d`, `day`, `days` | יום |
| `w`, `week`, `weeks` | שבוע |
| `h`, `hour`, `hours` | שעה |
| `m`, `minute`, `minutes` | דקה |
| `s`, `second`, `seconds` | שנייה |
כדי לשנות או להזיח אובייקטי תאריך, השתמשו באופרטור `+` או `-` עם מחרוזת משך זמן. לדוגמא, `date + "1M"` מוסיף חודש אחד לתאריך, בעוד `date - "2h"` מחסיר שעתיים מהתאריך.
ה[[פונקציות|פונקציה]] הגלובלית `today()` יכולה לשמש לקבלת התאריך הנוכחי, ו-`now()` יכולה לשמש לקבלת התאריך הנוכחי עם שעה.
- `now() + "1 day"` מחזיר תאריך-שעה בדיוק 24 שעות מזמן הביצוע.
- `file.mtime > now() - "1 week"` מחזיר `true` אם הקובץ שונה בשבוע האחרון.
- `date("2024-12-01") + "1M" + "4h" + "3m"` מחזיר אובייקט תאריך המייצג `2025-01-01 04:03:00`.
- חסרו שני תאריכים כדי לקבל את ההפרש באלפיות שנייה ביניהם, לדוגמא, `now() - file.ctime`.
- כדי לקבל את חלק התאריך מתאריך עם שעה, השתמשו ב-`datetime.date()`.
- כדי לפרמט אובייקט תאריך, השתמשו בפונקציה `format()`, לדוגמא `datetime.format("YYYY-MM-DD")`.
### אופרטורי השוואה
ניתן להשתמש באופרטורי השוואה כדי להשוות מספרים או אובייקטי תאריך. שווה ולא שווה ניתנים לשימוש עם כל סוג ערך, לא רק מספרים ותאריכים.
| אופרטור | תיאור |
| -------- | ------------------------ |
| `==` | שווה |
| `!=` | לא שווה |
| `>` | גדול מ |
| `<` | קטן מ |
| `>=` | גדול או שווה ל |
| `<=` | קטן או שווה ל |
### אופרטורים בוליאניים
ניתן להשתמש באופרטורים בוליאניים כדי לשלב או להפוך ערכים לוגיים, ולקבל ערך אמת או שקר.
| אופרטור | תיאור |
| -------- | ----------- |
| `!` | שלילה לוגית |
| `&&` | וגם לוגי |
| \|\| | או לוגי |
## פונקציות
ראו את [[פונקציות|רשימת הפונקציות]] שניתן להשתמש בהן בנוסחאות וב[[תצוגות|מסננים]].
## סוגים
ל-Bases יש מערכת סוגים המשמשת נוסחאות ומסננים להחלת פונקציות על מאפיינים.
### מחרוזות, מספרים ובוליאניים
מחרוזות, מספרים ובוליאניים הם ערכים "פרימיטיביים" שאינם דורשים פונקציה ליצירתם.
- מחרוזות מוקפות במירכאות בודדות או כפולות, לדוגמא `"message"`.
- מספרים נכתבים כספרות, ויכולים להיות מוקפים בסוגריים לבהירות. לדוגמא, `1` או `(2.5)`.
- בוליאניים נכתבים כ-`true` או `false` ללא מירכאות.
### תאריכים ומשכי זמן
תאריכים מייצגים תאריך ספציפי, או תאריך ושעה בהתאם לפונקציה שנעשה בה שימוש ליצירתם, או הסוג שהוקצה ל[[מאפיינים|מאפיין]].
- כדי לבנות תאריך, השתמשו בפונקציה `date`, לדוגמא `date("2025-01-01 12:00:00")`
- כדי לשנות תאריך, הוסיפו או הסירו משך זמן, לדוגמא `now() + "1 hour"` או `today() + "7d"`
- השוו תאריכים באמצעות אופרטורי השוואה (למשל `>` או `<`) ואופרטורים אריתמטיים (לדוגמא, `(now() + "1d") - now()` מחזיר `86400000` אלפיות שנייה.)
- כדי לחלץ חלקים מתאריך, השתמשו בשדות הזמינים (`now().hour`), או בפונקציית נוחות (`now.time()`).
- [[פונקציות|שדות ופונקציות]] רבים נוספים זמינים על אובייקטי תאריך.
### אובייקטים ורשימות
- הפכו אלמנט בודד לרשימה באמצעות הפונקציה `list()`. זה שימושי במיוחד עבור מאפיינים שעשויים להכיל תערובת של רשימות או ערכים בודדים.
- גשו לאלמנטים ברשימה באמצעות סוגריים מרובעים ואינדקס מבוסס 0. לדוגמא, `property[0]` מחזיר את האלמנט הראשון מהרשימה.
- גשו לאלמנטים באובייקט באמצעות סוגריים מרובעים ושם האלמנט או סימון נקודה. לדוגמא, `property.subprop` או `property["subprop"]`.
### קבצים וקישורים
[[קישור הערות|קישורי ויקי]] ב[[מאפיינים|מאפייני מטא-נתונים בתחילת הקובץ]] מזוהים אוטומטית כאובייקטי קישור. קישורים יופיעו כקישור לחיץ ב[[תצוגות|תצוגה]].
- כדי לבנות קישור, השתמשו ב[[פונקציות|פונקציה]] הגלובלית `link`, לדוגמא `link("filename")` או `link("https://obsidian.md")`.
- ניתן ליצור קישור מכל מחרוזת, לדוגמא, `link(file.ctime.date().toString())`.
- כדי להגדיר טקסט תצוגה, העבירו מחרוזת או סמל אופציונלי כפרמטר שני, לדוגמא `link("filename", "display")` או `link("filename", icon("plus"))`.
ניתן להפוך אובייקט קובץ לקישור באמצעות `file.asLink()` עם טקסט תצוגה אופציונלי.
ניתן להשוות קישורים עם `==` ו-`!=`. הם שווים כל עוד הם מצביעים לאותו קובץ, או אם הקובץ לא קיים בעת החיפוש, טקסט הקישור שלהם חייב להיות זהה.
ניתן להשוות קישורים לקבצים כגון `file` או `this`. הם יהיו שווים אם הקישור מפנה לקובץ. לדוגמא, `author == this`.
ניתן גם לבדוק קישורים בהכלת רשימה, לדוגמא, `authors.contains(this)`.