الفرق بين المراجعتين ل"Node.js/readline"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
ط (تعديل عنوان الصفحة)
ط (تنسيق 2)
سطر 2: سطر 2:
  
 
الاستقرار 2: مستقر
 
الاستقرار 2: مستقر
توفّر الوحدة readline واجهةً برمجيةً لقراءة سطر واحد من البيانات من المجرى القابل للقراءة (Readable) (مثل process.stdin) كل مرَّة على حدة. يمكن الوصول إليها باستخدام الأمر التالي:<syntaxhighlight lang="javascript">
+
 
 +
توفّر الوحدة <code>readline</code> واجهةً برمجيةً لقراءة سطر واحد من البيانات من المجرى القابل للقراءة (Readable) (مثل 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');
  
سطر 22: سطر 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>-D‎.
+
*يستقبل مجرى الدخل <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">
سطر 51: سطر 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>. (انظر الحدثين 'SIGTSTP' و 'SIGCONT'.)
 
تُستدعى الدالة المستمعة دون تمرير أي وسائط.<syntaxhighlight lang="javascript">
 
تُستدعى الدالة المستمعة دون تمرير أي وسائط.<syntaxhighlight lang="javascript">
 
rl.on('pause', () => {
 
rl.on('pause', () => {
سطر 64: سطر 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">
سطر 75: سطر 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>) ثمَّ أعيدت إلى المقدمة باستخدام الدالة fg(1p‎)‎.
  
إذا كان مجرى الدخل input متوقف مؤقتًا قبل استلام الإشارة SIGTSTP، فلن يُطلق هذا الحدث.
+
إذا كان مجرى الدخل <code>input</code> متوقف مؤقتًا قبل استلام الإشارة SIGTSTP، فلن يُطلق هذا الحدث.
  
 
تُستدعى الدالة المستمعة دون تمرير أي وسائط.<syntaxhighlight lang="javascript">
 
تُستدعى الدالة المستمعة دون تمرير أي وسائط.<syntaxhighlight lang="javascript">
سطر 92: سطر 87:
 
});
 
});
  
</syntaxhighlight>الحدث 'SIGCONT' ليس مدعومًا على أنظمة ويندوز.
+
</syntaxhighlight>الحدث <code>'SIGCONT'</code> ليس مدعومًا على أنظمة ويندوز.
 
+
==الحدث 'SIGINT'==
== الحدث 'SIGINT' ==
 
 
أضيف في الإصدار: 0.3.0.
 
أضيف في الإصدار: 0.3.0.
  
يُطلق الحدث 'SIGINT' عندما يستلم المجرى input الإشارة SIGINT عبر الضغط على المفتاحين ‎<ctrl>-C‎. إذا لم يوجد هناك أي مستمع مسجل للحدث 'SIGINT' عندما يتلقى المجرى input الإشارة SIGINT، فسيُطلق الحدث 'pause'.
+
يُطلق الحدث <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">
سطر 107: سطر 101:
  
 
</syntaxhighlight>
 
</syntaxhighlight>
 
+
==الحدث 'SIGTSTP'==
== الحدث 'SIGTSTP' ==
 
 
أُضيف في الإصدار: 0.7.5.
 
أُضيف في الإصدار: 0.7.5.
  
يُطلق الحدث 'SIGTSTP' عندما يتلقى المجرى input الإشارة SIGTSTP عبر ضغط المفتاحين ‎<ctrl>-Z‎‎. إذا لم يوجد هناك أي مستمع مسجل للحدث 'SIGTSTP' عندما يتلقى المجرى input الإشارة SIGTSTP، فستُرسل عملية Node.js إلى الخلفية.
+
يُطلق الحدث <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">
سطر 125: سطر 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.
 
  
== rl.pause‎()‎ ==
+
لن يوقف استدعاء التابع <code>rl.close‎()</code>‎ إطلاق بقية الأحداث (بما فيها الحدث <code>'line'</code>) مباشرةً  من قِبَل النسخة <code>readline.Interface</code>.
 +
