Register
Process Type
Graphical expression
Mind Type
Structured expression
Note Type
Efficient expression

مخطط الحالةالصيغة

مخطط الحالة

تتوافق صيغة مخطط الحالة في Mermaid مع الصيغة المستخدمة في plantUml، مما يسهّل على المستخدمين مشاركة المخططات بين mermaid و plantUml.

كود
                            
نسخ
تضمين
--- title: Simple sample --- stateDiagram-v2 [*] --> Still Still --> [*] Still --> Moving Moving --> Still Moving --> Crash Crash --> [*]

المحرّر القديم:

كود
                            
نسخ
تضمين
stateDiagram [*] --> Still Still --> [*] Still --> Moving Moving --> Still Moving --> Crash Crash --> [*]

المحرّر الجديد:

في مخطط الحالة، يُوصف النظام بالحالات وكيف تتحوّل حالة إلى حالة أخرى عبر الانتقالات. يعرض المخطط المثال أعلى الصفحة ثلاث حالات: ساكن ومتحرك ومتصادم. تبدأ من الحالة الساكنة، ومن الحالة الساكنة يمكن الانتقال إلى الحالة المتحركة. ومن الحالة المتحركة يمكنك العودة إلى الحالة الساكنة أو الانتقال إلى الحالة المتصادمة. ولا توجد انتقالات من الحالة الساكنة إلى الحالة المتصادمة. (إذا بقيت ساكنًا فلن تتصادم.)

状态

يمكن الإعلان عن الحالة بعدة طرق، وأبسط طريقة هي تعريف الحالة بمعرّف id فقط:

كود
                            
نسخ
تضمين
stateDiagram-v2 stateId

طريقة أخرى هي استخدام صيغة state وإضافة الوصف التالي:

كود
                            
نسخ
تضمين
stateDiagram-v2 state "This is a state description" as s2

طريقة أخرى لتعريف حالة ذات وصف هي تعريف معرّف الحالة أولًا، ثم إضافة نقطتين والوصف:

كود
                            
نسخ
تضمين
stateDiagram-v2 s2 : This is a state description

انتقال

الانتقال هو خط التوصيل عند دخول حالة إلى حالة أخرى، ويُمثَّل بسهم نصي "-->".

عند تعريف انتقال بين حالتين ولم تكن الحالة معرَّفة، فستُعرَّف الحالة غير المعرَّفة باستخدام الـ id في الانتقال. وبعد ذلك يمكنك إضافة وصف للحالة المعرَّفة بهذه الطريقة.

كود
                            
نسخ
تضمين
stateDiagram-v2 s1 --> s2

يمكن إضافة نص إلى الانتقال لوصف ما يمثّله:

كود
                            
نسخ
تضمين
stateDiagram-v2 s1 --> s2: A transition

البداية والنهاية

هناك حالتان خاصتان تمثّلان بداية المخطط وتوقّفه. وتُمثَّل هاتان الحالتان بالصيغة [*]، ويحدّد اتجاه الانتقال إليهما ما إذا كانتا حالة بداية أم حالة نهاية.

كود
                            
نسخ
تضمين
stateDiagram-v2 [*] --> s1 s1 --> [*]

حالة مركّبة

عند استخدام مخططات الحالة في العالم الواقعي، ستواجه غالبًا مخططات متعددة الأبعاد، إذ يمكن أن تحتوي الحالة على عدة حالات داخلية، وهذا ما يُسمّى الحالة المركّبة.

لتعريف حالة مركّبة، تحتاج إلى استخدام صيغة state متبوعة بـ id، وكتابة جسم الحالة المركّبة بين الأقواس المعقوصة {}. ويمكنك تسمية الحالة المركّبة في سطر مستقل تمامًا كما تعرّف حالة بسيطة. راجع المثال التالي:

كود
                            
نسخ
تضمين
stateDiagram-v2 [*] --> First state First { [*] --> second second --> [*] } [*] --> NamedComposite NamedComposite: Another Composite state NamedComposite { [*] --> namedSimple namedSimple --> [*] namedSimple: Another simple }

يمكنك العمل على عدة مستويات:

كود
                            
نسخ
تضمين
stateDiagram-v2 [*] --> First state First { [*] --> Second state Second { [*] --> second second --> Third state Third { [*] --> third third --> [*] } } }

