الفرق بين المراجعتين لصفحة: «Node.js/readline»
رهف-النجار (نقاش | مساهمات) إضافة القسم الأول من Readline |
رهف-النجار (نقاش | مساهمات) ط تنسيق |
||
(7 مراجعات متوسطة بواسطة نفس المستخدم غير معروضة) | |||
سطر 1: | سطر 1: | ||
<noinclude>{{DISPLAYTITLE:الوحدة Readline في Node.js}}</noinclude> | |||
الاستقرار 2: مستقر | الاستقرار 2: مستقر | ||
توفّر الوحدة readline واجهةً برمجيةً لقراءة سطر واحد من البيانات من المجرى القابل للقراءة (Readable) (مثل process.stdin) كل مرَّة على حدة. يمكن الوصول إليها باستخدام الأمر التالي:<syntaxhighlight lang="javascript"> | توفّر الوحدة <code>readline</code> واجهةً برمجيةً لقراءة سطر واحد من البيانات من المجرى [[القابل للقراءة (Readable)]] (مثل [[Node.js/process#process.stdin|process.stdin]]) كل مرَّة على حدة. يمكن الوصول إليها باستخدام الأمر التالي:<syntaxhighlight lang="javascript"> | ||
const readline = require('readline'); | const readline = require('readline'); | ||
</syntaxhighlight>يوضح المثال البسيط التالي الاستخدام الأساسي للوحدة readline:<syntaxhighlight lang="javascript"> | </syntaxhighlight>يوضح المثال البسيط التالي الاستخدام الأساسي للوحدة <code>readline</code>:<syntaxhighlight lang="javascript"> | ||
const readline = require('readline'); | const readline = require('readline'); | ||
سطر 21: | سطر 23: | ||
}); | }); | ||
</syntaxhighlight>حالما تُستدعى هذه الشيفرة، لن ينتهي تطبيق Node.js حتى تُغلَق الواجهة readline.Interface لأنّها تنتظر أن تُستقبل البيانات في المجرى input. | </syntaxhighlight>حالما تُستدعى هذه الشيفرة، لن ينتهي تطبيق Node.js حتى تُغلَق الواجهة <code>readline.Interface</code> لأنّها تنتظر أن تُستقبل البيانات في المجرى <code>input</code>. | ||
===الصنف: Interface=== | |||
=== الصنف Interface === | |||
أُضيف في الإصدار: 0.1.104. | أُضيف في الإصدار: 0.1.104. | ||
تُنشَأ نُسَخ الصنف readline.Interface باستخدام التابع readline.createInterface(). ترفق كل نسخة مع مجرى الدخل input الوحيد القابل للقراءة ومجرى الخرج output الوحيد القابل للكتابة. يُستخدم المجرى output لطباعة الأوامر التي يدخلها المستخدم والتي تصل وتُقرأ من مجرى input. | تُنشَأ نُسَخ الصنف <code>readline.Interface</code> باستخدام التابع <code>readline.createInterface()</code> . ترفق كل نسخة مع مجرى الدخل <code>input</code> الوحيد [[القابل للقراءة]] ومجرى الخرج <code>output</code> الوحيد [[القابل للكتابة]]. يُستخدم المجرى <code>output</code> لطباعة الأوامر التي يدخلها المستخدم والتي تصل وتُقرأ من مجرى <code>input</code>. | ||
====الحدث: 'close'==== | |||
==== الحدث 'close' ==== | |||
أُضيف في الإصدار: 0.1.98. | أُضيف في الإصدار: 0.1.98. | ||
يُطلق الحدث 'close' عندما يحدث واحد مما يلي: | يُطلق الحدث <code>'close'</code> عندما يحدث واحد مما يلي: | ||
* يُستدعى التابع rl.close() وقد تخلّت نسخة readline.Interface عن التحكم بمجريي الدخل input والخرج output. | *يُستدعى التابع <code>rl.close()</code> وقد تخلّت نسخة <code>readline.Interface</code> عن التحكم بمجريي الدخل <code>input</code> والخرج <code>output</code>. | ||
* يستقبل المجرى input الحدث 'end' الخاص به. | *يستقبل المجرى <code>input</code> الحدث <code>'end'</code> الخاص به. | ||
* يستقبل مجرى الدخل input الإشارة EOT (نهاية الإرسال [end-of-transmission]) عبر ضغط المستخدم على المفتاحين <ctrl>- | *يستقبل مجرى الدخل <code>input</code> الإشارة EOT (نهاية الإرسال [end-of-transmission]) عبر ضغط المستخدم على المفتاحين <code><ctrl>-D</code>. | ||
* يستقبل مجرى الدخل input الإشارة SIGINT عبر ضغط المستخدم على المفتاحين ctrl>-C> ولا يوجد مستمع للحدث 'SIGINT' مُسجَّل على نسخة readline.Interface. | *يستقبل مجرى الدخل <code>input</code> الإشارة <code>SIGINT</code> عبر ضغط المستخدم على المفتاحين <code>ctrl>-C></code> ولا يوجد مستمع للحدث <code>'SIGINT'</code> مُسجَّل على نسخة <code>readline.Interface</code>. | ||
تُستدعَى الدالة المستمعة (listener) دون تمرير أي وسائط. | تُستدعَى الدالة المستمعة (listener) دون تمرير أي وسائط. | ||
تُنهى النسخة readline.Interface حالما يُطلق الحدث 'close'. | تُنهى النسخة <code>readline.Interface</code> حالما يُطلق الحدث <code>'close'</code>. | ||
====الحدث 'line'==== | |||
==== الحدث 'line' ==== | |||
أُضيف في الإصدار:0.1.98. | أُضيف في الإصدار:0.1.98. | ||
يُطلق الحدث 'line' كلّما استقبل المجرى input محرف نهاية السطر (المحرف n\ أو r\ أو \r\n). هذا يحدث عادةً عندما يضغط المستخدم المفاتيح <Enter> أو <Return>. | يُطلق الحدث <code>'line'</code> كلّما استقبل المجرى <code>input</code> محرف نهاية السطر (المحرف <code>n\</code> أو <code>r\</code> أو <code>\r\n</code>). هذا يحدث عادةً عندما يضغط المستخدم المفاتيح <code><Enter></code> أو <code><Return></code>. | ||
تُستدعى الدالة المستمعة مع سلسلة نصية متضمنةً سطرًا وحيدًا من الدخل المُستقبل.<syntaxhighlight lang="javascript"> | تُستدعى الدالة المستمعة مع سلسلة نصية متضمنةً سطرًا وحيدًا من الدخل المُستقبل.<syntaxhighlight lang="javascript"> | ||
سطر 50: | سطر 49: | ||
}); | }); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
====الحدث 'pause'==== | |||
== الحدث 'pause' == | |||
أُضيف في الإصدار: 0.7.5. | أُضيف في الإصدار: 0.7.5. | ||
يُطلق الحدث 'pause' عندما يحدث واحد مما يلي: | يُطلق الحدث <code>'pause'</code> عندما يحدث واحد مما يلي: | ||
* يُوقف المجرى input مؤقتًا. | *يُوقف المجرى <code>input</code> مؤقتًا. | ||
* لم يُوقف المجرى input ولكنه استقبل الحدث 'SIGCONT'. (انظر الحدثين 'SIGTSTP' و 'SIGCONT'.) | *لم يُوقف المجرى <code>input</code> ولكنه استقبل الحدث <code>'SIGCONT'</code>. (انظر الحدثين [[Node.js/readline#.D8.A7.D9.84.D8.AD.D8.AF.D8.AB .27SIGTSTP.27|'SIGTSTP']] و [[Node.js/readline#.D8.A7.D9.84.D8.AD.D8.AF.D8.AB .27SIGCONT.27|'SIGCONT']].) | ||
تُستدعى الدالة المستمعة دون تمرير أي وسائط.<syntaxhighlight lang="javascript"> | تُستدعى الدالة المستمعة دون تمرير أي وسائط.<syntaxhighlight lang="javascript"> | ||
rl.on('pause', () => { | rl.on('pause', () => { | ||
سطر 63: | سطر 61: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
====الحدث 'resume'==== | |||
== الحدث 'resume' == | |||
أضيف في الإصدار: 0.7.5. | أضيف في الإصدار: 0.7.5. | ||
يُطلق الحدث 'resume' عندما يُستأنَف المجرى input. | يُطلق الحدث <code>'resume'</code> عندما يُستأنَف المجرى <code>input</code>. | ||
تُستدعى الدالة المستمعة دون تمرير أي وسائط.<syntaxhighlight lang="javascript"> | تُستدعى الدالة المستمعة دون تمرير أي وسائط.<syntaxhighlight lang="javascript"> | ||
سطر 74: | سطر 71: | ||
}); | }); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
====الحدث 'SIGCONT'==== | |||
== الحدث 'SIGCONT' == | |||
أضيف في الإصدار: 0.7.5. | أضيف في الإصدار: 0.7.5. | ||
يُطلق الحدث 'SIGCONT' عندما تكون عملية Node.js قد انتقلت مسبقًا إلى الخلفية باستخدام المفتاحين <ctrl>-Z (أي عبر استلام الإشارة SIGTSTP) ثمَّ أعيدت إلى المقدمة باستخدام الدالة fg(1p). | يُطلق الحدث <code>'SIGCONT'</code> عندما تكون عملية Node.js قد انتقلت مسبقًا إلى الخلفية باستخدام المفتاحين <code><ctrl>-Z</code> (أي عبر استلام الإشارة <code>SIGTSTP</code>) ثمَّ أعيدت إلى المقدمة باستخدام الدالة [http://man7.org/linux/man-pages/man1/fg.1p.html fg(1p)]. | ||
إذا كان مجرى الدخل input متوقف مؤقتًا قبل استلام الإشارة SIGTSTP، فلن يُطلق هذا الحدث. | إذا كان مجرى الدخل <code>input</code> متوقف مؤقتًا قبل استلام الإشارة SIGTSTP، فلن يُطلق هذا الحدث. | ||
تُستدعى الدالة المستمعة دون تمرير أي وسائط.<syntaxhighlight lang="javascript"> | تُستدعى الدالة المستمعة دون تمرير أي وسائط.<syntaxhighlight lang="javascript"> | ||
سطر 91: | سطر 87: | ||
}); | }); | ||
</syntaxhighlight>الحدث 'SIGCONT' ليس مدعومًا على أنظمة ويندوز. | </syntaxhighlight>الحدث <code>'SIGCONT'</code> ليس مدعومًا على أنظمة ويندوز. | ||
====الحدث 'SIGINT'==== | |||
== الحدث 'SIGINT' == | |||
أضيف في الإصدار: 0.3.0. | أضيف في الإصدار: 0.3.0. | ||
يُطلق الحدث 'SIGINT' عندما يستلم المجرى input الإشارة SIGINT عبر الضغط على المفتاحين <ctrl>- | يُطلق الحدث <code>'SIGINT'</code> عندما يستلم المجرى <code>input</code> الإشارة <code>SIGINT</code> عبر الضغط على المفتاحين <code><ctrl>-C</code>. إذا لم يوجد هناك أي مستمع مسجل للحدث 'SIGINT' عندما يتلقى المجرى input الإشارة SIGINT، فسيُطلق الحدث <code>'pause'</code>. | ||
تُستدعى دالة المنصت دون تمرير أي وسائط.<syntaxhighlight lang="javascript"> | تُستدعى دالة المنصت دون تمرير أي وسائط.<syntaxhighlight lang="javascript"> | ||
سطر 106: | سطر 101: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
====الحدث 'SIGTSTP'==== | |||
== الحدث 'SIGTSTP' == | |||
أُضيف في الإصدار: 0.7.5. | أُضيف في الإصدار: 0.7.5. | ||
يُطلق الحدث 'SIGTSTP' عندما يتلقى المجرى input الإشارة SIGTSTP عبر ضغط المفتاحين <ctrl>- | يُطلق الحدث <code>'SIGTSTP'</code> عندما يتلقى المجرى <code>input</code> الإشارة <code>SIGTSTP</code> عبر ضغط المفتاحين <code><ctrl>-Z</code>. إذا لم يوجد هناك أي مستمع مسجل للحدث <code>'SIGTSTP'</code> عندما يتلقى المجرى <code>input</code> الإشارة <code>SIGTSTP</code>، فستُرسل عملية Node.js إلى الخلفية. | ||
عندما يُستأنَف البرنامج باستخدام الدالة fg(1p)، سيُطلق الحدثان 'pause' و 'SIGCONT'. يمكن استخدام ذلك لاستئناف المجرى input. | عندما يُستأنَف البرنامج باستخدام الدالة fg(1p)، سيُطلق الحدثان <code>'pause'</code> و <code>'SIGCONT'</code>. يمكن استخدام ذلك لاستئناف المجرى <code>input</code>. | ||
لن يُطلَق الحدثان 'pause' و'SIGCONT' إذا أُوقِف المجرى input قبل أن تُرسَل العملية إلى الخلفية. | لن يُطلَق الحدثان <code>'pause'</code> و<code>'SIGCONT'</code> إذا أُوقِف المجرى <code>input</code> قبل أن تُرسَل العملية إلى الخلفية. | ||
تُستدعَى الدالة المستمعة دون تمرير أي وسائط.<syntaxhighlight lang="javascript"> | تُستدعَى الدالة المستمعة دون تمرير أي وسائط.<syntaxhighlight lang="javascript"> | ||
سطر 124: | سطر 118: | ||
}); | }); | ||
</syntaxhighlight>الحدث 'SIGTSTP' ليس مدعومًا على نظام ويندوز. | </syntaxhighlight>الحدث <code>'SIGTSTP'</code> ليس مدعومًا على نظام ويندوز. | ||
====rl.close()==== | |||
== rl.close() == | |||
أضيف في الإصدار: 0.1.98. | أضيف في الإصدار: 0.1.98. | ||
يغلق التابع rl.close() النسخة readline.Interface ويتخلى عن التحكم بمجريي الدخل input و الخرج output. عندما استدعائه، سيُطلَق الحدث 'close'. | يغلق التابع <code>rl.close()</code> النسخة <code>readline.Interface</code> ويتخلى عن التحكم بمجريي الدخل <code>input</code> و الخرج <code>output</code>. عندما استدعائه، سيُطلَق الحدث <code>'close'</code>. | ||
لن يوقف استدعاء التابع rl.close() إطلاق بقية الأحداث (بما فيها الحدث 'line') مباشرةً من قِبَل النسخة readline.Interface. | لن يوقف استدعاء التابع <code>rl.close()</code> إطلاق بقية الأحداث (بما فيها الحدث <code>'line'</code>) مباشرةً من قِبَل النسخة <code>readline.Interface</code>. | ||
====rl.pause()==== | |||
== rl.pause() == | |||
أضيف في الإصدار: 0.3.4. | أضيف في الإصدار: 0.3.4. | ||
يوقف التابع rl.pause() المجرى input مؤقتًا، سامحًا له بالاستئناف لاحقًا عند الحاجة. | يوقف التابع <code>rl.pause()</code> المجرى input مؤقتًا، سامحًا له بالاستئناف لاحقًا عند الحاجة. | ||
لن يوقف استدعاء rl.pause() إطلاق بقية الأحداث (بما فيها الحدث 'line') مباشرةً من قِبَل النسخة readline.Interface. | لن يوقف استدعاء <code>rl.pause()</code> إطلاق بقية الأحداث (بما فيها الحدث <code>'line'</code>) مباشرةً من قِبَل النسخة <code>readline.Interface</code>. | ||
====rl.prompt([preserveCursor])==== | |||
== rl.prompt([preserveCursor]) == | |||
أضيف في الإصدار: 0.1.98. | أضيف في الإصدار: 0.1.98. | ||
* preserveCursor: <boolean> قيمة منطقية إن كانت | *<code>preserveCursor</code>: [[JavaScript/Boolean|<boolean>]] قيمة منطقية إن كانت <code>true</code>، فستمنع المؤشر من إعادة تعيين موضعه إلى <code>0</code> (بداية المجرى). | ||
يكتب التابع rl.prompt() النُسخ readline.Interface التي ضُبِط فيها المحث prompt إلى سطر جديد في المجرى output من أجل تزويد المستخدم بموقع جديد ليدخل البيانات فيه. | يكتب التابع <code>rl.prompt()</code> النُسخ <code>readline.Interface</code> التي ضُبِط فيها المحث <code>prompt</code> إلى سطر جديد في المجرى <code>output</code> من أجل تزويد المستخدم بموقع جديد ليدخل البيانات فيه. | ||
عند استدعاء التابع rl.prompt()، سيستأنف المجرى input إذا كان قد أُوقف مؤقتًا. | عند استدعاء التابع <code>rl.prompt()</code>، سيستأنف المجرى <code>input</code> إذا كان قد أُوقف مؤقتًا. | ||
إذا أُنشئت النسخة readline.Interface مع ضبط المجرى output إلى القيمة null أو | إذا أُنشئت النسخة <code>readline.Interface</code> مع ضبط المجرى <code>output</code> إلى القيمة <code>null</code> أو <code>undefined</code>، فلن يُكتَب على المحث (prompt). | ||
====rl.question(query, callback)==== | |||
== rl.question(query, callback) == | |||
أضيف في الإصدار: 0.3.3. | أضيف في الإصدار: 0.3.3. | ||
* | *<code>query</code>: [[JavaScript/String|<string>]] عبارة أو استعلام يرا كتابتها على المجرى output، مضافةً إلى بداية المِحَث. | ||
* | *<code>callback</code>: [[JavaScript/Function|<Function>]] دالة رد نداء التي يراد استدعاؤها مع مدخلات المستخدم عند الاستجابة إلى الاستعلام <code>query</code>. | ||
يعرض التابع rl.question() قيمة الاستعلام query عن طريق كتابته على المجرى | يعرض التابع <code>rl.question()</code> قيمة الاستعلام <code>query</code> عن طريق كتابته على المجرى <code>output</code>، بعد أن ينتظر مدخلات المستخدم ليكتبها على المجرى <code>input</code>. بعد ذلك، يستدعي التابع دالة رد النداء <code>callback</code> مُمرّرًا المدخلات المستلمة من الستخدم إليها كأول وسيط. | ||
عند استدعائه، سوف يستأنف rl.question() المجرى input إذا كان قد أُوقف مؤقتًا. | عند استدعائه، سوف يستأنف <code>rl.question()</code> المجرى <code>input</code> إذا كان قد أُوقف مؤقتًا. | ||
ذا أُنشئت النسخة readline.Interface مع ضبط المجرى output إلى القيمة null أو | ذا أُنشئت النسخة <code>readline.Interface</code> مع ضبط المجرى <code>output</code> إلى القيمة <code>null</code> أو <code>undefined</code>، فلن يُكتَب الاستعلام <code>query</code>. | ||
اطلع على المثال التالي الذي يشرح ما سبق:<syntaxhighlight lang="javascript"> | اطلع على المثال التالي الذي يشرح ما سبق:<syntaxhighlight lang="javascript"> | ||
سطر 164: | سطر 154: | ||
}); | }); | ||
</syntaxhighlight>لا تتبع دالة رد النداء المُمررة إلى التابع rl.question() النموذج القياسي لقبول الكائن Error أو null كأول وسيط لها، إذ تُستدعَى دالة | </syntaxhighlight>لا تتبع دالة رد النداء <code>callback</code> المُمررة إلى التابع <code>rl.question()</code> النموذج القياسي لقبول الكائن <code>Error</code> أو <code>null</code> كأول وسيط لها، إذ تُستدعَى دالة <code>callback</code> مع تمرير الجواب الذي استُلِم من المستخدم كأول وسيط لها. | ||
====rl.resume()==== | |||
== rl.resume() == | |||
أضيف في الإصدار: 0.3.4. | أضيف في الإصدار: 0.3.4. | ||
يستأنف التابع rl.resume() المجرى input إذا أُوقِف مؤقتًا. | يستأنف التابع <code>rl.resume()</code> المجرى <code>input</code> إذا أُوقِف مؤقتًا. | ||
====rl.setPrompt(prompt)==== | |||
== rl.setPrompt(prompt) == | |||
أضيف في الإصدار: 0.1.98. | أضيف في الإصدار: 0.1.98. | ||
* Prompt: <string> | *<code>Prompt</code>: [[JavaScript/String|<string>]] | ||
سوف يضبط التابع rl.setPrompt() المِحَث الذي سيكتب على المجرى output كلما استدعي التابع rl.prompt(). | سوف يضبط التابع <code>rl.setPrompt()</code> المِحَث الذي سيكتب على المجرى <code>output</code> كلما استدعي التابع <code>rl.prompt()</code>. | ||
====rl.write(data[, key])==== | |||
== rl.write(data[, key]) == | |||
أضيف في الإصدار: 0.1.98. | أضيف في الإصدار: 0.1.98. | ||
* data: <string> | *<code>data</code>: [[JavaScript/String|<string>]] | ||
* key: <Object> | *<code>key</code>: [[JavaScript/Object|<Object>]] | ||
** Ctrl: <boolean> قيمة منطقية إن كانت true فستشير إلى المفتاح <ctrl>. | **<code>Ctrl</code>: [[JavaScript/Boolean|<boolean>]] قيمة منطقية إن كانت true فستشير إلى المفتاح <code><ctrl></code>. | ||
** Meta: <boolean> قيمة منطقية إن كانت true فستشير إلى المفتاح <Meta>. | **<code>Meta</code>: [[JavaScript/Boolean|<boolean>]] قيمة منطقية إن كانت true فستشير إلى المفتاح <code><Meta></code>. | ||
** Shift: <boolean> قيمة منطقية إن كانت true فستشير إلى المفتاح <Shift>. | **<code>Shift</code>: [[JavaScript/Boolean|<boolean>]] قيمة منطقية إن كانت true فستشير إلى المفتاح <code><Shift></code>. | ||
** Name: <string> سلسلة نصية تمثِّل اسم المفتاح. | **<code>Name</code>: [[JavaScript/String|<string>]] سلسلة نصية تمثِّل اسم المفتاح. | ||
سيكتب التابع rl.write() إمّا قيمة المعامل data أو تسلسل المفتاح المعرّف من قبل المعامل key إلى المجرى output. الوسيط key مدعومٌ إذا كانت TTY | سيكتب التابع <code>rl.write()</code> إمّا قيمة المعامل <code>data</code> أو تسلسل المفتاح المعرّف من قبل المعامل <code>key</code> إلى المجرى <code>output</code>. الوسيط <code>key</code> مدعومٌ إذا كانت <code>output</code> هي [[Node.js/tty|TTY]] طرفية كتابة فقط. | ||
إذا كان المعامل key مُحددًا، فسيُتجاهَل المعامل data. | إذا كان المعامل <code>key</code> مُحددًا، فسيُتجاهَل المعامل <code>data</code>. | ||
عند استدعاء | عند استدعاء <code>rl.write()</code>، سيستأنف المجرى <code>input</code> إذا كان قد أُوقف مؤقتًا. | ||
إذا أُنشئت النسخة readline.Interface مع ضبط المجرى output إلى القيمة null أو | إذا أُنشئت النسخة <code>readline.Interface</code> مع ضبط المجرى <code>output</code> إلى القيمة <code>null</code> أو <code>undefined</code>، فلن تُكتَب قيمة المعامل <code>data</code> أو المعامل <code>key</code>.<syntaxhighlight lang="javascript"> | ||
rl.write('Delete this!'); | rl.write('Delete this!'); | ||
// لحذف السطر المكتوب سابقًا Ctrl+u محاكي ضغط المفتاحين | // لحذف السطر المكتوب سابقًا Ctrl+u محاكي ضغط المفتاحين | ||
rl.write(null, { ctrl: true, name: 'u' }); | rl.write(null, { ctrl: true, name: 'u' }); | ||
</syntaxhighlight>سوف يكتب التابع rl.write() البيانات إلى المجرى input كما أعطيت من قبل المستخدم تمامًا. | </syntaxhighlight>سوف يكتب التابع <code>rl.write()</code> البيانات إلى المجرى <code>input</code> كما أعطيت من قبل المستخدم تمامًا. | ||
===readline.clearLine(stream, dir)=== | |||
أُضيف في الإصدار: 0.7.7. | |||
*<code>stream</code>: [/kjjhhhhgNode.js/stream <stream.Writable>] | |||
*<code>dir</code>: [[JavaScript/Number|<number>]] | |||
**<code>1-</code>: على يسار المؤشر | |||
**<code>1</code>: على يمين المؤشر | |||
**<code>0</code>: كل السطر | |||
يمسح التابع <code>readline.clearLine()</code> السطر الحالي من المجرى [[Node.js/tty|TTY]] المُعطى انطلاقًا من مؤضع المؤشر الحالي وباتجاهٍ محدَّدٍ مُعرّف عبر المعامل dir. | |||
===readline.clearScreenDown(stream)=== | |||
أُضيف في الإصدار: 0.7.7. | |||
*<code>stream</code>: [/kjjhhhhgNode.js/stream <stream.Writable>] | |||
يمسح التابع <code>readline.clearScreenDown()</code> مجرى [[Node.js/tty|TTY]] المعُطى من موقع المؤشر الحالي وبالاتجاه الأسفل. | |||
===readline.createInterface(options)=== | |||
سجل التغييرات | |||
{| class="wikitable" | |||
!<span>الإصدار</span> | |||
!<span>التغييرات</span> | |||
|- | |||
|<span>8.3.0, 6.11.4</span> | |||
|<span>إزالة الحدود الأعظمية للخيار <code>crlfDelay</code>.</span> | |||
|- | |||
|<span>6.6.0</span> | |||
|<span>أصبح الخيار <code>crlfDelay</code> مدعومًا الآن.</span> | |||
|- | |||
|<span>6.3.0</span> | |||
|<span>أصبح الخيار <code>prompt</code> مدعومًا الآن.</span> | |||
|- | |||
|<span>6.0.0</span> | |||
|يمكن الآن أن يأخذ الخيار <code>historySize</code> القيمة <code>0</code>. | |||
|- | |||
|<span>0.1.98</span> | |||
|<span>أُضيف هذا التابع.</span> | |||
|} | |||
*<span><code>options</code>: [[JavaScript/Object|<Object>]]</span> | |||
**<span><code>input</code>: [[Node.js/streamkdsfla\|<stream.Readable>]] المجرى [[القابل للقراءة]] المراد الاستماع إليه. هذا الخيار مطلوب.</span> | |||
**<span><code>output</code>: [[Node.js/streamkdsfla\|<stream.Writable>]] المجرى [[القابل للكتابة]] لكتابة بيانات سطرية فيه.</span> | |||
**<span><code>completer</code>: [[JavaScript/Function|<Function>]] دالة اختيارية تستخدم للإكمال التلقائي عبر الضغط على المفتاح Tap.</span> | |||
**<span><code>terminal</code>: [[JavaScript/Boolean|<boolean>]] قيمة منطقية تكون <code>true</code> إذا كان ينبغي معاملة المجريين <code>output</code> و <code>input</code> كأنهما TTY وأن يمتلكا شيفرات الهروب ANSI/VT100 مكتوبة له. '''القيمة الإفتراضية''' تكون بناءً على التحقق من <code>isTTY</code> على المجرى <code>output</code>.</span> | |||
**<span><code>historySize</code>: <number> العدد الأعظمي لأسطر التاريخ المحفوظة. لتعطيل التاريخ، اضبط قيمة هذا الخيار إلى <code>0</code>. هذا الخيار له معنى فقط إذا كان الخيار <code>terminal</code> مضبوطًا إلى القيمة <code>true</code> من قبل المستخدم أو من قبل فحص المجرى <code>output</code> الداخلي. فيما عدا ذلك، لن تُهيأ آلية تخزين التاريخ مطلقًا. '''القيمة الإفتراضية:''' <code>30</code>.</span> | |||
**<span><code>prompt</code>: [[JavaScript/String|<string>]] السلسلة النصية المراد استعمالها مع المِحَث. '''القيمة الإفتراضية''':<code>'> '</code>.</span> | |||
**<span><code>crlfDelay</code>: [[JavaScript/Number|<number>]] إذا تجاوز التأخير بين المحرف <code>\r</code> والمحرف <code>\n</code> القيمة <code>crlfDelay</code> المعطاة بالميلي ثانية، فسيعاملان كمحرفي نهاية سطر منفصلين. لا يجب أن تقل قيمة الخيار <code>crlfDelay</code> عن <code>100</code> وستستعمل هذه القيمة إن كانت القيمة المعطاة أقل منها. يمكن أن يُضبَط الخيار إلى القيمة Infinity (قيمة لا نهائية)؛ في هذه الحالة، سيُعدُّ المحرف <code>r\</code> عندما يُتبَع بالمحرف <code>\n</code> سطرًا جديدًا مفردًا دائمًا (هذا قد يكون منطقيًا من أجل [[Node.js/readline#.D9.82.D8.B1.D8.A7.D8.A1.D8.A9 .D9.85.D8.AC.D8.B1.D9.89 .D9.85.D9.84.D9.81 .D8.B3.D8.B7.D8.B1.D9.8B.D8.A7 .D8.A8.D8.B3.D8.B7.D8.B1|قراءة الملفات]] مع الفاصل السطري <code>\r\n</code>). '''القيمة الإفتراضية:''' <code>100</code>.</span> | |||
**<span><code>removeHistoryDuplicates</code>: [[JavaScript/Boolean|<boolean>]] قيمة منطقية إذا كانت <code>true</code>، فسيُزال سطر التأريخ القديم من القائمة عندما يضاف سطرٌ جديدٌ مماثل له (أي عند تكراره). القيمة الإفتراضية: <code>false</code>.</span> | |||
<span>ينشئ التابع <code>readline.createInterface()</code> نسخةً جديدةً من الصنف <code>readline.Interface</code>.</span><syntaxhighlight lang="javascript"> | |||
const readline = require('readline'); | |||
const rl = readline.createInterface({ | |||
input: process.stdin, | |||
output: process.stdout | |||
}); | |||
</syntaxhighlight><span>حالما تُنشأ النسخة <code>readline.Interface</code>، تكون الحالة الأكثر شيوعًا هي الاستماع إلى الحدث <code>'line'</code>:</span><syntaxhighlight lang="javascript"> | |||
rl.on('line', (line) => { | |||
console.log(`Received: ${line}`); | |||
}); | |||
</syntaxhighlight><span>إذا كانت قيمة الخيار <code>terminal</code> هي <code>true</code> من أجل هذه النسخة، سيحصل المجرى <code>output</code> على أفضل توافق إذا/أو عند تغير الأعمدة إذا عُرِّفت الخاصية <code>output.columns</code> وأطلق الحدث <code>'resize'</code> على المجرى <code>output</code> (يفعل المجرى [[Node.js/process#process.stdout|process.stdout]] ذلك تلقائيًا عندما يكون TTY).</span> | |||
==== <span>استخدام دالة `completer`</span> ==== | |||
<span>تأخذ الدالة <code>completer</code> السطر الحالي المُدخَل من قبل المستخدم كوسيط، وتعيد المصفوفة Array مع مدخلتين:</span> | |||
<span>مصفوفة <code>Array</code> مع مدخلات مطابقة للإكمال، و</span> | |||
<span>السلاسل النصية الفرعية التي استخدمت للمطابقة.</span> | |||
<span>على سبيل المثال: <code>[[substr1, substr2, ...], originalsubstring]</code>.</span><syntaxhighlight lang="javascript"> | |||
function completer(line) { | |||
const completions = '.help .error .exit .quit .q'.split(' '); | |||
const hits = completions.filter((c) => c.startsWith(line)); | |||
// تعرض كل احتمالات الإكمال إذا وجدت | |||
return [hits.length ? hits : completions, line]; | |||
} | |||
</syntaxhighlight><span>يمكن أن تُستدعَى الدالة <code>completer</code> بشكل غير متزامن إذا قبلت وسيطين مثل:</span><syntaxhighlight lang="javascript"> | |||
function completer(linePartial, callback) { | |||
callback(null, [['123'], linePartial]); | |||
} | |||
</syntaxhighlight> | |||
===<span>readline.cursorTo(stream, x, y)</span>=== | |||
=== <span>أُضيف في الإصدار: 0.7.7.</span> === | |||
*<span><code>stream</code>: [[jdhsk.fhjafd|<stream.Writable>]]</span> | |||
*<span><code>x</code>: [[JavaScript/Number|<number>]]</span> | |||
*<span><code>y</code>: [[JavaScript/Number|<number>]]</span> | |||
<span>ينقل التابع <code>readline.cursorTo()</code> المؤشر إلى موضع محدد في المجرى <code>stream</code> المعطى الذي من النوع [[Node.js/tty|TTY]].</span> | |||
===<span>readline.emitKeypressEvents(stream[, interface])</span>=== | |||
<span>أُضيف في الإصدار: 0.7.7.</span> | |||
*<span><code>stream</code>: [[hfjs;lhjsla\df|<stream.Readable>]]</span> | |||
*<span><code>interface</code>: [[Node.js/readline#.D8.A7.D9.84.D8.B5.D9.86.D9.81: Interface|<readline.Interface>]]</span> | |||
<span>يسبب التابع <code>readline.emitKeypressEvents()</code> ببدء المجرى [[fdgzgdx|القابل للقراءة]] إطلاق الأحداث <code>'keypress'</code> بما يتوافق مع المدخلات المُستقبلَة.</span> | |||
<span>اختياريًّا، يحدِّد المعامل <code>interface</code> النسخة <code>readline.Interface</code> التي سيُعطَل الإكمال التلقائي فيها عندما تكتشف عملية نسخٍ ولصقٍ للمدخلات.</span> | |||
<span>إذا كان المجرى <code>stream</code> من النوع [[Node.js/tty|TTY]]، فيجب حينئذٍ أن تكون في الوضع الخام (raw mode).</span> | |||
<span>يُستدعى هذا التابع تلقائيًا من قبل أية نسخة من النوع <code>readline</code> على المجرى <code>input</code> الخاص بها إذا كان المجرى <code>input</code> هو طرفية. لن يوقف إغلاق النسخة <code>readline</code> المجرى <code>input</code> من إطلاق الأحداث <code>'keypress'</code>.</span><syntaxhighlight lang="javascript"> | |||
readline.emitKeypressEvents(process.stdin); | |||
if (process.stdin.isTTY) | |||
process.stdin.setRawMode(true); | |||
= readline. | </syntaxhighlight> | ||
أُضيف في الإصدار: 0.7.7. | ===<span>readline.moveCursor(stream, dx, dy)</span>=== | ||
* stream: <stream.Writable> | <span>أُضيف في الإصدار: 0.7.7.</span> | ||
* | *<span><code>stream</code>: [[dfvzfvzdg|<stream.Writable>]]</span> | ||
* | *<span><code>dx</code>: [[JavaScript/Number|<number>]]</span> | ||
*<span><code>dy</code>: [[JavaScript/Number|<number>]]</span> | |||
<span>ينقل التابع <code>readline.moveCursor()</code> المؤشر نسبةً إلى موقعه الحالي في المجرى <code>stream</code> المعطى الذي من النوع [[Node.js/tty|TTY]].</span> | |||
===<span>أمثلة</span>=== | |||
====<span>واجهة سطر أوامر صغيرة (Tiny CLI)</span>==== | |||
<span>يوضّح المثال التالي كيفية استخدام الصنف <code>readline.Interface</code> لإنشاء واجهة سطر أوامر صغيرة:</span><syntaxhighlight lang="javascript"> | |||
const readline = require('readline'); | |||
const rl = readline.createInterface({ | |||
input: process.stdin, | |||
output: process.stdout, | |||
prompt: 'OHAI> ' | |||
}); | |||
rl.prompt(); | |||
rl.on('line', (line) => { | |||
switch (line.trim()) { | |||
case 'hello': | |||
console.log('world!'); | |||
break; | |||
default: | |||
console.log(`Say what? I might have heard '${line.trim()}'`); | |||
break; | |||
} | |||
rl.prompt(); | |||
}).on('close', () => { | |||
console.log('Have a great day!'); | |||
process.exit(0); | |||
}); | |||
</syntaxhighlight> | |||
====<span>قراءة مجرى ملف سطرًا بسطر</span>==== | |||
<span>الاستخدام الشائع للنسخة <code>readline</code> هو قراءة الدخل من مجرًى [[sdgfszg|قابلٍ للقراءة]] لنظام الملفات سطرًا واحدًا في كل مرة:</span><syntaxhighlight lang="javascript"> | |||
const readline = require('readline'); | |||
const fs = require('fs'); | |||
const rl = readline.createInterface({ | |||
input: fs.createReadStream('sample.txt'), | |||
crlfDelay: Infinity | |||
}); | |||
rl.on('line', (line) => { | |||
console.log(`Line from file: ${line}`); | |||
}); | |||
</syntaxhighlight><span>مصادر</span> | |||
<span> </span> | <span> </span> | ||
<span>[https://nodejs.org/dist/latest-v10.x/docs/api/readline.html صفحة الوحدة Readline في توثيق Node.js الرسمي.]</span> | |||
[[تصنيف:Node.js]] |
المراجعة الحالية بتاريخ 11:07، 20 نوفمبر 2018
الاستقرار 2: مستقر
توفّر الوحدة readline
واجهةً برمجيةً لقراءة سطر واحد من البيانات من المجرى القابل للقراءة (Readable) (مثل process.stdin) كل مرَّة على حدة. يمكن الوصول إليها باستخدام الأمر التالي:
const readline = require('readline');
يوضح المثال البسيط التالي الاستخدام الأساسي للوحدة readline
:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('What do you think of Node.js? ', (answer) => {
// في قاعدة بيانات (answer) للتنفيذ: سجل الجواب
console.log(`Thank you for your valuable feedback: ${answer}`);
rl.close();
});
حالما تُستدعى هذه الشيفرة، لن ينتهي تطبيق Node.js حتى تُغلَق الواجهة readline.Interface
لأنّها تنتظر أن تُستقبل البيانات في المجرى input
.
الصنف: Interface
أُضيف في الإصدار: 0.1.104.
تُنشَأ نُسَخ الصنف readline.Interface
باستخدام التابع readline.createInterface()
. ترفق كل نسخة مع مجرى الدخل input
الوحيد القابل للقراءة ومجرى الخرج output
الوحيد القابل للكتابة. يُستخدم المجرى output
لطباعة الأوامر التي يدخلها المستخدم والتي تصل وتُقرأ من مجرى input
.
الحدث: 'close'
أُضيف في الإصدار: 0.1.98.
يُطلق الحدث 'close'
عندما يحدث واحد مما يلي:
- يُستدعى التابع
rl.close()
وقد تخلّت نسخةreadline.Interface
عن التحكم بمجريي الدخلinput
والخرجoutput
. - يستقبل المجرى
input
الحدث'end'
الخاص به. - يستقبل مجرى الدخل
input
الإشارة EOT (نهاية الإرسال [end-of-transmission]) عبر ضغط المستخدم على المفتاحين <ctrl>-D
. - يستقبل مجرى الدخل
input
الإشارةSIGINT
عبر ضغط المستخدم على المفتاحينctrl>-C>
ولا يوجد مستمع للحدث'SIGINT'
مُسجَّل على نسخةreadline.Interface
.
تُستدعَى الدالة المستمعة (listener) دون تمرير أي وسائط.
تُنهى النسخة readline.Interface
حالما يُطلق الحدث 'close'
.
الحدث 'line'
أُضيف في الإصدار:0.1.98.
يُطلق الحدث 'line'
كلّما استقبل المجرى input
محرف نهاية السطر (المحرف n\
أو r\
أو \r\n
). هذا يحدث عادةً عندما يضغط المستخدم المفاتيح <Enter>
أو <Return>
.
تُستدعى الدالة المستمعة مع سلسلة نصية متضمنةً سطرًا وحيدًا من الدخل المُستقبل.
rl.on('line', (input) => {
console.log(`Received: ${input}`);
});
الحدث 'pause'
أُضيف في الإصدار: 0.7.5.
يُطلق الحدث 'pause'
عندما يحدث واحد مما يلي:
- يُوقف المجرى
input
مؤقتًا. - لم يُوقف المجرى
input
ولكنه استقبل الحدث'SIGCONT'
. (انظر الحدثين 'SIGTSTP' و 'SIGCONT'.)
تُستدعى الدالة المستمعة دون تمرير أي وسائط.
rl.on('pause', () => {
console.log('Readline paused.');
});
الحدث 'resume'
أضيف في الإصدار: 0.7.5.
يُطلق الحدث 'resume'
عندما يُستأنَف المجرى input
.
تُستدعى الدالة المستمعة دون تمرير أي وسائط.
rl.on('resume', () => {
console.log('Readline resumed.');
});
الحدث 'SIGCONT'
أضيف في الإصدار: 0.7.5.
يُطلق الحدث 'SIGCONT'
عندما تكون عملية Node.js قد انتقلت مسبقًا إلى الخلفية باستخدام المفتاحين <ctrl>-Z
(أي عبر استلام الإشارة SIGTSTP
) ثمَّ أعيدت إلى المقدمة باستخدام الدالة fg(1p).
إذا كان مجرى الدخل input
متوقف مؤقتًا قبل استلام الإشارة SIGTSTP، فلن يُطلق هذا الحدث.
تُستدعى الدالة المستمعة دون تمرير أي وسائط.
rl.on('SIGCONT', () => {
// المجرى تلقائيًا`prompt` سوف تستأنف
rl.prompt();
});
الحدث 'SIGCONT'
ليس مدعومًا على أنظمة ويندوز.
الحدث 'SIGINT'
أضيف في الإصدار: 0.3.0.
يُطلق الحدث 'SIGINT'
عندما يستلم المجرى input
الإشارة SIGINT
عبر الضغط على المفتاحين <ctrl>-C
. إذا لم يوجد هناك أي مستمع مسجل للحدث 'SIGINT' عندما يتلقى المجرى input الإشارة SIGINT، فسيُطلق الحدث 'pause'
.
تُستدعى دالة المنصت دون تمرير أي وسائط.
rl.on('SIGINT', () => {
rl.question('Are you sure you want to exit? ', (answer) => {
if (answer.match(/^y(es)?$/i)) rl.pause();
});
});
الحدث 'SIGTSTP'
أُضيف في الإصدار: 0.7.5.
يُطلق الحدث 'SIGTSTP'
عندما يتلقى المجرى input
الإشارة SIGTSTP
عبر ضغط المفتاحين <ctrl>-Z
. إذا لم يوجد هناك أي مستمع مسجل للحدث 'SIGTSTP'
عندما يتلقى المجرى input
الإشارة SIGTSTP
، فستُرسل عملية Node.js إلى الخلفية.
عندما يُستأنَف البرنامج باستخدام الدالة fg(1p)، سيُطلق الحدثان 'pause'
و 'SIGCONT'
. يمكن استخدام ذلك لاستئناف المجرى input
.
لن يُطلَق الحدثان 'pause'
و'SIGCONT'
إذا أُوقِف المجرى input
قبل أن تُرسَل العملية إلى الخلفية.
تُستدعَى الدالة المستمعة دون تمرير أي وسائط.
rl.on('SIGTSTP', () => {
// ويمنع البرنامج من الذهاب إلى الخلفية SIGTSTP هذا سيتجاهل الإشارة
console.log('Caught SIGTSTP.');
});
الحدث 'SIGTSTP'
ليس مدعومًا على نظام ويندوز.
rl.close()
أضيف في الإصدار: 0.1.98.
يغلق التابع rl.close()
النسخة readline.Interface
ويتخلى عن التحكم بمجريي الدخل input
و الخرج output
. عندما استدعائه، سيُطلَق الحدث 'close'
.
لن يوقف استدعاء التابع rl.close()
إطلاق بقية الأحداث (بما فيها الحدث 'line'
) مباشرةً من قِبَل النسخة readline.Interface
.
rl.pause()
أضيف في الإصدار: 0.3.4.
يوقف التابع rl.pause()
المجرى input مؤقتًا، سامحًا له بالاستئناف لاحقًا عند الحاجة.
لن يوقف استدعاء rl.pause()
إطلاق بقية الأحداث (بما فيها الحدث 'line'
) مباشرةً من قِبَل النسخة readline.Interface
.
rl.prompt([preserveCursor])
أضيف في الإصدار: 0.1.98.
preserveCursor
: <boolean> قيمة منطقية إن كانتtrue
، فستمنع المؤشر من إعادة تعيين موضعه إلى0
(بداية المجرى).
يكتب التابع rl.prompt()
النُسخ readline.Interface
التي ضُبِط فيها المحث prompt
إلى سطر جديد في المجرى output
من أجل تزويد المستخدم بموقع جديد ليدخل البيانات فيه.
عند استدعاء التابع rl.prompt()
، سيستأنف المجرى input
إذا كان قد أُوقف مؤقتًا.
إذا أُنشئت النسخة readline.Interface
مع ضبط المجرى output
إلى القيمة null
أو undefined
، فلن يُكتَب على المحث (prompt).
rl.question(query, callback)
أضيف في الإصدار: 0.3.3.
query
: <string> عبارة أو استعلام يرا كتابتها على المجرى output، مضافةً إلى بداية المِحَث.callback
: <Function> دالة رد نداء التي يراد استدعاؤها مع مدخلات المستخدم عند الاستجابة إلى الاستعلامquery
.
يعرض التابع rl.question()
قيمة الاستعلام query
عن طريق كتابته على المجرى output
، بعد أن ينتظر مدخلات المستخدم ليكتبها على المجرى input
. بعد ذلك، يستدعي التابع دالة رد النداء callback
مُمرّرًا المدخلات المستلمة من الستخدم إليها كأول وسيط.
عند استدعائه، سوف يستأنف rl.question()
المجرى input
إذا كان قد أُوقف مؤقتًا.
ذا أُنشئت النسخة readline.Interface
مع ضبط المجرى output
إلى القيمة null
أو undefined
، فلن يُكتَب الاستعلام query
.
اطلع على المثال التالي الذي يشرح ما سبق:
rl.question('What is your favorite food? ', (answer) => {
console.log(`Oh, so your favorite food is ${answer}`);
});
لا تتبع دالة رد النداء callback
المُمررة إلى التابع rl.question()
النموذج القياسي لقبول الكائن Error
أو null
كأول وسيط لها، إذ تُستدعَى دالة callback
مع تمرير الجواب الذي استُلِم من المستخدم كأول وسيط لها.
rl.resume()
أضيف في الإصدار: 0.3.4.
يستأنف التابع rl.resume()
المجرى input
إذا أُوقِف مؤقتًا.
rl.setPrompt(prompt)
أضيف في الإصدار: 0.1.98.
Prompt
: <string>
سوف يضبط التابع rl.setPrompt()
المِحَث الذي سيكتب على المجرى output
كلما استدعي التابع rl.prompt()
.
rl.write(data[, key])
أضيف في الإصدار: 0.1.98.
سيكتب التابع rl.write()
إمّا قيمة المعامل data
أو تسلسل المفتاح المعرّف من قبل المعامل key
إلى المجرى output
. الوسيط key
مدعومٌ إذا كانت output
هي TTY طرفية كتابة فقط.
إذا كان المعامل key
مُحددًا، فسيُتجاهَل المعامل data
.
عند استدعاء rl.write()
، سيستأنف المجرى input
إذا كان قد أُوقف مؤقتًا.
إذا أُنشئت النسخة readline.Interface
مع ضبط المجرى output
إلى القيمة null
أو undefined
، فلن تُكتَب قيمة المعامل data
أو المعامل key
.
rl.write('Delete this!');
// لحذف السطر المكتوب سابقًا Ctrl+u محاكي ضغط المفتاحين
rl.write(null, { ctrl: true, name: 'u' });
سوف يكتب التابع rl.write()
البيانات إلى المجرى input
كما أعطيت من قبل المستخدم تمامًا.
readline.clearLine(stream, dir)
أُضيف في الإصدار: 0.7.7.
stream
: [/kjjhhhhgNode.js/stream <stream.Writable>]dir
: <number>1-
: على يسار المؤشر1
: على يمين المؤشر0
: كل السطر
يمسح التابع readline.clearLine()
السطر الحالي من المجرى TTY المُعطى انطلاقًا من مؤضع المؤشر الحالي وباتجاهٍ محدَّدٍ مُعرّف عبر المعامل dir.
readline.clearScreenDown(stream)
أُضيف في الإصدار: 0.7.7.
stream
: [/kjjhhhhgNode.js/stream <stream.Writable>]
يمسح التابع readline.clearScreenDown()
مجرى TTY المعُطى من موقع المؤشر الحالي وبالاتجاه الأسفل.
readline.createInterface(options)
سجل التغييرات
الإصدار | التغييرات |
---|---|
8.3.0, 6.11.4 | إزالة الحدود الأعظمية للخيار crlfDelay .
|
6.6.0 | أصبح الخيار crlfDelay مدعومًا الآن.
|
6.3.0 | أصبح الخيار prompt مدعومًا الآن.
|
6.0.0 | يمكن الآن أن يأخذ الخيار historySize القيمة 0 .
|
0.1.98 | أُضيف هذا التابع. |
options
: <Object>input
: <stream.Readable> المجرى القابل للقراءة المراد الاستماع إليه. هذا الخيار مطلوب.output
: <stream.Writable> المجرى القابل للكتابة لكتابة بيانات سطرية فيه.completer
: <Function> دالة اختيارية تستخدم للإكمال التلقائي عبر الضغط على المفتاح Tap.terminal
: <boolean> قيمة منطقية تكونtrue
إذا كان ينبغي معاملة المجريينoutput
وinput
كأنهما TTY وأن يمتلكا شيفرات الهروب ANSI/VT100 مكتوبة له. القيمة الإفتراضية تكون بناءً على التحقق منisTTY
على المجرىoutput
.historySize
: <number> العدد الأعظمي لأسطر التاريخ المحفوظة. لتعطيل التاريخ، اضبط قيمة هذا الخيار إلى0
. هذا الخيار له معنى فقط إذا كان الخيارterminal
مضبوطًا إلى القيمةtrue
من قبل المستخدم أو من قبل فحص المجرىoutput
الداخلي. فيما عدا ذلك، لن تُهيأ آلية تخزين التاريخ مطلقًا. القيمة الإفتراضية:30
.prompt
: <string> السلسلة النصية المراد استعمالها مع المِحَث. القيمة الإفتراضية:'> '
.crlfDelay
: <number> إذا تجاوز التأخير بين المحرف \r
والمحرف \n
القيمةcrlfDelay
المعطاة بالميلي ثانية، فسيعاملان كمحرفي نهاية سطر منفصلين. لا يجب أن تقل قيمة الخيارcrlfDelay
عن100
وستستعمل هذه القيمة إن كانت القيمة المعطاة أقل منها. يمكن أن يُضبَط الخيار إلى القيمة Infinity (قيمة لا نهائية)؛ في هذه الحالة، سيُعدُّ المحرفr\
عندما يُتبَع بالمحرف\n
سطرًا جديدًا مفردًا دائمًا (هذا قد يكون منطقيًا من أجل قراءة الملفات مع الفاصل السطري\r\n
). القيمة الإفتراضية:100
.removeHistoryDuplicates
: <boolean> قيمة منطقية إذا كانتtrue
، فسيُزال سطر التأريخ القديم من القائمة عندما يضاف سطرٌ جديدٌ مماثل له (أي عند تكراره). القيمة الإفتراضية:false
.
ينشئ التابع readline.createInterface()
نسخةً جديدةً من الصنف readline.Interface
.
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
حالما تُنشأ النسخة readline.Interface
، تكون الحالة الأكثر شيوعًا هي الاستماع إلى الحدث 'line'
:
rl.on('line', (line) => {
console.log(`Received: ${line}`);
});
إذا كانت قيمة الخيار terminal
هي true
من أجل هذه النسخة، سيحصل المجرى output
على أفضل توافق إذا/أو عند تغير الأعمدة إذا عُرِّفت الخاصية output.columns
وأطلق الحدث 'resize'
على المجرى output
(يفعل المجرى process.stdout ذلك تلقائيًا عندما يكون TTY).
استخدام دالة `completer`
تأخذ الدالة completer
السطر الحالي المُدخَل من قبل المستخدم كوسيط، وتعيد المصفوفة Array مع مدخلتين:
مصفوفة Array
مع مدخلات مطابقة للإكمال، و
السلاسل النصية الفرعية التي استخدمت للمطابقة.
على سبيل المثال: [[substr1, substr2, ...], originalsubstring]
.
function completer(line) {
const completions = '.help .error .exit .quit .q'.split(' ');
const hits = completions.filter((c) => c.startsWith(line));
// تعرض كل احتمالات الإكمال إذا وجدت
return [hits.length ? hits : completions, line];
}
يمكن أن تُستدعَى الدالة completer
بشكل غير متزامن إذا قبلت وسيطين مثل:
function completer(linePartial, callback) {
callback(null, [['123'], linePartial]);
}
readline.cursorTo(stream, x, y)
أُضيف في الإصدار: 0.7.7.
stream
: <stream.Writable>x
: <number>y
: <number>
ينقل التابع readline.cursorTo()
المؤشر إلى موضع محدد في المجرى stream
المعطى الذي من النوع TTY.
readline.emitKeypressEvents(stream[, interface])
أُضيف في الإصدار: 0.7.7.
stream
: <stream.Readable>interface
: <readline.Interface>
يسبب التابع readline.emitKeypressEvents()
ببدء المجرى القابل للقراءة إطلاق الأحداث 'keypress'
بما يتوافق مع المدخلات المُستقبلَة.
اختياريًّا، يحدِّد المعامل interface
النسخة readline.Interface
التي سيُعطَل الإكمال التلقائي فيها عندما تكتشف عملية نسخٍ ولصقٍ للمدخلات.
إذا كان المجرى stream
من النوع TTY، فيجب حينئذٍ أن تكون في الوضع الخام (raw mode).
يُستدعى هذا التابع تلقائيًا من قبل أية نسخة من النوع readline
على المجرى input
الخاص بها إذا كان المجرى input
هو طرفية. لن يوقف إغلاق النسخة readline
المجرى input
من إطلاق الأحداث 'keypress'
.
readline.emitKeypressEvents(process.stdin);
if (process.stdin.isTTY)
process.stdin.setRawMode(true);
readline.moveCursor(stream, dx, dy)
أُضيف في الإصدار: 0.7.7.
stream
: <stream.Writable>dx
: <number>dy
: <number>
ينقل التابع readline.moveCursor()
المؤشر نسبةً إلى موقعه الحالي في المجرى stream
المعطى الذي من النوع TTY.
أمثلة
واجهة سطر أوامر صغيرة (Tiny CLI)
يوضّح المثال التالي كيفية استخدام الصنف readline.Interface
لإنشاء واجهة سطر أوامر صغيرة:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
prompt: 'OHAI> '
});
rl.prompt();
rl.on('line', (line) => {
switch (line.trim()) {
case 'hello':
console.log('world!');
break;
default:
console.log(`Say what? I might have heard '${line.trim()}'`);
break;
}
rl.prompt();
}).on('close', () => {
console.log('Have a great day!');
process.exit(0);
});
قراءة مجرى ملف سطرًا بسطر
الاستخدام الشائع للنسخة readline
هو قراءة الدخل من مجرًى قابلٍ للقراءة لنظام الملفات سطرًا واحدًا في كل مرة:
const readline = require('readline');
const fs = require('fs');
const rl = readline.createInterface({
input: fs.createReadStream('sample.txt'),
crlfDelay: Infinity
});
rl.on('line', (line) => {
console.log(`Line from file: ${line}`);
});
مصادر