==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> قيمة منطقية إن كانت true، فستمنع المؤشر من إعادة تعيين موضعه إلى 0 (بداية المجرى).
+
*<code>preserveCursor</code>:‏ <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 إذا كان قد أُوقف مؤقتًا.
 
  
إذا أُنشئت النسخة readline.Interface مع ضبط المجرى output إلى القيمة null أو undefined، فلن يُكتَب على المحث (prompt).
+
عند استدعاء التابع <code>rl.prompt‎()</code>‎، سيستأنف المجرى <code>input</code> إذا كان قد أُوقف مؤقتًا.
  
== rl.question(query, callback‎)‎ ==
+
إذا أُنشئت النسخة <code>readline.Interface</code> مع ضبط المجرى <code>output</code> إلى القيمة <code>null</code> أو <code>undefined</code>، فلن يُكتَب على المحث (prompt).
 +
==rl.question(query, callback‎)‎==
 
أضيف في الإصدار: 0.3.3.
 
أضيف في الإصدار: 0.3.3.
* Query:‏ <string> عبارة أو استعلام يرا كتابتها على المجرى output، مضافةً إلى بداية المِحَث.
+
*<code>query</code>:‏ <string> عبارة أو استعلام يرا كتابتها على المجرى output، مضافةً إلى بداية المِحَث.
* Callback:‏ <Function> دالة رد نداء التي يراد استدعاؤها مع مدخلات المستخدم عند الاستجابة إلى الاستعلام query.
+
*<code>callback</code>:‏ <Function> دالة رد نداء التي يراد استدعاؤها مع مدخلات المستخدم عند الاستجابة إلى الاستعلام <code>query</code>.
يعرض التابع rl.question()‎ قيمة الاستعلام query عن طريق كتابته على المجرى output، بعد أن ينتظر مدخلات المستخدم ليكتبها على المجرى input. بعد ذلك، يستدعي التابع دالة رد النداء مُمرّرًا المدخلات المستلمة من الستخدم إليها كأول وسيط.
+
يعرض التابع <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 أو undefined، فلن يُكتَب الاستعلام query.
+
ذا أُنشئت النسخة <code>readline.Interface</code> مع ضبط المجرى <code>output</code> إلى القيمة <code>null</code> أو <code>undefined</code>، فلن يُكتَب الاستعلام <code>query</code>.
  
 
اطلع على المثال التالي الذي يشرح ما سبق:<syntaxhighlight lang="javascript">
 
اطلع على المثال التالي الذي يشرح ما سبق:<syntaxhighlight lang="javascript">
سطر 165: سطر 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>:‏ <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>:‏ <string>
* key:‏ <Object>
+
*<code>key</code>:‏ <Object>
** Ctrl:‏ <boolean> قيمة منطقية إن كانت true فستشير إلى المفتاح ‎<ctrl>‎‎.
+
**<code>Ctrl</code>:‏ <boolean> قيمة منطقية إن كانت true فستشير إلى المفتاح ‎<code><ctrl>‎‎</code>.
** Meta:‏ <boolean> قيمة منطقية إن كانت true فستشير إلى المفتاح <Meta>.
+
**<code>Meta</code>:‏ <boolean> قيمة منطقية إن كانت true فستشير إلى المفتاح <code><Meta></code>.
** Shift:‏ <boolean> قيمة منطقية إن كانت true فستشير إلى المفتاح ‎<Shift>‎‎‎.
+
**<code>Shift</code>:‏ <boolean> قيمة منطقية إن كانت true فستشير إلى المفتاح ‎<code><Shift></code>‎‎‎.
** Name:‏ <string> سلسلة نصية تمثِّل اسم المفتاح.
+
**<code>Name</code>:‏ <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> هي TTY طرفية كتابة فقط.
  
إذا كان المعامل key مُحددًا، فسيُتجاهَل المعامل data.
+
إذا كان المعامل <code>key</code> مُحددًا، فسيُتجاهَل المعامل <code>data</code>.
  
عند استدعاء ‎rl.write()‎، سيستأنف المجرى input إذا كان قد أُوقف مؤقتًا.
+
عند استدعاء ‎<code>rl.write()</code>‎، سيستأنف المجرى <code>input</code> إذا كان قد أُوقف مؤقتًا.
  