يمكنك أيضًا تعريف انتقالات بين الحالات المركّبة:

كود
                            
نسخ
تضمين
stateDiagram-v2 [*] --> First First --> Second First --> Third state First { [*] --> fir fir --> [*] } state Second { [*] --> sec sec --> [*] } state Third { [*] --> thi thi --> [*] }

ملاحظة: لا يمكن تعريف انتقالات بين حالات داخلية تنتمي إلى حالات مركّبة مختلفة.

اختيار

أحيانًا تحتاج إلى نمذجة الاختيار بين مسارين أو أكثر، ويمكن تحقيق ذلك باستخدام <<choice>>.

كود
                            
نسخ
تضمين
stateDiagram-v2 state if_state <<choice>> [*] --> IsPositive IsPositive --> if_state if_state --> False: if n < 0 if_state --> True : if n >= 0

تفرّع/دمج

يمكن استخدام <<fork>> <<join>> لتحديد تفرّع/دمج في المخطط.

كود
                            
نسخ
تضمين
stateDiagram-v2 state fork_state <<fork>> [*] --> fork_state fork_state --> State2 fork_state --> State3 state join_state <<join>> State2 --> join_state State3 --> join_state join_state --> State4 State4 --> [*]

ملاحظة

يعبّر استخدام التعليقات في مخطط الحالة عن المعنى بوضوح أكبر، ويمكن اختيار وضع التعليق على يمين العقدة أو يسارها.

كود
                            
نسخ
تضمين
stateDiagram-v2 State1: The state with a note note right of State1 Important information! You can write notes. end note State1 --> State2 note left of State2 : This is the note to the left.

تزامن

كما في plantUml، يمكنك تحديد التزامن باستخدام رمز الشرطة --.

كود
                            
نسخ
تضمين
stateDiagram-v2 [*] --> Active state Active { [*] --> NumLockOff NumLockOff --> NumLockOn : EvNumLockPressed NumLockOn --> NumLockOff : EvNumLockPressed -- [*] --> CapsLockOff CapsLockOff --> CapsLockOn : EvCapsLockPressed CapsLockOn --> CapsLockOff : EvCapsLockPressed -- [*] --> ScrollLockOff ScrollLockOff --> ScrollLockOn : EvScrollLockPressed ScrollLockOn --> ScrollLockOff : EvScrollLockPressed }

تعيين اتجاه المخطط

بالنسبة لمخطط الحالة، يمكنك استخدام عبارة الاتجاه لتعيين اتجاه تصيير المخطط، كما في هذا المثال.

كود
                            
نسخ
تضمين
stateDiagram direction LR [*] --> A A --> B B --> C state B { direction LR a --> b } B --> D

تعليق

يمكن إدخال تعليقات في مخطط الحالة، وسيتجاهلها المحرّر. يجب أن يبدأ التعليق بعلامتي النسبة المئوية المزدوجة (%%)، ويُعدّ كل النص من هذه العلامة حتى حرف السطر الجديد التالي تعليقًا، بما في ذلك أي صيغة مخطط. ويمكن أن يشغل التعليق سطرًا مستقلًا أو يُوضع في نهاية العبارة.

كود
                            
نسخ
تضمين
stateDiagram-v2 [*] --> Still Still --> [*] Still --> Moving Moving --> Still Moving --> Crash Crash --> [*]

استخدام classDefs لتعيين التنسيق

القيود الحالية لـ classDef في مخطط الحالة:

١. لا يمكن تطبيقه على حالة البداية أو حالة النهاية

٢. لا يمكن تطبيقه على حالة مركّبة أو داخل حالة مركّبة

يمكنك استخدام صيغة classDef (وهي اختصار class definition، حيث تشبه "class" الفئة في CSS) لتعريف التنسيق. تأتي classDef متبوعة باسم التنسيق، ثم "خاصية-قيمة" واحدة أو أكثر، وتتكوّن كل "خاصية-قيمة" من اسم خاصية CSS صالح ونقطتين (:) والقيمة المقابلة.

فيما يلي مثال على classDef يحتوي على "خاصية-قيمة" واحدة فقط:

                            
نسخ
تضمين
classDef movement font-style:italic;
  • اسم التنسيق هو movement
  • الخاصية الوحيدة هي font-style، وقيمتها italic

