رابط کاربری gui.ui
زمان اجرای رابط بومی: یک صفحهی سلام را در پنجرهای بومی نشان میدهد که خود سلام میکشد، همانگونه که مرورگر همان صفحه را نشان میدهد، با چیدمان، متن فارسی، رویدادها و کنترلهای فرم.
واردسازی رابط گرافیکی.رابط کاربری
نام آرگومانها شناسهی خود کد است و معادل فارسی ندارد؛ گونهها، کلیدواژهها و نام بستهها با معادل فارسی نوشته میشوند.
این بسته یک صفحه را در پنجرهای بومی اجرا میکند که خود سلام آن را میکشد. کامپایلر یک صفحه: را به همان سند HTML تبدیل میکند که برای وب مینویسد، با CSS صفحه در یک <style> و ویژگیهای رویداد مانند onclick="add()" که نام تابعهای سلام را میبرند. رابط کاربری یک موتور مرورگر کوچک برای همین خروجی است: سند را تجزیه میکند، سبکها را با سی اس اس حساب میکند (برگهی سبک پیشفرض مرورگر، قاعدههای hover، focus، active و media)، جعبهها را با جعبه سی اس اس میچیند (بلوکی، flex و جایگذاری مطلق)، متن را با حروفچینی میشکند و شکل میدهد (عنصرهای درونخطی، دوسویگی، شکلدهی فارسی، نشانهی فهرست)، با نقاشی میکشد و با پنجره ها نشان میدهد.
برنامه رسیدگیکنندههایش را با ثبت رسیدگی ثبت میکند و اجرا را با تابعی صدا میزند که صفحه را برمیگرداند. پس از هر رسیدگی تابع نما دوباره اجرا میشود؛ سند تازه با سند پیشین بر پایهی جایگاه، برچسب، id و key جفت میشود تا hover، تمرکز، جابجایی پیمایش، نشانگر متن و مقدارهای نوشتهشده در ورودیها بمانند، و فقط بخشهایی از پنجره که عوض شدهاند دوباره کشیده میشوند. اجرای سند یک سند ثابت را نشان میدهد. نگاره صفحه را بیپنجره میکشد، برای آزمون و تصویر.
کنترلهای فرم را خود زمان اجرا میکشد و از CSS صفحه پیروی میکنند: دکمه، ورودیهای متن، گذرواژه، عدد، ایمیل و جستجو با نشانگر، گزینش، کلیپبورد و واگرد، جعبهی تیک، گروههای رادیویی، بازه، ناحیهی متن، فهرست کشویی با فهرست بازشو، progress، meter، details با summary، و برچسبهایی که کنترلشان را متمرکز یا تیک میکنند. پیوند به نشانیهای http و https در مرورگر کاربر باز میشود و پیوند نسبی صفحهی دیگری را باز میکند که با صفحه برنامه ثبت شده است.
نکتهها
- تغییرهایی که با
با شناسهداده میشوند (متن، کلاس، ویژگی) تا اجرای بعدی نما میمانند؛ منبع درستی نماست. مقدارهای نوشتهشده در ورودیها تا وقتی میمانند که نما ویژگیvalueدیگری بنویسد. - قلمها از پوشههای قلم سیستم میآیند، مگر آنکه برنامه پیش از نمایش نخستین صفحه قلمهای خودش را با
افزودن پرونده قلمیاافزودن پوشه قلمبیفزاید؛ این کار خروجی را در هر رایانه یکسان هم میکند. - با
SALAM_WINDOW_BACKEND=headlessپنجره در حافظه کشیده میشود. اگرSALAM_UI_SCRIPTنام یک پروندهی متنی باشد،اجراگامهای آن را، هر خط یک گام، دنبال میکند و درquitیا پایان پرونده برمیگردد:click SELECTOR،dblclick SELECTOR،hover SELECTOR،press SELECTOR،release SELECTOR،move X Y،key NAME(مانندTab،Enter،ctrl+a،shift+Tab)،type TEXT،ime TEXTوcommit TEXT(نوشتن با روش ورودی)،drag X1 Y1 X2 Y2،tripleclick SELECTOR،sel(گزینش، نشانگر و پیمایش متن کنترل دارای تمرکز را چاپ میکند)،scroll SELECTOR DY،resize W H،wait MS،dump(برچسب، شناسه، متن و جعبهی هر عنصر را چاپ میکند)،hash،focus،reveal SELECTOR(عنصر را مانندنمایان کردنبه دید میآورد)،shot FILE.pngوquit. گزینشگرها گزینشگر CSS هستند و خطهایی که با#یا//آغاز میشوند نادیده گرفته میشوند. بی پروندهی گام، اجرای بیسر یک بار میکشد و برمیگردد. - ویژگیهای
transform،transform-origin،translate،rotateوscaleدر CSS روی کشیدن، آزمون برخورد و کشیدن دوباره اثر دارند و گذارهایtransformبا ساعت پویانمایی اجرا میشوند.filter،backdrop-filter،text-shadow،outline-offsetو کادرهای گرد خطچین یا نقطهچین مانند مرورگر کشیده میشوند. - جعبهها همانگونه که Chromium میکشد کشیده میشوند: هر لایهی پسزمینه با شعاع مناسب به جعبهی
background-clipخود بریده میشود و اندازه، جای و کاشیشدنش از جعبهیbackground-originمیآید، پس کاشی گرادیان در ناحیهی کادر تکرار میشود و پسزمینهی دوگانهیpadding-box, border-boxکادر گرادیانی با گوشههای گرد میکشد.border-imageگرادیان یا تصویر را نهبرشی میکشد، کادر double دو خط دارد، فاصلهی خطچین و نقطهچین مانند Chromium است و سایهی درونی در جعبهی padding میماند.backdrop-filterآنچه را پشت عنصر تا ریشهی پسزمینهاش (نزدیکترین نیایی که opacity، پالایه یا پالایهی پسزمینه دارد) کشیده شده با لبههای آینهای میخواند و با opacity عنصر کمرنگ میشود؛ آسیبی که به عنصر پالایهدار برسد کل آن را دوباره میکشد. مرزهایinset،outset،grooveوridgeبا رنگهای تیرهتر و روشنترِ کرومیوم کشیده میشوند وgrooveوridgeدو نیمه دارند. جدولی باborder-collapse: collapseهر لبهی مشترک میان خانهها، ردیفها، گروههای ردیف، ستونها و جدول را با قاعدههای کشمکش CSS حل میکند و آن را تکه به تکه روی پسزمینهی خانهها میکشد؛hiddenلبه را برمیدارد و گوشهها از آنِ مرز برنده است. - ورودیهای متنی و ناحیههای متن، متن در حال نوشتن روش ورودی را با زیرخط کنار نشانگر نشان میدهند، با پیمایش نشانگر را در دید نگه میدارند (ناحیهی متن با چرخ موشی هم پیمایش میشود و با
wrap="off"به پهلو)، نشانگر را در متن آمیختهی فارسی و انگلیسی به ترتیب دیداری جابجا میکنند و با موشی، Shift همراه کلیدهای جهت، دوبار کلیک (یک واژه) و سه بار کلیک (یک خط) گزینش میکنند. - پیمایش فهرستهای بلند ارزان است: پیمایش فقط جعبهها را جابجا میکند، کشیدن و کشیدن دوباره هر چیزی بیرون از ناحیهی دیدنی را کنار میگذارد و عنصرهایی که بیرون از صفحه میمانند مقایسه نمیشوند. فهرستی با ۱۰۰۰۰ ردیف هنوز یک بار کامل چیده میشود.
- شبکهی CSS و جدولها با
جعبه سی اس اسبه همان شیوهی Chrome چیده میشوند: اندازهگذاری ردیفها، ناحیههای نامدار و جایدهی خودکار برای شبکه؛ پهنای ستون از محتوا،colspanوrowspan، عنوان، گروه سرآیند و پاورقی، فاصلهی مرزها، مرزهای ادغام شده و تراز عمودی خانهها برای جدول. در صفحه،جدول،سرصفحه،اصلی،پاورقی،ردیف،سلولوعنوان جدولهمان جدول خروجی HTML را میسازند. جعبههایinline-table،inline-gridوinline-flexمانند یک بلوک درونخطی در سطر مینشینند، به اندازهی محتوای خود، و مانند کرومیوم روی خط پایهی نخستین ردیف یا نخستین فرزند خود تراز میشوند. - ویژگی
styleمانند سبک درونخطی در مرورگر، بدون توجه به ویژگیمندی بر همهی قاعدههای نویسنده پیروز میشود و سبکهای زمان اجرای صفحهی ترجمهشده هم همان جایگاه را دارند، پس مقداری که کد سلام میگذارد هیچگاه زیر یک گزینشگر پنهان نمیشود. بلوکهای درونخطی، تصویرها و کنترلها در جعبهی خط ازvertical-alignپیروی میکنند:baseline،sub،super،middle،text-top،text-bottom، طولها و درصدها آنها را نسبت به خط پایهی والد جابهجا میکنند وtopوbottomآنها را با جعبهی خط همتراز میکنند که برای جا دادنشان بزرگ میشود؛ جایگاهها همان جایگاههای کرومیوم است.background-clip: textپسزمینه را فقط از درون نویسههای عنصر و فرزندانش میکشد. مرزهای نقطهچین ۳ پیکسل و باریکتر با نقطههای مربعی کشیده میشوند و در جدول ادغامی، پهنترِ دو لبهای که در یک راستا هستند گوشهی میانشان را میگیرد، مانند کرومیوم. - درخت چینش میان اجراهای دوبارهی نما و سبکدهی دوباره نگه داشته میشود: هر عنصر جعبهی چینش خود را نگه میدارد، فقط جعبههایی که سبک، متن، فرزندان یا محتوایشان تغییر کرده دوباره چیده میشوند و بقیه از حافظهی نهان میآیند. کلیکی که یک برچسب را در صفحهای با ۲۰۲ عنصر تغییر میدهد حدود ۶۰ درصد دستور چینش کمتری از چینش کامل اجرا میکند.
- ظرف پیمایشی با بلندی یا بیشینهی بلندی ثابت و دستکم ۲۰۰ فرزند بلوکی فقط سطرهای نزدیک بخش دیدنی (یک صفحه بالا و پایین) را میچیند و برای بقیه بلندی اندازهگرفتهشدهشان را، یا تا دیده نشدهاند میانگین سطرهای اندازهگرفتهشده را، به کار میبرد. پیمایش، کلیک، تمرکز با کلید Tab و سطرهای کلیددار
eachمانند پیش کار میکنند؛ سطرهای بیرون از پنجره تا به دید نیایند جعبه ندارند، ولیمستطیلجای برآوردی آنها را میدهد،تمرکزونمایان کردنآنها را به دید میآورند و گام اسکریپتی که روی چنین سطری کلیک یا درنگ میکند، مانند ابزارهای آزمون مرورگر، نخست آن را به دید میآورد. در فهرستی با ۱۰۰۰۰ سطر نخستین قاب به جای حدود ۶۰۰ میلیثانیه حدود ۷۰ تا ۱۰۰ میلیثانیه و هر قاب پیمایش به جای حدود ۱۰۰ میلیثانیه حدود ۱۵ تا ۱۸ میلیثانیه طول میکشد.
پنجرهای از یک صفحه
این همان چیزی است که کامپایلر برای صفحهای با رسیدگیکننده مینویسد، اینجا با دست نوشته شده است. گامهای بیسر پایان آن دو بار کلیک میکنند تا نمونه بی نمایشگر هم اجرا شود.
// زبان: فارسی
واردسازی رابط گرافیکی.رابط کاربری
واردسازی رشته
ناپایا count := 0
ناپایا name := ""
تابع page(): رشته:
برگشت `<!doctype html><html lang="en" dir="ltr"><head><title>Counter</title><style>button:hover{background:#dde}</style></head><body><h1 id="count">Count ` + count + `</h1><button id="add" onclick="add()">Add</button><input id="name" oninput="named(event)" placeholder="Name"><p>Hello ` + رشته.جایگزینی(name، "<"، "<") + `</p><a href="https://salamlang.ir">site</a> <a href="/about">about</a></body></html>`
پایان
تابع about(): رشته:
برگشت `<!doctype html><html><head><title>About</title></head><body><p>Made with Salam.</p><a href="/">back</a></body></html>`
پایان
تابع ریشه:
رابط کاربری.ثبت رسیدگی("add"، (): count++ پایان)
رابط کاربری.ثبت رسیدگی("named"، ():
ev := رابط کاربری.رخداد جاری()
name = ev.مقدار
سرچاپ ev.گونه رخداد، ev.هدف، ev.متن، ev.کلید، ev.تیک خورده، ev.دکمه موشی، ev.کلیدهای کمکی، ev.ایکس، ev.ایگرگ، ev.جابجایی افقی، ev.جابجایی عمودی
پایان)
رابط کاربری.صفحه برنامه("/"، (): برگشت page() پایان)
رابط کاربری.صفحه برنامه("/about"، (): برگشت about() پایان)
رابط کاربری.تنظیم بازکننده نشانی((url: رشته):
سرچاپ "would open"، url
برگشت درست
پایان)
رابط کاربری.تنظیم ناوبر((url: رشته): برگشت url برابر "/never" پایان)
اگر count بزرگتر 0:
رابط کاربری.اجرا((): برگشت page() پایان)
رابط کاربری.اجرای سند(`<p>A fixed page</p>`)
رابط کاربری.اجرای سند با(`<p>A fixed page</p>`، رابط کاربری.گزینهها { عنوان = "Fixed"، پهنا = 400.0، بلندی = 300.0 })
رابط کاربری.تازه سازی()
سرچاپ رابط کاربری.باز کردن نشانی("https://salamlang.ir")
پایان
رابط کاربری.اجرا با((): برگشت page() پایان، رابط کاربری.گزینهها { عنوان = "Counter"، پهنا = 480.0، بلندی = 320.0، تغییر اندازه پذیر = درست، پس زمینه = "#ffffff"، بی سر = درست، مقیاس = 1.0، گام های آزمایشی = "click #add\nclick #add\nquit" })
سرچاپ "count"، count، "opened"، رابط کاربری.نشانی های باز شده().طول()
پایاننگاره بیپنجره
یک کارت فارسی را در تراکم عادی و دوبرابر روی بوم بکش، به شکل PNG ذخیره کن و زمان هر مرحله را بسنج. کشیدن صفحهای با ۲۰۰ عنصر در اندازهی ۱۰۲۴ در ۷۶۸ روی یک هستهی رومیزی حدود ۰٫۱ میلیثانیه تجزیه، ۲ میلیثانیه سبک، ۲۰ میلیثانیه چیدمان و ۲۳ میلیثانیه نقاشی میگیرد؛ تغییر hover فقط کارتی را که موشی رویش است دوباره میکشد.
// زبان: فارسی
واردسازی رابط گرافیکی.رابط کاربری
واردسازی سیستم عامل
واردسازی مسیر پرونده
تابع ریشه:
_a := رابط کاربری.افزودن پرونده قلم("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf")
_b := رابط کاربری.افزودن پوشه قلم("/usr/share/fonts/truetype/noto")
doc := `<!doctype html><html lang="fa" dir="rtl"><head><style>.card{border:2px solid #36c;border-radius:10px;padding:12px;margin:12px;box-shadow:0 2px 6px rgba(0,0,0,.3)}</style></head><body><div class="card"><h2>سلام</h2><p>یک کارت با <b>متن فارسی</b>.</p></div></body></html>`
ناپایا cv := رابط کاربری.نگاره(doc، 320، 200)
سرچاپ "size"، cv.پهنا، cv.بلندی
cv.رهاسازی()
ناپایا hi := رابط کاربری.نگاره با مقیاس(doc، 320، 200، 2.0)
سرچاپ "hidpi"، hi.پهنا، hi.بلندی
hi.رهاسازی()
path := مسیر پرونده.پیوند(سیستم عامل.پوشه موقت()، "gui-ui-render.png")
سرچاپ "png"، رابط کاربری.نگاره پی ان جی(doc، 320، 200، path)
سیستم عامل.حذف(path)
tree := رابط کاربری.گزارش سند(doc، 320، 200)
سرچاپ "dump starts with body"، tree.شروع با("body")
p := رابط کاربری.سنجش زمان(doc، 320، 200)
سرچاپ "elements"، p.شمار عنصرها، "timed"، p.زمان تجزیه بزرگتربرابر 0.0 و p.زمان سبک بزرگتربرابر 0.0 و p.زمان چیدمان بزرگتربرابر 0.0 و p.زمان نقاشی بزرگتربرابر 0.0
پایانصفحههای ترجمهشده
صفحهای که با --ui=native ساخته میشود اصلاً از متن اچتیامال یا سیاساس نمیگذرد. مترجم سبکهای صفحه را به یک برنامهی سی اس اس ترجمه میکند و نمایهای مینویسد که یک سازندهصفحه میگیرد و عنصرها را با فراخوانی مستقیم میسازد: گشودن عنصر و بستن عنصر برای هر عنصر، اعلان های عنصر برای شناسههای فهرستهای اعلان ترجمهشدهاش، متن فرزند، شناسه عنصر، کلاس عنصر، ویژگی عنصر و رسیدگی رخداد با یک بستار سلام برای هر رسیدگی. اجرای ترجمه شده برنامه را یک بار میسازد و پس از هر رسیدگی نمایه را دوباره اجرا میکند. درخت تازه از همان تطبیق، سبکدهی، چیدمان، نقاشی و رخدادهای نمایهی اچتیامال میگذرد، پس هر دو همان پیکسلها را میدهند. فقط مقدارهای سبکی که در زمان اجرا ساخته میشوند، هر کدام یک بار، با سبک زمان اجرا تجزیه میشوند.
برای صفحهی ۲۰۰ عنصری tools/bench/gui_ui.salam روی یک هستهی رایانهی رومیزی، اجرای دوبارهی نمایه پس از یک کلیک (ساختن درخت، تطبیق، سبکدهی، چیدمان و نقاشی بخشی) در مسیر ترجمهشده حدود ۷٫۲ میلیثانیه و در مسیر اچتیامال حدود ۷٫۷ میلیثانیه طول میکشد؛ چیدمان و نقاشی میان دو مسیر مشترکاند و بیشتر زمان را میگیرند. بندهای متنی شکلدادهشدهای که متن و سبکشان تغییر نکرده در هر دو مسیر میان اجراها دوباره به کار میروند.
// زبان: فارسی
واردسازی رابط گرافیکی.رابط کاربری
واردسازی رابط گرافیکی.سی اس اس
ناپایا count := 0
تابع styles(): سی اس اس.برنامهسبک:
ناپایا p := سی اس اس.برنامه سبک تازه()
_box := سی اس اس.ترجمه اعلان ها(p، "padding: 16px; font-family: sans-serif")
_btn := سی اس اس.ترجمه اعلان ها(p، "padding: 6px 12px; border-radius: 6px")
_hover := سی اس اس.ترجمه اعلان ها(p، "background: #dde")
برگشت p
پایان
تابع page(b: رابط کاربری.سازندهصفحه):
b.عنوان صفحه("Counter")
b.زبان صفحه("en")
b.جهت صفحه("ltr")
b.گشودن عنصر("div")
b.اعلان های عنصر(0، -1، -1، -1)
b.گشودن عنصر("h1")
b.شناسه عنصر("count")
b.متن فرزند("Count " + count)
b.بستن عنصر()
b.گشودن عنصر("button")
b.اعلان های عنصر(1، 2، -1، -1)
b.شناسه عنصر("add")
b.کلاس عنصر("primary")
b.کلید عنصر("add")
b.ویژگی عنصر("type"، "button")
b.ویژگی دودویی عنصر("disabled"، count بزرگتر 5)
b.رسیدگی رخداد("click"، (): count++ پایان)
b.متن فرزند("Add")
b.بستن عنصر()
b.گشودن عنصر("p")
b.سبک زمان اجرا("width"، (100 + count * 10) + "px")
b.متن فرزند("Grows with the count")
b.بستن عنصر()
b.بستن عنصر()
پایان
تابع ریشه:
اگر count بزرگتر 99:
رابط کاربری.اجرای ترجمه شده((): برگشت styles() پایان، (b: رابط کاربری.سازندهصفحه): page(b) پایان)
پایان
رابط کاربری.اجرای ترجمه شده با((): برگشت styles() پایان، (b: رابط کاربری.سازندهصفحه): page(b) پایان، رابط کاربری.گزینهها { پهنا = 320.0، بلندی = 200.0، بی سر = درست، گام های آزمایشی = "click #add\nclick #add\nquit" })
سرچاپ "count"، count
ناپایا cv := رابط کاربری.نگاره ترجمه شده((): برگشت styles() پایان، (b: رابط کاربری.سازندهصفحه): page(b) پایان، 320، 200)
سرچاپ "canvas"، cv.پهنا، cv.بلندی
cv.رهاسازی()
پایانفقط آنچه عوض شده دوباره اجرا میشود
صفحهی ترجمهشده پس از هر رسیدگی کل نمایهاش را اجرا نمیکند. مترجم هر نمونهی بخش، و هر عنصر، اگر یا هر بیرون از بخشها که وضعیت میخواند، را در یک دامنه واکنشی جداگانه میگذارد و هنگام ترجمه درمییابد که هر دامنه کدام متغیرهای سراسری ناپایا را میخواند. به هر کدام از این متغیرها یک بیت تغییر میدهد و پیش از هر دستوری در برنامه که شاید آن را بنویسد (انتساب، ++، روشهایی مانند بیفزا، فرستادن با ارجاع) آن بیت را روشن میکند. متغیر بخش (خط نام := مقدار در بدنهاش) هنگام ترجمه دستهبندی میشود: متغیری که نمایه نشانش میدهد و کدی عوضش میکند وضعیت است و نوشتن در آن فقط همان نمونه را نشان میکند؛ متغیری که فقط رویدادگیرها به کار میبرند برای هر نمونه نگه داشته میشود اما هیچ چیز را دوباره اجرا نمیکند؛ متغیری که هیچ چیز عوضش نمیکند مقداری برگرفته است که هر بار نمونه اجرا میشود دوباره حساب میشود. مقداری که به بخش فرزند داده میشود نشاندادهشده به شمار میآید، پس فرزند وقتی فقط پارامترهایش عوض شوند هم دوباره اجرا میشود. پس از رسیدگی، زمانسنج یا گام پویانمایی، زمان اجرا بیتها را میخواند: اگر هیچکدام روشن نباشد هیچ چیز اجرا نمیشود؛ وگرنه فقط دامنههایی که متغیر تغییرکرده را میخوانند، از بیرونیترین، دوباره اجرا میشوند و نمونهی بخش همیشه یکجا دوباره اجرا میشود. اگر عنصرهای یک دامنه همان شکل را نگه دارند، متن و ویژگیهای تازه در همان عنصرها نوشته میشوند، فقط همانها دوباره سبک میگیرند و متن تغییرکرده در جای خود دوباره شکل میگیرد، پس چیدمان فقط وقتی اجرا میشود که اندازهای بتواند عوض شود.
نمونههای بخش درون هر با کلید سطرشان به خود پیشینشان وصل میشوند: ویژگی کلید نخستین عنصر سطر، یا شناسه اش. مترجم چنین نمونهای را با دامنه کلیددار باز میکند، پس افزودن، برداشتن یا جابهجا کردن سطرها وضعیت هر نمونه را همراه سطرش میبرد و عنصر کلیددار حالت کنترلش (متن نوشتهشده، فوکوس) و هویت چیدمانش را نگه میدارد. بدون کلید، نمونهها دنبال جایگاهشان میروند. همین متغیرهای بخش در وب با salam page build هم کار میکنند: اسکریپت صفحه هر نمونه را از وضعیتش میکشد و پس از هر رسیدگی فقط نمونههایی را که نوشته شدهاند دوباره میکشد و DOM آنها را در جای خود وصله میکند. آنجا هم نمونهی درون هر وضعیتش را با کلید سطر نگه میدارد، و بخشهایی از صفحه که یک متغیر سراسری ناپایا را میخوانند پس از رسیدگیای که آن را مینویسد دوباره کشیده میشوند.
بخشها بدون هیچ سازوکار زمان اجرا با بخشهای دورشان حرف میزنند. والد میتواند تابعی را بهعنوان پارامتر بدهد (شمارنده: تغییر = (م: صحیح): جمع += م پایان پایان) و فرزند آن را صدا بزند (تغییر(شمار))؛ فرزند میتواند با برانگیز("ذخیره"، مقدار) رویدادی بفرستد که به نزدیکترین محل کاربرد با هنگام ذخیره = (م: گونه): ... پایان میرسد و سپس سطح به سطح تا صفحه بالا میرود، مگر رویدادگیری بایست() را صدا بزند. هر دو هنگام گسترش بخشها حل میشوند، پس نوشتنهای لامبدای والد نمونهی والد را مثل هر نوشتن دیگری علامت میزنند و رویدادی از فرزندی در عمق فقط نمونههایی را دوباره اجرا میکند که وضعیتشان عوض شده (tests/fa/ui/events_bubble.salam شمارهای شمار اجرای دامنه را چاپ میکند). همین کد در وب هم اجرا میشود.
برای صفحهای با ۲۰۰ عنصر که یک شمارندهاش عوض میشود (tools/bench/gui_ui.salam، روی یک رایانهی رومیزی ششهستهای پرکار)، یک کلیک وقتی کل نمایه دوباره اجرا میشد ۳٫۴ تا ۴٫۰ میلیثانیه طول کشید و وقتی فقط دامنهی شمارنده اجرا شد ۰٫۵ تا ۰٫۷ میلیثانیه. کلیکی که رسیدگیاش هیچ چیز را عوض نمیکند پیشتر ۳٫۱ تا ۳٫۸ میلیثانیه بود و اکنون ۰٫۲ تا ۰٫۳ میلیثانیه؛ آنچه میماند فرستادن رخداد و نقاشی دوبارهی حالت فشرده است. نوشتنهایی که مترجم نمیبیند، مانند تغییر درون بستهای دیگر، بی اعتبار سازی میخواهند.
گونهها
گزینهها Options
ساختار گزینهها| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| پهنا | width | اعشار۶۴ = 1024 | پهنای پنجره به پیکسل منطقی. |
| بلندی | height | اعشار۶۴ = 768 | بلندی پنجره به پیکسل منطقی. |
| عنوان | title | رشته = "" | عنوانی برای پنجره به جای title صفحه. |
| تغییر اندازه پذیر | resizable | منطقی = درست | آیا کاربر میتواند اندازهی پنجره را تغییر دهد. |
| پس زمینه | background | رشته = "" | رنگ CSS برای پنجره پشت صفحه، به جای رنگ خود صفحه. |
| بی سر | headless | منطقی = نادرست | پنجره را در حافظه میکشد، برای آزمون و کارساز. |
| مقیاس | scale | اعشار۶۴ = 0 | ضریب مقیاس دستگاه به جای ضریب نمایشگر. |
| گام های آزمایشی | script | رشته = "" | گامهای آزمایشی که اجرا با بیسر به جای انتظار برای ورودی دنبال میکند. |
// زبان: فارسی
واردسازی رابط گرافیکی.رابط کاربری
واردسازی رشته
ناپایا count := 0
ناپایا name := ""
تابع page(): رشته:
برگشت `<!doctype html><html lang="en" dir="ltr"><head><title>Counter</title><style>button:hover{background:#dde}</style></head><body><h1 id="count">Count ` + count + `</h1><button id="add" onclick="add()">Add</button><input id="name" oninput="named(event)" placeholder="Name"><p>Hello ` + رشته.جایگزینی(name، "<"، "<") + `</p><a href="https://salamlang.ir">site</a> <a href="/about">about</a></body></html>`
پایان
تابع about(): رشته:
برگشت `<!doctype html><html><head><title>About</title></head><body><p>Made with Salam.</p><a href="/">back</a></body></html>`
پایان
تابع ریشه:
رابط کاربری.ثبت رسیدگی("add"، (): count++ پایان)
رابط کاربری.ثبت رسیدگی("named"، ():
ev := رابط کاربری.رخداد جاری()
name = ev.مقدار
سرچاپ ev.گونه رخداد، ev.هدف، ev.متن، ev.کلید، ev.تیک خورده، ev.دکمه موشی، ev.کلیدهای کمکی، ev.ایکس، ev.ایگرگ، ev.جابجایی افقی، ev.جابجایی عمودی
پایان)
رابط کاربری.صفحه برنامه("/"، (): برگشت page() پایان)
رابط کاربری.صفحه برنامه("/about"، (): برگشت about() پایان)
رابط کاربری.تنظیم بازکننده نشانی((url: رشته):
سرچاپ "would open"، url
برگشت درست
پایان)
رابط کاربری.تنظیم ناوبر((url: رشته): برگشت url برابر "/never" پایان)
اگر count بزرگتر 0:
رابط کاربری.اجرا((): برگشت page() پایان)
رابط کاربری.اجرای سند(`<p>A fixed page</p>`)
رابط کاربری.اجرای سند با(`<p>A fixed page</p>`، رابط کاربری.گزینهها { عنوان = "Fixed"، پهنا = 400.0، بلندی = 300.0 })
رابط کاربری.تازه سازی()
سرچاپ رابط کاربری.باز کردن نشانی("https://salamlang.ir")
پایان
رابط کاربری.اجرا با((): برگشت page() پایان، رابط کاربری.گزینهها { عنوان = "Counter"، پهنا = 480.0، بلندی = 320.0، تغییر اندازه پذیر = درست، پس زمینه = "#ffffff"، بی سر = درست، مقیاس = 1.0، گام های آزمایشی = "click #add\nclick #add\nquit" })
سرچاپ "count"، count، "opened"، رابط کاربری.نشانی های باز شده().طول()
پایانرخداد Event
ساختار رخداد| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| گونه رخداد | kind | رشته = "" | نام رویداد بی on: click، input، keydown و مانند آن. |
| هدف | target | رشته = "" | شناسهی عنصری که رویداد روی آن رخ داد، یا رشتهی تهی. |
| ایکس | x | اعشار۶۴ = 0 | مختصات افقی اشارهگر به پیکسل منطقی از لبهی چپ پنجره. |
| ایگرگ | y | اعشار۶۴ = 0 | مختصات عمودی اشارهگر به پیکسل منطقی از لبهی بالای پنجره. |
| دکمه موشی | button | صحیح = 0 | دکمهی موشی: ۰ چپ، ۱ میانی، ۲ راست. |
| کلید | key | رشته = "" | نام کلید همانگونه که مرورگر میگوید: a، Enter، ArrowLeft. |
| متن | text | رشته = "" | متن نوشتهشده، برای رویدادهای input. |
| مقدار | value | رشته = "" | مقدار ورودی، ناحیهی متن یا فهرست کشویی هدف. |
| تیک خورده | checked | منطقی = نادرست | آیا جعبهی تیک یا دکمهی رادیویی هدف تیک خورده است. |
| کلیدهای کمکی | modifiers | صحیح = 0 | کلیدهای کمکی نگهداشتهشده، به شکل پرچمهای کلید کمکی پنجره ها. |
| جابجایی افقی | delta_x | اعشار۶۴ = 0 | جابجایی افقی چرخ موشی. |
| جابجایی عمودی | delta_y | اعشار۶۴ = 0 | جابجایی عمودی چرخ موشی. |
نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Run.salam
نمایه زمانی Profile
ساختار نمایه زمانی| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| زمان تجزیه | parse_ms | اعشار۶۴ = 0 | میلیثانیههای تجزیهی HTML. |
| زمان سبک | style_ms | اعشار۶۴ = 0 | میلیثانیههای حساب سبکها. |
| زمان چیدمان | layout_ms | اعشار۶۴ = 0 | میلیثانیههای چیدمان و متن. |
| زمان نقاشی | paint_ms | اعشار۶۴ = 0 | میلیثانیههای نقاشی. |
| شمار عنصرها | elements | صحیح = 0 | شمار عنصرهای صفحه. |
// زبان: فارسی
واردسازی رابط گرافیکی.رابط کاربری
واردسازی سیستم عامل
واردسازی مسیر پرونده
تابع ریشه:
_a := رابط کاربری.افزودن پرونده قلم("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf")
_b := رابط کاربری.افزودن پوشه قلم("/usr/share/fonts/truetype/noto")
doc := `<!doctype html><html lang="fa" dir="rtl"><head><style>.card{border:2px solid #36c;border-radius:10px;padding:12px;margin:12px;box-shadow:0 2px 6px rgba(0,0,0,.3)}</style></head><body><div class="card"><h2>سلام</h2><p>یک کارت با <b>متن فارسی</b>.</p></div></body></html>`
ناپایا cv := رابط کاربری.نگاره(doc، 320، 200)
سرچاپ "size"، cv.پهنا، cv.بلندی
cv.رهاسازی()
ناپایا hi := رابط کاربری.نگاره با مقیاس(doc، 320، 200، 2.0)
سرچاپ "hidpi"، hi.پهنا، hi.بلندی
hi.رهاسازی()
path := مسیر پرونده.پیوند(سیستم عامل.پوشه موقت()، "gui-ui-render.png")
سرچاپ "png"، رابط کاربری.نگاره پی ان جی(doc، 320، 200، path)
سیستم عامل.حذف(path)
tree := رابط کاربری.گزارش سند(doc، 320، 200)
سرچاپ "dump starts with body"، tree.شروع با("body")
p := رابط کاربری.سنجش زمان(doc، 320، 200)
سرچاپ "elements"، p.شمار عنصرها، "timed"، p.زمان تجزیه بزرگتربرابر 0.0 و p.زمان سبک بزرگتربرابر 0.0 و p.زمان چیدمان بزرگتربرابر 0.0 و p.زمان نقاشی بزرگتربرابر 0.0
پایانسازندهصفحه Builder
ساختار سازندهصفحه// زبان: فارسی
واردسازی رابط گرافیکی.رابط کاربری
واردسازی رابط گرافیکی.سی اس اس
ناپایا count := 0
تابع styles(): سی اس اس.برنامهسبک:
ناپایا p := سی اس اس.برنامه سبک تازه()
_box := سی اس اس.ترجمه اعلان ها(p، "padding: 16px; font-family: sans-serif")
_btn := سی اس اس.ترجمه اعلان ها(p، "padding: 6px 12px; border-radius: 6px")
_hover := سی اس اس.ترجمه اعلان ها(p، "background: #dde")
برگشت p
پایان
تابع page(b: رابط کاربری.سازندهصفحه):
b.عنوان صفحه("Counter")
b.زبان صفحه("en")
b.جهت صفحه("ltr")
b.گشودن عنصر("div")
b.اعلان های عنصر(0، -1، -1، -1)
b.گشودن عنصر("h1")
b.شناسه عنصر("count")
b.متن فرزند("Count " + count)
b.بستن عنصر()
b.گشودن عنصر("button")
b.اعلان های عنصر(1، 2، -1، -1)
b.شناسه عنصر("add")
b.کلاس عنصر("primary")
b.کلید عنصر("add")
b.ویژگی عنصر("type"، "button")
b.ویژگی دودویی عنصر("disabled"، count بزرگتر 5)
b.رسیدگی رخداد("click"، (): count++ پایان)
b.متن فرزند("Add")
b.بستن عنصر()
b.گشودن عنصر("p")
b.سبک زمان اجرا("width"، (100 + count * 10) + "px")
b.متن فرزند("Grows with the count")
b.بستن عنصر()
b.بستن عنصر()
پایان
تابع ریشه:
اگر count بزرگتر 99:
رابط کاربری.اجرای ترجمه شده((): برگشت styles() پایان، (b: رابط کاربری.سازندهصفحه): page(b) پایان)
پایان
رابط کاربری.اجرای ترجمه شده با((): برگشت styles() پایان، (b: رابط کاربری.سازندهصفحه): page(b) پایان، رابط کاربری.گزینهها { پهنا = 320.0، بلندی = 200.0، بی سر = درست، گام های آزمایشی = "click #add\nclick #add\nquit" })
سرچاپ "count"، count
ناپایا cv := رابط کاربری.نگاره ترجمه شده((): برگشت styles() پایان، (b: رابط کاربری.سازندهصفحه): page(b) پایان، 320، 200)
سرچاپ "canvas"، cv.پهنا، cv.بلندی
cv.رهاسازی()
پایانعنوان صفحه Title
تابع عنوان صفحه(s: رشته)title صفحه.نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Builder.salam
زبان صفحه Lang
تابع زبان صفحه(s: رشته)lang روی html.نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Builder.salam
جهت صفحه Dir
تابع جهت صفحه(s: رشته)ltr یا rtl، را تعیین میکند، مانند dir روی html.نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Builder.salam
گشودن عنصر Open
تابع گشودن عنصر(tag: رشته)div، h1، button یا input، را به عنوان آخرین فرزند عنصر باز میگشاید. هر گشودن یک بستن میخواهد، حتی برای عنصرهای تهی.نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Builder.salam
اعلان های عنصر Decls
تابع اعلان های عنصر(base: صحیح، hover: صحیح، focus: صحیح، active: صحیح)نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Builder.salam
سبک زمان اجرا Dyn
تابع سبک زمان اجرا(prop: رشته، value: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Builder.salam
شناسه عنصر Id
تابع شناسه عنصر(s: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Builder.salam
کلاس عنصر Class
تابع کلاس عنصر(s: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Builder.salam
کلید عنصر Key
تابع کلید عنصر(s: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Builder.salam
ویژگی عنصر Attr
تابع ویژگی عنصر(name: رشته، value: رشته)href، type، value یا placeholder را تعیین میکند.نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Builder.salam
ویژگی دودویی عنصر BoolAttr
تابع ویژگی دودویی عنصر(name: رشته، value: منطقی)checked یا disabled را میگذارد.نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Builder.salam
متن فرزند Text
تابع متن فرزند(s: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Builder.salam
رسیدگی رخداد On
تابع رسیدگی رخداد(event: رشته، fn: تابع())click، dblclick، input، change، submit، keydown، keyup، focus، blur و دیگران، با نام ویژگی اچتیامال بی on. رخدادها بالا میروند؛ رخداد جاری درون بستار رخداد را توصیف میکند.نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Builder.salam
بستن عنصر Close
تابع بستن عنصر()نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Builder.salam
دامنه واکنشی Scope
تابع دامنه واکنشی(site: صحیح، fn: تابع(سازندهصفحه))site جای این بخش در نمایه است که با جایگاه دامنه ثبت میشود؛ بستار سازنده را میگیرد و همان دم اجرا میشود. صفحهی ترجمهشده هر نمونهی بخش، و هر عنصر، اگر یا هر که وضعیت میخواند، را در یک دامنه میگذارد.// زبان: فارسی
واردسازی رابط گرافیکی.رابط کاربری
واردسازی رابط گرافیکی.سی اس اس
ناپایا count := 0
ناپایا touched := 0 برگردان صحیح۶۴
ناپایا likes := وکتور {} برگردان وکتور<صحیح>
تابع take(w: صحیح): صحیح۶۴:
ناپایا t := 0 برگردان صحیح۶۴
اگر w == 0:
t = touched
touched = 0
پایان
برگشت t
پایان
تابع sites():
رابط کاربری.جایگاه دامنه(1، -1، 0، 1)
رابط کاربری.جایگاه دامنه(2، 0، 0، 0)
پایان
تابع card(b: رابط کاربری.سازندهصفحه، name: رشته):
b.دامنه واکنشی(2، (b: رابط کاربری.سازندهصفحه):
k := b.نمونه بخش(0)
اگر b.نمونه تازه():
اگر k < likes.طول():
likes[k] = 0
وگرنه:
likes.بیفزا(0)
پایان
پایان
b.گشودن عنصر("button")
b.شناسه عنصر(name)
b.رسیدگی رخداد("click"، ():
likes[k] += 1
رابط کاربری.لمس نمونه(0، k)
پایان)
b.متن فرزند(name + " " + likes[k])
b.بستن عنصر()
پایان)
پایان
تابع page(b: رابط کاربری.سازندهصفحه):
b.راه اندازی واکنش(1، (w: صحیح): برگشت take(w) پایان، (): sites() پایان)
b.گشودن عنصر("div")
b.دامنه واکنشی(1، (b: رابط کاربری.سازندهصفحه):
b.گشودن عنصر("h1")
b.شناسه عنصر("count")
b.متن فرزند("Count " + count)
b.بستن عنصر()
پایان)
b.گشودن عنصر("button")
b.شناسه عنصر("add")
b.رسیدگی رخداد("click"، ():
count++
touched |= 1
پایان)
b.متن فرزند("Add")
b.بستن عنصر()
b.گشودن عنصر("button")
b.شناسه عنصر("redraw")
b.رسیدگی رخداد("click"، (): رابط کاربری.بی اعتبار سازی() پایان)
b.متن فرزند("Redraw")
b.بستن عنصر()
card(b، "tea")
card(b، "cake")
b.بستن عنصر()
پایان
تابع ریشه:
script := "click #add\nclick #add\nclick #tea\nclick #cake\nclick #cake\nclick #redraw\nquit"
رابط کاربری.اجرای ترجمه شده با((): برگشت سی اس اس.برنامه سبک تازه() پایان، (b: رابط کاربری.سازندهصفحه): page(b) پایان، رابط کاربری.گزینهها { پهنا = 320.0، بلندی = 200.0، بی سر = درست، گام های آزمایشی = script })
سرچاپ "count"، count، "tea"، likes[0]، "cake"، likes[1]
سرچاپ "scope runs"، رابط کاربری.شمار اجرای دامنه()
پایاندامنه کلیددار KeyedScope
تابع دامنه کلیددار(site: صحیح، key: رشته، fn: تابع(سازندهصفحه))دامنه واکنشی، اما دامنه با site و key به دامنهی ساختهشدهی دفعهی پیش وصل میشود نه با جایگاه، پس وضعیت نمونهی بخش در یک سطر فهرست هنگام جابهجا شدن سطرها همراه سطر میرود. صفحهی ترجمهشده آن را برای نمونههای بخش در سطری که کلید یا شناسه دارد به کار میبرد.// زبان: فارسی
واردسازی رابط گرافیکی.رابط کاربری
واردسازی رابط گرافیکی.سی اس اس
ناپایا names := وکتور {} برگردان وکتور<رشته>
ناپایا touched := 0 برگردان صحیح۶۴
ناپایا likes := وکتور {} برگردان وکتور<صحیح>
تابع take(w: صحیح): صحیح۶۴:
ناپایا t := 0 برگردان صحیح۶۴
اگر w برابر 0:
t = touched
touched = 0
پایان
برگشت t
پایان
تابع sites():
رابط کاربری.جایگاه دامنه(1، -1، 0، 1)
رابط کاربری.جایگاه دامنه(2، 0، 0، 0)
پایان
تابع check():
ناپایا line := ""
هر n در names:
اگر line.طول() بزرگتر 0:
line += ", "
پایان
line += رابط کاربری.با شناسه(n).متن عنصر()
پایان
سرچاپ line
پایان
تابع reverse_names():
ناپایا out := وکتور {} برگردان وکتور<رشته>
هر n در names:
out.درج(0، n)
پایان
names.پاک سازی()
هر n2 در out:
names.بیفزا(n2)
پایان
out.آزادکن()
touched |= 1
پایان
تابع row(b: رابط کاربری.سازندهصفحه، name: رشته):
b.دامنه کلیددار(2، name، (b: رابط کاربری.سازندهصفحه):
k := b.نمونه بخش(0)
اگر b.نمونه تازه():
اگر k کوچکتر likes.طول():
likes[k] = 0
وگرنه:
likes.بیفزا(0)
پایان
پایان
b.گشودن عنصر("li")
b.کلید عنصر(name)
b.شناسه عنصر(name)
b.رسیدگی رخداد("click"، ():
likes[k] += 1
رابط کاربری.لمس نمونه(0، k)
پایان)
b.متن فرزند(name + " " + likes[k])
b.بستن عنصر()
پایان)
پایان
تابع page(b: رابط کاربری.سازندهصفحه):
b.راه اندازی واکنش(1، (w: صحیح): برگشت take(w) پایان، (): sites() پایان)
b.گشودن عنصر("div")
b.گشودن عنصر("button")
b.شناسه عنصر("rev")
b.رسیدگی رخداد("click"، (): reverse_names() پایان)
b.متن فرزند("Reverse")
b.بستن عنصر()
b.گشودن عنصر("button")
b.شناسه عنصر("drop")
b.رسیدگی رخداد("click"، ():
names.حذف در(0)
touched |= 1
پایان)
b.متن فرزند("Drop")
b.بستن عنصر()
b.گشودن عنصر("button")
b.شناسه عنصر("check")
b.رسیدگی رخداد("click"، (): check() پایان)
b.متن فرزند("Check")
b.بستن عنصر()
b.گشودن عنصر("ul")
b.دامنه واکنشی(1، (b: رابط کاربری.سازندهصفحه):
هر n در names:
row(b، n)
پایان
پایان)
b.بستن عنصر()
b.بستن عنصر()
پایان
تابع ریشه:
names.بیفزا("tea")
names.بیفزا("cake")
names.بیفزا("milk")
script := "click #tea\nclick #cake\nclick #cake\nclick #check\nclick #rev\nclick #check\nclick #drop\nclick #check\nquit"
رابط کاربری.اجرای ترجمه شده با((): برگشت سی اس اس.برنامه سبک تازه() پایان، (b: رابط کاربری.سازندهصفحه): page(b) پایان، رابط کاربری.گزینهها { پهنا = 320.0، بلندی = 200.0، بی سر = درست، گام های آزمایشی = script })
پایانراه اندازی واکنش Reactive
تابع راه اندازی واکنش(words: صحیح، take: تابع(صحیح): صحیح۶۴، sites: تابع())نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Scope.salam
نمونه بخش Instance
تابع نمونه بخش(comp: صحیح): صحیحcomp. این جایگاه با اجرای دوبارهی پدر عوض نمیشود، پس وضعیت بخش را میتوان برای هر جایگاه نگه داشت.نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Scope.salam
نمونه تازه Fresh
تابع نمونه تازه(): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Scope.salam
عنصر Element
ساختار عنصرعنصر پس از اجرای دوبارهی نما هم معتبر میماند.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| شناسه | id | رشته = "" | شناسهای که عنصر با آن یافت میشود. |
// زبان: فارسی
واردسازی رابط گرافیکی.رابط کاربری
ناپایا clicks := 0
تابع view(): رشته:
برگشت `<!doctype html><html><head><title>Start</title><style>.on{color:red}</style></head><body><p id="msg" class="on">Clicked ` + clicks + `</p><button id="btn" onclick="hit()">Hit</button><input id="field" value="abc"><input id="box" type="checkbox"></body></html>`
پایان
تابع ریشه:
رابط کاربری.ثبت رسیدگی("hit"، (): clicks++ پایان)
ok := رابط کاربری.آغاز((): برگشت view() پایان، رابط کاربری.گزینهها { پهنا = 320.0، بلندی = 200.0، بی سر = درست })
سرچاپ "started"، ok، رابط کاربری.پنجره جاری().عنوان پنجره()، رابط کاربری.گام(0)
رابط کاربری.اجرای گام ها("click #btn\nclick #field\ntype !")
msg := رابط کاربری.با شناسه("msg")
سرچاپ "text"، msg.متن عنصر()، "tag"، msg.برچسب()، "exists"، msg.وجود دارد()
field := رابط کاربری.با شناسه("field")
سرچاپ "value"، field.مقدار عنصر()
field.تنظیم مقدار("set")
box := رابط کاربری.با شناسه("box")
box.تنظیم تیک(درست)
سرچاپ "checked"، box.تیک خورده است()، "value"، field.مقدار عنصر()
msg.افزودن کلاس("big")
msg.حذف کلاس("on")
msg.تنظیم ویژگی("title"، "note")
سرچاپ "class"، msg.دارای کلاس("big")، msg.دارای کلاس("on")، "attr"، msg.ویژگی("title")
msg.تنظیم متن("replaced until the next view")
رابط کاربری.با شناسه("btn").تمرکز()
رابط کاربری.با شناسه("btn").نمایان کردن()
رابط کاربری.با شناسه("btn").کلیک()
_alive := رابط کاربری.گام(0)
سرچاپ "clicks"، clicks، msg.متن عنصر()، "red"، msg.سبک محاسبه شده().رنگ متن.قرمز
r := msg.مستطیل()
سرچاپ "has box"، r.پهنا بزرگتر 0.0، r.بلندی بزرگتر 0.0، r.ایکس بزرگتربرابر 0.0، r.ایگرگ بزرگتربرابر 0.0
سرچاپ "frames"، رابط کاربری.شمار قاب() بزرگتر 0، "dump lines"، رابط کاربری.گزارش درخت().طول() بزرگتر 0
رابط کاربری.اجرای گام ها("hover #btn")
سرچاپ "damage"، رابط کاربری.شمار آسیب آخر() بزرگتربرابر 0، رابط کاربری.مساحت آسیب آخر() بزرگتربرابر 0
partial := رابط کاربری.قاب().چکیده()
رابط کاربری.بازنگاری کامل()
سرچاپ "partial equals full"، partial برابر رابط کاربری.قاب().چکیده()
رابط کاربری.توقف()
_ok := رابط کاربری.آغاز سند(`<p>fixed</p>`، رابط کاربری.گزینهها { بی سر = درست })
رابط کاربری.توقف()
پایانوجود دارد Exists
تابع وجود دارد(): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Start.salam
برچسب Tag
تابع برچسب(): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Start.salam
متن عنصر Text
تابع متن عنصر(): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Start.salam
تنظیم متن SetText
تابع تنظیم متن(text: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Start.salam
مقدار عنصر Value
تابع مقدار عنصر(): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Start.salam
تنظیم مقدار SetValue
تابع تنظیم مقدار(value: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Start.salam
تیک خورده است Checked
تابع تیک خورده است(): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Start.salam
تنظیم تیک SetChecked
تابع تنظیم تیک(is_on: منطقی)نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Start.salam
تمرکز Focus
تابع تمرکز()نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Start.salam
نمایان کردن ScrollIntoView
تابع نمایان کردن()نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Start.salam
کلیک Click
تابع کلیک()نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Start.salam
دارای کلاس HasClass
تابع دارای کلاس(name: رشته): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Start.salam
افزودن کلاس AddClass
تابع افزودن کلاس(name: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Start.salam
حذف کلاس RemoveClass
تابع حذف کلاس(name: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Start.salam
ویژگی Attr
تابع ویژگی(name: رشته): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Start.salam
تنظیم ویژگی SetAttr
تابع تنظیم ویژگی(name: رشته، value: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Start.salam
سبک محاسبه شده Style
تابع سبک محاسبه شده(): سی اس اس.سبکمحاسبهشدهنمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Start.salam
مستطیل Rect
تابع مستطیل(): نقاشی.مستطیلنمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Start.salam
تابعها
اجرای ترجمه شده با RunCompiledWith
تابع اجرای ترجمه شده با(program: تابع(): سی اس اس.برنامهسبک، view: تابع(سازندهصفحه)، options: گزینهها)اجرای ترجمه شده با گزینههایی مانند اندازه، عنوان یا گامهای آزمایشی بیسر.نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Builder.salam
اجرای ترجمه شده RunCompiled
تابع اجرای ترجمه شده(program: تابع(): سی اس اس.برنامهسبک، view: تابع(سازندهصفحه))سازندهصفحه میسازد. تا بسته شدن پنجره اجرا میشود. مترجم برای صفحهای که با --ui=native ساخته میشود همین را فرا میخواند.نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Builder.salam
نگاره ترجمه شده RenderCompiled
تابع نگاره ترجمه شده(program: تابع(): سی اس اس.برنامهسبک، view: تابع(سازندهصفحه)، width: صحیح، height: صحیح): نقاشی.بومنمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Builder.salam
با شناسه ById
تابع با شناسه(id: رشته): عنصرنمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Start.salam
ثبت رسیدگی Handle
تابع ثبت رسیدگی(name: رشته، fn: تابع())onclick="name()"، onclick="name(event)" و onclick="window['name']()" آن را اجرا کنند. ثبت دوبارهی همان نام تابع را جایگزین میکند.نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Run.salam
رخداد جاری CurrentEvent
تابع رخداد جاری(): رخدادنمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Run.salam
آغاز Start
تابع آغاز(view: تابع(): رشته، options: گزینهها): منطقیگام یا اجرای گام ها پیش برده میشود. اگر پنجرهای باز نشود نادرست برمیگرداند.نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Start.salam
آغاز سند StartHtml
تابع آغاز سند(doc: رشته، options: گزینهها): منطقیآغاز برای یک سند ثابت.نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Start.salam
گام Step
تابع گام(timeout_ms: صحیح): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Start.salam
توقف Stop
تابع توقف()آغاز یا اجرا باز کرده میبندد.نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Start.salam
اجرا با RunWith
تابع اجرا با(view: تابع(): رشته، options: گزینهها)نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Run.salam
اجرا Run
تابع اجرا(view: تابع(): رشته)title صفحه باز میکند و تا بسته شدن پنجره اجرا میشود. کامپایلر برای صفحه همین را صدا میزند.نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Run.salam
اجرای سند با RunHtmlWith
تابع اجرای سند با(doc: رشته، options: گزینهها)نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Run.salam
اجرای سند RunHtml
تابع اجرای سند(doc: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Run.salam
تازه سازی Refresh
تابع تازه سازی()نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Run.salam
نگاره Render
تابع نگاره(doc: رشته، width: صحیح، height: صحیح): نقاشی.بومنمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Render.salam
نگاره با مقیاس RenderScaled
تابع نگاره با مقیاس(doc: رشته، width: صحیح، height: صحیح، scale: اعشار۶۴): نقاشی.بومنگاره با یک ضریب مقیاس، برای نمایشگرهای پرتراکم: اندازهی بوم ضرب در مقیاس است.نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Render.salam
نگاره پی ان جی RenderPNG
تابع نگاره پی ان جی(doc: رشته، width: صحیح، height: صحیح، path: رشته): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Render.salam
گزارش درخت Dump
تابع گزارش درخت(): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Start.salam
گزارش سند DumpHtml
تابع گزارش سند(doc: رشته، width: صحیح، height: صحیح): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Render.salam
سنجش زمان Measure
تابع سنجش زمان(doc: رشته، width: صحیح، height: صحیح): نمایه زمانینمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Render.salam
اجرای گام ها RunSteps
تابع اجرای گام ها(steps: رشته)آغاز باز کرده اجرا میکند، با همان زبان گامهای SALAM_UI_SCRIPT. ساعت به زمان دستی میرود تا wait آن را جلو ببرد.نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Start.salam
بازنگاری کامل RepaintAll
تابع بازنگاری کامل()نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Start.salam
شمار آسیب آخر LastDamageCount
تابع شمار آسیب آخر(): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Start.salam
شمار چینش آخر LastLayoutCalls
تابع شمار چینش آخر(): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Start.salam
مساحت آسیب آخر LastDamageArea
تابع مساحت آسیب آخر(): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Start.salam
قاب Frame
تابع قاب(): نقاشی.بومنمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Start.salam
شمار قاب FrameCount
تابع شمار قاب(): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Start.salam
پنجره جاری CurrentWindow
تابع پنجره جاری(): پنجره ها.پنجرهپنجره ها که صفحه را نشان میدهد.نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Start.salam
صفحه برنامه Page
تابع صفحه برنامه(path: رشته، view: تابع(): رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Run.salam
تنظیم بازکننده نشانی SetUrlOpener
تابع تنظیم بازکننده نشانی(opener: تابع(رشته): منطقی)http، https و mailto را باز میکند جایگزین میکند، برای آزمون یا برنامهای که خودش آنها را رسیدگی میکند.نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Run.salam
تنظیم ناوبر SetNavigator
تابع تنظیم ناوبر(navigator: تابع(رشته): منطقی)نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Run.salam
نشانی های باز شده OpenedUrls
تابع نشانی های باز شده(): وکتور<رشته>نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Run.salam
باز کردن نشانی OpenUrl
تابع باز کردن نشانی(url: رشته): منطقیxdg-open در لینوکس، open در مک و ShellExecuteW در ویندوز. اگر SALAM_UI_NO_BROWSER گذاشته شده یا نشانی تهی باشد چیزی باز نمیشود.نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Run.salam
افزودن پرونده قلم AddFontFile
تابع افزودن پرونده قلم(path: رشته): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Render.salam
افزودن پوشه قلم AddFontDir
تابع افزودن پوشه قلم(dir: رشته): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Render.salam
جایگاه دامنه ScopeSite
تابع جایگاه دامنه(site: صحیح، comp: صحیح، word: صحیح، mask: صحیح۶۴)نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Scope.salam
لمس نمونه TouchInstance
تابع لمس نمونه(comp: صحیح، slot: صحیح)نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Scope.salam
بی اعتبار سازی Invalidate
تابع بی اعتبار سازی()نمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Scope.salam
شمار اجرای دامنه ScopeRuns
تابع شمار اجرای دامنه(): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: gui-ui-Scope.salam