إذا أُنشئت النسخة readline.Interface مع ضبط المجرى output إلى القيمة null أو undefined، فلن تُكتَب قيمة المعامل data أو المعامل key.<syntaxhighlight lang="javascript">
+
إذا أُنشئت النسخة <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)‎=
= readline.clearLine(stream, dir)‎ =
 
 
أُضيف في الإصدار: 0.7.7.
 
أُضيف في الإصدار: 0.7.7.
* stream:‏ <stream.Writable>
+
*<code>stream</code>:‏ <stream.Writable>
* dir:‏ <number>
+
*<code>dir</code>:‏ <number>
** 1-: على يسار المؤشر
+
**<code>1-</code>: على يسار المؤشر
** 1: على يمين المؤشر
+
**<code>1</code>: على يمين المؤشر
** 0: كل السطر
+
**<code>0</code>: كل السطر
يمسح التابع readline.clearLine()‎ السطر الحالي من المجرى TTY المُعطى انطلاقًا من مؤضع المؤشر الحالي وباتجاهٍ محدَّدٍ مُعرّف عبر المعامل dir.
+
يمسح التابع <code>readline.clearLine()</code>‎ السطر الحالي من المجرى TTY المُعطى انطلاقًا من مؤضع المؤشر الحالي وباتجاهٍ محدَّدٍ مُعرّف عبر المعامل dir.
 
+
=readline.clearScreenDown(stream)‎=
= readline.clearScreenDown(stream)‎ =
 
 
أُضيف في الإصدار: 0.7.7.
 
أُضيف في الإصدار: 0.7.7.
* stream:‏ <stream.Writable>
+
*<code>stream</code>:‏ <stream.Writable>
يمسح التابع readline.clearScreenDown()‎ مجرى TTY المعُطى من موقع المؤشر الحالي وبالاتجاه الأسفل.
+
يمسح التابع <code>readline.clearScreenDown()</code>‎ مجرى TTY المعُطى من موقع المؤشر الحالي وبالاتجاه الأسفل.
 
+
=readline.createInterface(options)‎=
= readline.createInterface(options)‎ =
 
 
سجل التغييرات
 
سجل التغييرات
 