إذا أردت الحصول على عدة "خاصية-قيمة"، فيمكن وضع فاصلة (,) بين كل "خاصية-قيمة".

فيما يلي مثال يحتوي على ثلاثة "خاصية-قيمة":

                            
نسخ
تضمين
classDef badBadEvent fill:#f00,color:white,font-weight:bold,stroke-width:2px,stroke:yellow
  • اسم التنسيق هو badBadEvent
  • الخاصية الأولى هي fill، وقيمتها #f00
  • الخاصية الثانية هي color، وقيمتها white
  • الخاصية الثالثة هي font-weight، وقيمتها bold
  • الخاصية الرابعة هي stroke-width، وقيمتها 2px
  • الخاصية الخامسة هي stroke، وقيمتها yellow

تطبيق تنسيق classDef على الحالة

هناك طريقتان لتطبيق تنسيق classDef على الحالة:

  • استخدام صيغة class لتطبيق تنسيق classDef على حالة أو أكثر في عبارة واحدة
  • استخدام المعامل ::: لتطبيق تنسيق classDef عندما تُستخدم الحالة في عبارة انتقال (مثل، سهم متّجه إلى/من حالة أخرى)

١. عبارة class

تُخبر عبارة class مخطط Mermaid بتطبيق classDef المحدّد على فئة أو أكثر. وتكون بالشكل التالي:

                            
نسخ
تضمين
class [one or more state names, separated by commas] [name of a style defined with classDef]

فيما يلي مثال على تطبيق تنسيق badBadEvent على حالة اسمها Crash:

                            
نسخ
تضمين
class Crash badBadEvent

فيما يلي مثال على تطبيق تنسيق movement على الحالتين Moving و Crash:

                            
نسخ
تضمين
class Moving,Crash movement

هذا مثال. يرجى ملاحظة أن حالة Crash طُبِّق عليها تنسيقا classDef: movement و badBadEvent

كود
                            
نسخ
تضمين
stateDiagram direction TB accTitle: This is the accessible title accDescr: This is an accessible description classDef notMoving fill:white classDef movement font-style:italic classDef badBadEvent fill:pink,color:white,font-weight:bold,stroke-width:2px,stroke:yellow [*]--> Still Still --> [*] Still --> Moving Moving --> Still Moving --> Crash Crash --> [*] class Still notMoving class Moving, Crash movement class Crash badBadEvent class end badBadEvent

٢. استخدام المعامل ::: لتطبيق تنسيق على الحالة

يمكنك استخدام المعامل ::: لتطبيق تنسيق classDef على الحالة. والصيغة هي:

                            
نسخ
تضمين
[state]:::[style name]

يمكنك تطبيقه في عبارة تستخدم فئة، وهذا يشمل حالة البداية وحالة النهاية. على سبيل المثال:

كود
                            
نسخ
تضمين
stateDiagram direction TB accTitle: This is the accessible title accDescr: This is an accessible description classDef notMoving fill:white classDef movement font-style:italic; classDef badBadEvent fill:pink,color:white,font-weight:bold,stroke-width:2px,stroke:yellow [*] --> Still:::notMoving Still --> [*] Still --> Moving:::movement Moving --> Still Moving --> Crash:::movement Crash:::badBadEvent --> [*]

المسافة في اسم الحالة

يمكنك تعريف الحالة أولًا باستخدام id، ثم الرجوع إلى هذا الـ id لاحقًا لإضافة مسافات إلى الحالة.

في المثال التالي، توجد حالة معرّفها yswsii، ووصفها ''Your state with spaces in it''. وبعد التعريف، استُخدم yswsii في الانتقال الأول للمخطط ([*] --> yswsii)، واستُخدم أيضًا عند الانتقال إلى YetAnotherState (yswsii --> YetAnotherState). وقد نُسِّق yswsii ليختلف عن الحالات الأخرى.

كود
                            
نسخ
تضمين
stateDiagram classDef yourState font-style:italic,font-weight:bold,fill:white yswsii: Your state with spaces in it [*] --> yswsii:::yourState [*] --> SomeOtherState SomeOtherState --> YetAnotherState yswsii --> YetAnotherState YetAnotherState --> [*]