{| class="wikitable"
 
{| class="wikitable"
سطر 219: سطر 202:
 
|-
 
|-
 
|<span>8.3.0, 6.11.4</span>
 
|<span>8.3.0, 6.11.4</span>
|<span>إزالة الحدود الأعظمية للخيار crlfDelay.</span>
+
|<span>إزالة الحدود الأعظمية للخيار <code>crlfDelay</code>.</span>
 
|-
 
|-
 
|<span>6.6.0</span>
 
|<span>6.6.0</span>
|<span>أصبح الخيار crlfDelay مدعومًا الآن.</span>
+
|<span>أصبح الخيار <code>crlfDelay</code> مدعومًا الآن.</span>
 
|-
 
|-
 
|<span>6.3.0</span>
 
|<span>6.3.0</span>
سطر 228: سطر 211:
 
|-
 
|-
 
|<span>6.0.0</span>
 
|<span>6.0.0</span>
|<span>يمكن الآن أن يأخذ الخيار historySize القيمة 0.</span>
+
|يمكن الآن أن يأخذ الخيار <code>historySize</code> القيمة <code>0</code>.
 
|-
 
|-
 
|<span>0.1.98</span>
 
|<span>0.1.98</span>
 
|<span>أُضيف هذا التابع.</span>
 
|<span>أُضيف هذا التابع.</span>
 
|}
 
|}
* <span>options:‏ <Object></span>
+
*<span><code>options</code>:‏ <Object></span>
** <span>input:‏ <stream.Readable> المجرى القابل للقراءة المراد الاستماع إليه. هذا الخيار مطلوب.</span>
+
**<span><code>input</code>:‏ <stream.Readable> المجرى القابل للقراءة المراد الاستماع إليه. هذا الخيار مطلوب.</span>
** <span>output:‏ <stream.Writable> المجرى القابل للكتابة لكتابة بيانات سطرية فيه.</span>
+
**<span><code>output</code>:‏ <stream.Writable> المجرى القابل للكتابة لكتابة بيانات سطرية فيه.</span>
** <span>completer:‏ <Function> دالة اختيارية تستخدم للإكمال التلقائي عبر الضغط على المفتاح Tap.</span>
+
**<span><code>completer</code>:‏ <Function> دالة اختيارية تستخدم للإكمال التلقائي عبر الضغط على المفتاح Tap.</span>
** <span>terminal:‏ <boolean> قيمة منطقية تكون true إذا كان ينبغي معاملة المجريين output و input كأنهما TTY وأن يمتلكا شيفرات الهروب ANSI/VT100  مكتوبة له. القيمة الإفتراضية تكون بناءً على التحقق من isTTY على المجرى output.</span>
+
**<span><code>terminal</code>:‏ <boolean> قيمة منطقية تكون <code>true</code> إذا كان ينبغي معاملة المجريين <code>output</code> و <code>input</code> كأنهما TTY وأن يمتلكا شيفرات الهروب ANSI/VT100  مكتوبة له. القيمة الإفتراضية تكون بناءً على التحقق من <code>isTTY</code> على المجرى <code>output</code>.</span>
** <span>historySize:‏ <number> العدد الأعظمي لأسطر التاريخ المحفوظة. لتعطيل التاريخ، اضبط قيمة هذا الخيار إلى 0. هذا الخيار له معنى فقط إذا كان الخيار terminal مضبوطًا إلى القيمة true من قبل المستخدم أو من قبل فحص المجرى output الداخلي. فيما عدا ذلك، لن تُهيأ آلية تخزين التاريخ مطلقًا. القيمة الإفتراضية: 30.</span>
+
**<span><code>historySize</code>:‏ <number> العدد الأعظمي لأسطر التاريخ المحفوظة. لتعطيل التاريخ، اضبط قيمة هذا الخيار إلى <code>0</code>. هذا الخيار له معنى فقط إذا كان الخيار <code>terminal</code> مضبوطًا إلى القيمة <code>true</code> من قبل المستخدم أو من قبل فحص المجرى <code>output</code> الداخلي. فيما عدا ذلك، لن تُهيأ آلية تخزين التاريخ مطلقًا. القيمة الإفتراضية: <code>30</code>.</span>
** <span>prompt:‏ <string> السلسلة النصية المراد استعمالها مع المِحَث. القيمة الإفتراضية هي:‎'‎>‎ ‎'‎.</span>
+
**<span><code>prompt</code>:‏ <string> السلسلة النصية المراد استعمالها مع المِحَث. القيمة الإفتراضية هي:<code>‎'‎>‎ ‎'‎</code>.</span>
** <span>crlfDelay:‏ <number>  إذا تجاوز التأخير بين المحرف ‎\r‎ والمحرف ‎\n‎ القيمة crlfDelay المعطاة بالميلي ثانية، فسيعاملان كمحرفي نهاية سطر منفصلين. لا يجب أن تقل قيمة الخيار crlfDelay عن 100 وستستعمل هذه القيمة إن كانت القيمة المعطاة أقل منها. يمكن أن يُضبَط الخيار إلى القيمة Infinity (قيمة لا نهائية)؛ في هذه الحالة، سيُعدُّ المحرف r\ عندما يُتبَع بالمحرف ‎\n‎ سطرًا جديدًا مفردًا دائمًا (هذا قد يكون منطقيًا من أجل قراءة الملفات مع الفاصل السطري ‎\‎r\‎n‎). القيمة الإفتراضية هي: 100.</span>
+
**<span><code>crlfDelay</code>:‏ <number>  إذا تجاوز التأخير بين المحرف ‎<code>\r</code>‎ والمحرف ‎<code>\n‎</code> القيمة <code>crlfDelay</code> المعطاة بالميلي ثانية، فسيعاملان كمحرفي نهاية سطر منفصلين. لا يجب أن تقل قيمة الخيار <code>crlfDelay</code> عن <code>100</code> وستستعمل هذه القيمة إن كانت القيمة المعطاة أقل منها. يمكن أن يُضبَط الخيار إلى القيمة Infinity (قيمة لا نهائية)؛ في هذه الحالة، سيُعدُّ المحرف <code>r\</code> عندما يُتبَع بالمحرف <code>‎\n</code>‎ سطرًا جديدًا مفردًا دائمًا (هذا قد يكون منطقيًا من أجل قراءة الملفات مع الفاصل السطري <code>‎\‎r\‎n</code>‎). القيمة الإفتراضية هي: <code>100</code>.</span>
** <span>removeHistoryDuplicates:‏ <boolean> قيمة منطقية إذا كانت true، فسيُزال سطر التأريخ القديم من القائمة عندما يضاف سطرٌ جديدٌ مماثل له (أي عند تكراره). القيمة الإفتراضية: false.</span>
+
**<span><code>removeHistoryDuplicates</code>:‏ <boolean> قيمة منطقية إذا كانت <code>true</code>، فسيُزال سطر التأريخ القديم من القائمة عندما يضاف سطرٌ جديدٌ مماثل له (أي عند تكراره). القيمة الإفتراضية: <code>false</code>.</span>
<span>ينشئ التابع readline.createInterface()‎ نسخةً جديدةً من الصنف readline.Interface.</span><syntaxhighlight lang="javascript">
+
<span>ينشئ التابع <code>readline.createInterface()</code>‎ نسخةً جديدةً من الصنف <code>readline.Interface</code>.</span><syntaxhighlight lang="javascript">
 
const readline = require('readline');
 
const readline = require('readline');
 
const rl = readline.createInterface({
 
const rl = readline.createInterface({
سطر 248: سطر 231:
 
   output: process.stdout
 
   output: process.stdout
 
});
 
});
</syntaxhighlight><span>حالما تُنشأ النسخة readline.Interface، تكون الحالة الأكثر شيوعًا هي الاستماع إلى الحدث 'line':</span><syntaxhighlight lang="javascript">
+
</syntaxhighlight><span>حالما تُنشأ النسخة <code>readline.Interface</code>، تكون الحالة الأكثر شيوعًا هي الاستماع إلى الحدث <code>'line'</code>:</span><syntaxhighlight lang="javascript">
 
rl.on('line', (line) => {
 
rl.on('line', (line) => {
 
   console.log(`Received: ${line}`);
 
   console.log(`Received: ${line}`);
 
});
 
});
</syntaxhighlight><span>إذا كانت قيمة الخيار terminal هي true من أجل هذه النسخة، سيحصل المجرى output على أفضل توافق  إذا/أو عند تغير الأعمدة إذا عُرِّفت الخاصية output.columns وأطلق الحدث 'resize' على المجرى output (يفعل المجرى process.stdout ذلك تلقائيًا عندما يكون TTY).</span>
+
</syntaxhighlight><span>إذا كانت قيمة الخيار <code>terminal</code> هي <code>true</code> من أجل هذه النسخة، سيحصل المجرى <code>output</code> على أفضل توافق  إذا/أو عند تغير الأعمدة إذا عُرِّفت الخاصية <code>output.columns</code> وأطلق الحدث <code>'resize'</code> على المجرى <code>output</code> (يفعل المجرى process.stdout ذلك تلقائيًا عندما يكون TTY).</span>
  
 
<span>استخدام دالة `completer`</span>
 
<span>استخدام دالة `completer`</span>
  
<span>تأخذ الدالة completer السطر الحالي المُدخَل من قبل المستخدم كوسيط، وتعيد المصفوفة Array مع مدخلتين:</span>
+
<span>تأخذ الدالة <code>completer</code> السطر الحالي المُدخَل من قبل المستخدم كوسيط، وتعيد المصفوفة Array مع مدخلتين:</span>
  
<span>مصفوفة Array مع مدخلات مطابقة للإكمال، و</span>
+
<span>مصفوفة <code>Array</code> مع مدخلات مطابقة للإكمال، و</span>
  
 
<span>السلاسل النصية الفرعية التي استخدمت للمطابقة.</span>
 
<span>السلاسل النصية الفرعية التي استخدمت للمطابقة.</span>
  
<span>على سبيل المثال: [[substr1, substr2, ...], originalsubstring].</span><syntaxhighlight lang="javascript">
+
<span>على سبيل المثال: <code>[[substr1, substr2, ...], originalsubstring]</code>.</span><syntaxhighlight lang="javascript">
 
function completer(line) {
 
function completer(line) {
 
   const completions = '.help .error .exit .quit .q'.split(' ');
 
   const completions = '.help .error .exit .quit .q'.split(' ');
سطر 269: سطر 252:
 
   return [hits.length ? hits : completions, line];
 
   return [hits.length ? hits : completions, line];
 
}
 
}
</syntaxhighlight><span>يمكن أن تُستدعَى الدالة completer بشكل غير متزامن إذا قبلت وسيطين مثل:</span><syntaxhighlight lang="javascript">
+
</syntaxhighlight><span>يمكن أن تُستدعَى الدالة <code>completer</code> بشكل غير متزامن إذا قبلت وسيطين مثل:</span><syntaxhighlight lang="javascript">
 
function completer(linePartial, callback) {
 
function completer(linePartial, callback) {
 
   callback(null, [['123'], linePartial]);
 
   callback(null, [['123'], linePartial]);
سطر 275: سطر 258:
  
 
</syntaxhighlight>
 
</syntaxhighlight>
 
+
=<span>readline.cursorTo(stream, x, y)‎</span>=
= <span>readline.cursorTo(stream, x, y)‎</span> =
 
 
<span>أُضيف في الإصدار: 0.7.7.</span>
 
<span>أُضيف في الإصدار: 0.7.7.</span>
* <span>stream:‏ <stream.Writable></span>
+
*<span>stream:‏ <stream.Writable></span>
* <span>x:‏ <number></span>
+
*<span>x:‏ <number></span>
* <span>y:‏ <number></span>
+
*<span>y:‏ <number></span>
 
<span>ينقل التابع readline.cursorTo()‎ المؤشر إلى موضع محدد في المجرى stream المعطى الذي من النوع TTY.</span>
 
<span>ينقل التابع readline.cursorTo()‎ المؤشر إلى موضع محدد في المجرى stream المعطى الذي من النوع TTY.</span>
 
+
=<span>readline.emitKeypressEvents(stream[, interface]‎)‎</span>=
= <span>readline.emitKeypressEvents(stream[, interface]‎)‎</span> =
 
 
<span>أُضيف في الإصدار: 0.7.7.</span>
 
<span>أُضيف في الإصدار: 0.7.7.</span>
* <span>stream:‏ <stream.Readable></span>
+
*<span><code>stream</code>:‏ <stream.Readable></span>
* <span>interface:‏ <readline.Interface></span>
+
*<span><code>interface</code>:‏ <readline.Interface></span>
<span>يسبب التابع readline.emitKeypressEvents()‎ ببدء المجرى القابل للقراءة إطلاق الأحداث 'keypress' بما يتوافق مع المدخلات المُستقبلَة.</span>
+
<span>يسبب التابع <code>readline.emitKeypressEvents()</code>‎ ببدء المجرى القابل للقراءة إطلاق الأحداث <code>'keypress'</code> بما يتوافق مع المدخلات المُستقبلَة.</span>
  
<span>اختياريًّا، يحدِّد المعامل interface النسخة readline.Interface التي سيُعطَل الإكمال التلقائي فيها عندما تكتشف عملية نسخٍ ولصقٍ للمدخلات.</span>
+
<span>اختياريًّا، يحدِّد المعامل <code>interface</code> النسخة <code>readline.Interface</code> التي سيُعطَل الإكمال التلقائي فيها عندما تكتشف عملية نسخٍ ولصقٍ للمدخلات.</span>
  
<span>إذا كان المجرى stream من النوع TTY، فيجب حينئذٍ أن تكون في الوضع الخام (raw mode).</span>
+
<span>إذا كان المجرى <code>stream</code> من النوع TTY، فيجب حينئذٍ أن تكون في الوضع الخام (raw mode).</span>
  
<span>يُستدعى هذا التابع تلقائيًا من قبل أية نسخة من النوع readline على المجرى input الخاص بها إذا كان المجرى input هو طرفية. لن يوقف إغلاق النسخة readline المجرى input من إطلاق الأحداث 'keypress'.</span><syntaxhighlight lang="javascript">
+
<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);
 
readline.emitKeypressEvents(process.stdin);
 
if (process.stdin.isTTY)
 
if (process.stdin.isTTY)
سطر 299: سطر 280:
  
 
</syntaxhighlight>
 
</syntaxhighlight>
 
+
=<span>readline.moveCursor(stream, dx, dy)‎</span>=
= <span>readline.moveCursor(stream, dx, dy)‎</span> =
 
 
<span>أُضيف في الإصدار: 0.7.7.</span>
 
<span>أُضيف في الإصدار: 0.7.7.</span>
* <span>stream:‏ <stream.Writable></span>
+
*<span><code>stream</code>:‏ <stream.Writable></span>
* <span>dx:‏ <number></span>
+
*<span><code>dx</code>:‏ <number></span>
* <span>dy:‏ <number></span>
+
*<span><code>dy</code>:‏ <number></span>
<span>ينقل التابع readline.moveCursor()‎ المؤشر نسبةً إلى موقعه الحالي في المجرى stream المعطى الذي من النوع TTY.</span>
+
<span>ينقل التابع <code>readline.moveCursor()</code>‎ المؤشر نسبةً إلى موقعه الحالي في المجرى <code>stream</code> المعطى الذي من النوع TTY.</span>
 
+
=<span>أمثلة</span>=
= <span>أمثلة</span> =
+
==<span>واجهة سطر أوامر صغيرة (Tiny CLI)</span>==
 
+
<span>يوضّح المثال التالي كيفية استخدام الصنف <code>readline.Interface</code> لإنشاء واجهة سطر أوامر صغيرة:</span><syntaxhighlight lang="javascript">
== <span>واجهة سطر أوامر صغيرة (Tiny CLI)</span> ==
 
<span>يوضّح المثال التالي كيفية استخدام الصنف readline.Interface لإنشاء واجهة سطر أوامر صغيرة:</span><syntaxhighlight lang="javascript">
 
 
const readline = require('readline');
 
const readline = require('readline');
 
const rl = readline.createInterface({
 
const rl = readline.createInterface({
سطر 335: سطر 313:
 
});
 
});
 
</syntaxhighlight>
 
</syntaxhighlight>
 
+
==<span>قراءة مجرى ملف سطرًا بسطر</span>==
== <span>قراءة مجرى ملف سطرًا بسطر</span> ==
+
<span>الاستخدام الشائع للنسخة <code>readline</code> هو قراءة الدخل من مجرًى قابلٍ للقراءة لنظام الملفات سطرًا واحدًا في كل مرة:</span><syntaxhighlight lang="javascript">
<span>الاستخدام الشائع للنسخة readline هو قراءة الدخل من مجرًى قابلٍ للقراءة لنظام الملفات سطرًا واحدًا في كل مرة:</span><syntaxhighlight lang="javascript">
 
 
const readline = require('readline');
 
const readline = require('readline');
 
const fs = require('fs');
 
const fs = require('fs');
سطر 351: سطر 328:
  
 
</syntaxhighlight><span>مصادر</span>
 
</syntaxhighlight><span>مصادر</span>
 +
 +
<span> </span>
  
 
<span>[https://nodejs.org/dist/latest-v10.x/docs/api/readline.html صفحة الوحدة Readline في توثيق Node.js الرسمي.]</span>
 
<span>[https://nodejs.org/dist/latest-v10.x/docs/api/readline.html صفحة الوحدة Readline في توثيق Node.js الرسمي.]</span>

مراجعة 08:09، 19 نوفمبر 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.

  • data:‏ <string>
  • key:‏ <Object>
    • Ctrl:‏ <boolean> قيمة منطقية إن كانت true فستشير إلى المفتاح ‎<ctrl>‎‎.
    • Meta:‏ <boolean> قيمة منطقية إن كانت true فستشير إلى المفتاح <Meta>.
    • Shift:‏ <boolean> قيمة منطقية إن كانت true فستشير إلى المفتاح ‎<Shift>‎‎‎.
    • Name:‏ <string> سلسلة نصية تمثِّل اسم المفتاح.

سيكتب التابع 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:‏ <stream.Writable>
  • dir:‏ <number>
    • 1-: على يسار المؤشر
    • 1: على يمين المؤشر
    • 0: كل السطر

يمسح التابع readline.clearLine()‎ السطر الحالي من المجرى TTY المُعطى انطلاقًا من مؤضع المؤشر الحالي وباتجاهٍ محدَّدٍ مُعرّف عبر المعامل dir.

readline.clearScreenDown(stream)‎

أُضيف في الإصدار: 0.7.7.

  • 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}`);
});

مصادر

صفحة الوحدة Readline في توثيق Node.js الرسمي.