الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

smarty tool

بدأه بسام العيساوي في 23 أغسطس 2010 · 21 رد · 1,572 مشاهدة · في الأخبار والنقاشات التقنية
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

كنت قد أنهيت إضافه لمجلة مدارك التي تحدثت عنها منذ فتره

هذه الإضافه تقوم بترجمه نصوص داخل القوالب إلى شيفرة

فمثلا يمكنك كتابه هذه الشيفره داخل القالب :

[FETCH:memb(+)id=%row:type9%(+) <h2><strong>
[IF:login]
    	<a href="?id=39&euid=%field:id%&chng_tmplt=empty_withside&ajx=1">
      	[ENDIF]  %field:name%[IF:login] </a>[ENDIF]
     	</strong></h2>END]

لكي تعرض بيانات من مصفوفه بشكل معين أمام المسجلين وأخرى أمام غير المسجلين

هذه الطريقه تسهل على المصمم والمبرمج عمليه التعديل على مخرجات الموقع بدون الحاجه إلى الدخول بتفاصيل الشيفره الرئيسيه

بعد ان أنهيت العمل وجد أن هناك أداة خاصه لبي أتش بي إسمها سمارتي فحاولت أن أقوم بجعلها إضافه للمجله ولكن فكرت قليلا لماذا لا أبقى على ما قمت به فربما كان أفضل ...

الآن ماقمت بعمله هو مجموعه أوامر أهمها

if ... else .... end if

foreach ..... end each

for ..... end for

sql , select , update , delete , insert with loop or while

fetch sql

ما أود مناقشته هو كيف سيتم تنفيذ هذه الجمل بحيث يتم قراءه القالب وكأنه لغة برمجه أي يقرأ جمله الشرط وإذا كان داخلها حلقة تكرار يقوم بعمل الحلقه وإذا كان داخل الحلقه جمله شرطيه يقوم بتنفيذها وهكذا ...

حاليا أقوم بتنفيذ جميع الإستعلامات واحده تلو الأخرى دون النظر إلى محتوى الناتج أي لو كان في بدايه القالب جمله شرطيه وتم تنفيذها فلن يتم قراءه الإستعلامات التي بداخلها

أرجو أن تكون الفكره وصلت ,,,

1

CMS Sfhati , Website Generator


نظام إدارة المحتوى صفحتي ... جربه الآن 


 


small-logo.png

#2

فى كتير جدا اكيد لو smarty مش مناسباك فى غيرها هيناسبك لكن بلاش تبدأ template engine خاص بيك

اما بخصوص سؤالك فالموضوع محتاج انك تعمل lex/parse للتمبليت وتوليد كود ال php المكافئ (عملية مش بسيطة)

(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#3
اقتباس
فى كتير جدا اكيد لو smarty مش مناسباك فى غيرها هيناسبك لكن بلاش تبدأ template engine خاص بيك

اما بخصوص سؤالك فالموضوع محتاج انك تعمل lex/parse للتمبليت وتوليد كود ال php المكافئ (عملية مش بسيطة)

السمارتي قوي وجميل ولكن قمت بعمل بعض الأوامر وأنتهيت منها يعني فكرة تحويل الأوامر إلى كود بي أتش بي الآن تمت ولكن سؤالي عن كيفيه تنفيذ الكود بشكل صحيح يعني بماذا أبدأ هل أقوم بترجمه الأوامر العاديه أو الدوال بشكل أولي ثم أبدأ في جمل الشرط وبعدها بجمل التكرار أم أقوم بتتبع الكود سطر سطر وتنفيذ ما أجده ؟

لرؤية الكود الذي قمت بعمله مع شرح لأول الأوامر من هنا

http://cms.urorbit.com/?id=77&flash_file=32&type=1

CMS Sfhati , Website Generator


نظام إدارة المحتوى صفحتي ... جربه الآن 


 


small-logo.png

#4

انت كدا هتواجه مشكلات كتير لاحقا بالإضافة للإسلوب المعقد المستخدم فال template language "بإختصار لمراحل التطوير" هى لغة محتاجة lexer عشان تقرا ملف ال template وتقسمه لل tokens الخاصة باللغة وبعدها parser عشان تنشئ ال syntax tree بناء على الصيغة المستخدمة للغة واى اختبارات اضافية وبعدها توليد الكود المكافئ

فالمكون دا بالذات يستحسن تستخدمله مكون جاهز والنصيحة دى عن تجربة

(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#5

بارك الله بك

سأبحث عما قلت وأرى ماذا تقصد :)

ربما أقوم بدراسه كيفيه عمل سمارتي وبناء عليها أقوم بعمل لغتي الخاصه , ليست الفكرة هي عمل شيء من الصفر بقدر أني أفكر ربما أقوم بعمل شيء أفضل وما المانع blink.gif

CMS Sfhati , Website Generator


نظام إدارة المحتوى صفحتي ... جربه الآن 


 


small-logo.png

#6
اقتباس

ما أود مناقشته هو كيف سيتم تنفيذ هذه الجمل بحيث يتم قراءه القالب وكأنه لغة برمجه أي يقرأ جمله الشرط وإذا كان داخلها حلقة تكرار يقوم بعمل الحلقه وإذا كان داخل الحلقه جمله شرطيه يقوم بتنفيذها وهكذا ...

يمكن ان تقوم بذلك بسهولة جدا بعيد عن الطرق المعقدة التى تصلح للغات البرمجة الكاملة

ويمكن ان تستخدم اساليب بناء المترجمات

اى هناك طريقتين على حد علمى وخبرتى العملية فى هذا المجال

انا ملم بالطريقتين وكلاهما يمكن ان تستخدمها فى حالتك

هل تريد الطريقة البسيطة (خوارزمية لاتزيد عن 1000 سطر) وتقبل ان تقوم بعمل nested structure وتعالجها

وهذه الطريقة من ابداعى وقمت بها فى نهاية عام 2007 من خلال بناء لغة اسكربت صغيرة تقبل nested structure

وهى لغة RPWI التى تستخدم فى بناء مكونات تقنية البرمجة بدون كود والتحكم فى الـ Generated Code

فى الخلفية وفى الخطوات التى تمثل واجهة النظام

http://www.programmingwithoutcoding.com

اما اذا كنت تريد الطريقة المعقدة (مقارنة بالطريقة السابقة - لكن لاشىء معقد لدرجة المستحيل - العلم بالتعلم) وهى طرق بناء ال Compiler

فاايضا انا ملم بهذه الطريقة وقد استخدمت الاطار العام لها عام 2010 فى بناء لغة السوبرنوفا باستخدام تقنية البرمجة بدون كود

http://supernova.sourceforge.net

والله الموفق

#7

أشكرك أخي الكريم PWCT Maker

فأنا أبحث عن طرق تم إبتكارها لكي يتم تطويرها وأفضل الكود القليل على الكثير :)

سأدرس الطريقه الأولى وأرجو أن يتسع صدرك إذا كان لدي بعض الأسئله

أممممم ... حجم الملف ضخم جدا 236 ميغا !!

هل يمكنك إعطائي تفاصيل حول خطوات العمل أو الكود المصدري لطريقة الكومبايلر فقط ؟

1

CMS Sfhati , Website Generator


نظام إدارة المحتوى صفحتي ... جربه الآن 


 


small-logo.png

#8

اخي بسام صراحة بحثت بهذا الموضوع من قبل

smarty لو حتستخدمها مع المجلة كل شخص رح يستخدم المجلة ويرفعها على السيرفر رح يقاع بمشكلة (ما هي بما انو ما نزلت موقع على النت ماني متذكر اسمها يجب طلب من المخدم تفعيل خدمة له)

ميزة السمارتي انها تقوم بالكاش لكل العمليات وهذه تعطي ميزة وسوء مع الوقت

وانت لا تحتاجها بكليتها

رايي ان تاخذ نوع مصغر من السمارتي اسمه

template lite

or

template fast

الاثنين خفيفان

صراحة لم اجربهما ولكنني قرات عنهما وهذا ما يعيبني قراءة بدون عمل (عسى ان ياتي يوم اعمل بما ادرس)

حل اخير انا درست بالمعهد طريقة حلوة عن طريق عمل ملف html وملف index ويحتوي ملف html على وسوم مثلا

#title# يتم جلب الملف الhtml واستبدال محتواه وللتحقق وحتى لا تقع بمشكلة تضع ملف خارجي يسجل الجلسة وبالتالي عند الدخول يتم تسجيله بالجلسلة

اذا كيف سيتم عرض الروابط

بسيطة اذا كان مسجل دخول اولا

كلامي كلو نظري ولكن لو طبق بشكل عملي يحتاج الى منتدى كامل

ان شاء الله كون ساهمت ولو بفكرة واحدة او شي يفيد وربنا يوفق الجميع

جزاكم الله كل خير

In bad state

#9
اقتباس

أشكرك أخي الكريم PWCT Maker

فأنا أبحث عن طرق تم إبتكارها لكي يتم تطويرها وأفضل الكود القليل على الكثير

سأدرس الطريقه الأولى وأرجو أن يتسع صدرك إذا كان لدي بعض الأسئله

أممممم ... حجم الملف ضخم جدا 236 ميغا !!

هل يمكنك إعطائي تفاصيل حول خطوات العمل أو الكود المصدري لطريقة الكومبايلر فقط ؟

العفو اخى الحبيب

نعم تقنية البرمجة بدون كود مساحتها كبير

ولكن لاداعى ان تقوم بتحميلها للتعرف على المفهوم المطلوب

لانى سوف اوضحه لك اليوم نقطة نقطة باذن الله رب العالمين

والله الموفق

#10

بعد ان اطلعت على الشفيرة المصدرية التى قمت انت بكتابتها

وجدت ان هناك حل سريع جدا يناسب المشكلة ولن ياخذ وقت فى تطبيقه باذن الله

فى الدالة do_syntax

function do_syntax($text){
$text=date_format_conv($text);
$text=each_for($text);
$text=function_eval($text);
$text=fetch_table($text);
$text=IF_ENDIF($text);
$text=set_get($text);
$text=mem_sql($text);
return $text;
}

انت تستدعى الدوال التى تقوم بالمعالجة واحدة تلو الاخرى

المشكلة التى تنبهت لها وهى اساس سؤالك عن امكانية وضع تركيب داخل اخر

مثل واضع جملة IF داخل For Each مثلا

يمكن حلها كالتالى

تقوم بعمل While Loop رئيسية ويكون شرطها ان متغير ما قيمته True وتضع له هذه القيمة الافتراضية

فى البداية

متغير عام س = true
نفذ طالما س = true
         س = false
       استدعى دوال المعالجة واحدة تلو الاخرى
       نهاية طالما

بهذا الشكل المفروض الحلقة ستعمل مرة واحدة

الا اذا كانت دوال المعالجة تؤثر على المتغير العام (س)

فانه فى هذه الحالة ممكن ان تعمل الحلقة اكثر من مرة

كل ماعليك ان تذهب الى دوال المعالجة

وفى حالة انها تحققت - اى تم الاستفادة منها

يعنى مثلا الدالة الخاصة بمعالجة جمل IF

فى حالة انها وجدت جملة IF فانها تجعل المتغير العام س = True

وبهذا الشكل تعمل الحلقة اكثر من مرة طالما ان هناك جمل يتم تنفيذها

الموضوع لن يكلف الا اسطر برمجية قليلة وهذه الطريقة تنفع فى الامور البسيطة

لكن فى لغات البرمجة الكبيرة لاتصلح لانه تكسر قاعدة وهى قراءة الملف المصدرى اكثر من مرة

وهذا غير مسموح به فى بناء المترجمات سريعة الاداء حيث يجب ان يتم قراءة الملف المصدرى مرة واحدة

هذا هو حل المشكلة التى تسال عنها

فضلا قم بتطبيقه واخبرنى بالنتائج

ملاحظة هامة

هناك مشكلة ستظهر لك

وهى انك من خلال الطريقة التى كتبت بها استدعاء جملة المعالجة تعطى اولوية لتنفيذ الجمل

يعنى لاتراعى ترتيب الكود وانما تضع ترتيب للتنفيذ من تلقاء نفسك

حيث وضعت ان اول جمل يتم تنفيذها هى

date_format_conv($text);

ثم

each_for($text);

وهكذا

وبهذه الطريقة سوف يحصل المبرمج على نتائج غير متوقعة

للكود الذى يكتبه

وهذا امر ايضا يجب اصلاحه وسوف ارشدك الى الحل باذن الله رب العالمين

تم تعديل هذه المشاركة بواسطة PWCT Maker في 25 أغسطس 2010 في 17:44

#11

الحل لمشكلة الترتيب

بحيث يتم التنفيذ حسب ترتيب كتابة الجمل فى الكود

وليس حسب ترتيب الدوال الذى قمت انت بوضعها واحدة تلو الاخرى

يكون كالتالى

تقوم بكتابة كود للاستكشاف العام لتحديد الدالة التى تحتاج اليها ثم تستدعيها فقط عند الحاجة

ويكون ذلك بالمرور على اسطر الكود سطر سطر

وفى حالة اكتشاف امر IF فى هذه الحالة فقط يتم استدعاء الدالة التى تقوم بمعالجة هذا الامر

وبهذا الشكل يتم تنفيذ الكود بالترتيب الصحيح ومع امكانية وضع تركيب داخل اخر

ومرة اخرى اقول

ان هذا الحل بسيط جدا فى التطبيق ولكن بساطة على حساب الاداء والسرعة

ربما فى الاسكربتات البسيطة لن تجد مشكلة كبيرة فى الاداء

ولكن مع الاعمال الضخمة والاسكربتات الكبيرة سوف تجد ان هذا الاسلوب يجعل الاداء ضعيف جدا

وسرعة العمل بطيئة

هذا كل شىء اتمنى ان يكون كل شىء واضح بالنسبة لهذه الطريقة

ملحوظة هامة

عندما تقوم بعمل دالة الاكتشاف التى تقوم بقراءة الكود سطر سطر

ثم تستدعى دالة التنفيذ هنا لاداعى ان تقوم هذه الدالة بقراءة الكود سطر سطر مرة اخرى

بل يمكن ان تكمل فى هذه النقطة

بمعنى اوضح

دالة الاستكشاف هى دمج لجميع دوال تنفيذ الاوامر التى عرفتها

وبهذا يكون التنفيذ اسرع من حيث الاداء

والله الموفق

تم تعديل هذه المشاركة بواسطة PWCT Maker في 25 أغسطس 2010 في 17:43

#12

بعد انتهاء التطبيق والتعديل

ستجد الكود النهائى يحاكى هذا الكود وهو جزء من كود كتبته سنة 2007 بلغة MS-Visual FoxPro

لمعالجة وتنفيذ اوامر اسكربت تقبل Nested Structure وتتحكم فى الكود الناتج

MYTTYPE = 0 && NEGATIVE TEST TYPE
ADDRES = .T.
MYTVALUE = "0" && MYTESTVALUE
mycont = .t.
DO WHILE mycont = .t.
	mycont = .f.
	MYMEMO = M_MASK
	MYRES = ""
	MYINFRES = ""
	MYLAST = MEMLINES(MYMEMO)
	FOR X = 1 TO MYLAST
		MYVAR = ALLTRIM(MLINE(MYMEMO,X))
		DO WHILE ASC(LEFT(MYVAR,1)) = 9
			MYVAR = SUBSTR(MYVAR,2)
		ENDDO
		IF UPPER(LEFT(MYVAR,15)) == "<RPWI:POSITIVE>"
			MYTTYPE = 1
			IF .NOT. EMPTY(MYVAR)
				MYRES = MYRES + MYVAR + CHR(13) + CHR(10)
			ENDIF
			LOOP
 		 ENDIF
	 	 IF UPPER(LEFT(MYVAR,15)) == "<RPWI:NEGATIVE>"
			MYTTYPE = 0
			IF .NOT. EMPTY(MYVAR)
				MYRES = MYRES + MYVAR + CHR(13) + CHR(10)
			ENDIF
			LOOP
  		ENDIF
		IF UPPER(LEFT(MYVAR,12)) == "<RPWI:VALUE>"
			MYTVALUE = ALLTRIM(SUBSTR(MYVAR,13))
			IF .NOT. EMPTY(MYVAR)
				MYRES = MYRES + MYVAR + CHR(13) + CHR(10)
			ENDIF
			LOOP
		 ENDIF
		IF UPPER(LEFT(MYVAR,11)) == "<RPWI:TEST>"
   			mycount = 1
 			MYVAR2 = SUBSTR(MYVAR,12)
			IF AT(MYTVALUE,MYVAR2) >= 1
				 IF MYTTYPE = 0
					 ADDRES = .F.
				 ELSE
					 ADDRES = .T.
				 ENDIF
			ELSE
				 IF MYTTYPE = 0
		 			ADDRES = .T.
				 ELSE
					 ADDRES = .F.
				 ENDIF
			ENDIF
			MYSTART = X+1
			FOR T = MYSTART TO MYLAST
				MYVAR3 = ALLTRIM(MLINE(MYMEMO,T))
				DO WHILE ASC(LEFT(MYVAR3,1)) = 9
					MYVAR3 = SUBSTR(MYVAR3,2)
				ENDDO
				IF UPPER(LEFT(MYVAR3,11)) == "<RPWI:TEST>"
					mycont = .t.
  					mycount = mycount + 1
				ENDIF
  				IF UPPER(LEFT(MYVAR3,14)) == "<RPWI:ENDTEST>" 
	 				if mycount = 1
						IF ADDRES = .T.
							FOR Y = X+1 TO T-1
								MYVAR4 = ALLTRIM(MLINE(MYMEMO,Y))
								DO WHILE ASC(LEFT(MYVAR4,1)) = 9
									MYVAR4 = SUBSTR(MYVAR4,2)
								ENDDO
								MYRES = MYRES + MYVAR4 + CHR(13) + CHR(10)
							NEXT
						ELSE
						* EACH STEP - ONE UNIQUE ID
						FOR Y = X+1 TO T-1
							MYVAR4 = ALLTRIM(MLINE(MYMEMO,Y))
								DO WHILE ASC(LEFT(MYVAR4,1)) = 9
									MYVAR4 = SUBSTR(MYVAR4,2)
								ENDDO
								IF UPPER(LEFT(MYVAR,14)) == "<RPWI:NEWSTEP>"
 									mystepcounter = mystepcounter + 1
 					 			ENDIF
 						NEXT

			  		ENDIF
	  				X = T
	 				 EXIT 
				 	ELSE
					 IF .NOT. MYCOUNT = 1
						 mycount = mycount - 1
				 	ENDIF
				 endif
		  		ENDIF
			NEXT
		ELSE
		IF .NOT. EMPTY(MYVAR)
			MYRES = MYRES + MYVAR + CHR(13) + CHR(10)
		ENDIF
	ENDIF
NEXT
m_mask = myres
ENDDO

ولانى افترض انك لاتعرف ال Visual FoxPro فهى نادرة الاستخدام

فقد وضحت لك الفكرة فى المشاركات السابقة

اما بخصوص طريق بناء الـ Compiler

فهى تاخذ وقت لدراستها وقد درستها بعمق لمدة عامين كاملين حتى اتقن الاساسيات بشكل عملى

وذلك قبل ان اقوم ببناء لغة السوبرنوفا

وهناك موضوع عن السوبرنوفا شرحت فيها جزء من البناء الداخلى وطريقة عمل اللغة

والله الموفق

تم تعديل هذه المشاركة بواسطة PWCT Maker في 25 أغسطس 2010 في 17:59

1
#13

هذا هو رابط الموضوع

/index.php?showtopic=216924

والشرح لطريقة البناء الداخلى بداية من الصفحة رقم 5

/index.php?showtopic=216924&st=80

وقد تم بناء لغة السوبرنوفا بتقنية البرمجة بدون كود

وهناك الكثير من الكتب حول بناء المترجمات يمكنك دراستها ان اردت التعمق فى هذا المجال

والله الموفق

#14

انا جربت كثير من Template Engines و بعد التجربة وجدت ان PHP نفسها افضل شيء ما تكون PHP as Template lang , و هذه لعدة اسباب , اهمها تستطيع استخدام قوة الـ PHP داخل القالب , و ايضا , لن يكون هناك طبقات اخرى تاخذ وقت اضافي قاتل في عملية ال Parsing جرب استخدام صيغة الكتابية في PHP (سهلة القراءة من ناحية المصممين ) مثلا

foreach endforeach
if endif
for endfor
while endwile
etc....

تم تعديل هذه المشاركة بواسطة ahmad123 في 25 أغسطس 2010 في 19:44

#15

X-File

بالنسبه لإستدعاء القوالب فقد قمت بعمل ذلك وهو لم يعد بحاجه إلى تتبع كما في الكود لأني أقوم بإستدعاء القوالب كلها ثم البحث عن أي قالب يقوم بإستدعاء قالب آخر وأستبدل ذلك بالقالب المستدعى وهكذا وبهذا تكون العمليه منتهيه

الآن بعد تنفيذ جميع الشيفرات والإضافات يظهر لي الكود النهائي وهو يحتوي على كود القالب الذي أنشأناه هنا يأتي دور التتبع وتنفيذ وهو ما أسأل عنه

اقتباس
المشكلة التى تنبهت لها وهى اساس سؤالك عن امكانية وضع تركيب داخل اخر

مثل واضع جملة IF داخل For Each مثلا

يمكن حلها كالتالى

تقوم بعمل While Loop رئيسية ويكون شرطها ان متغير ما قيمته True وتضع له هذه القيمة الافتراضية

فى البداية

لقد قمت بعمل مترجم يعمل كالتالي :

البحث عن أول جمله بغض النظر عن محتواها ومن ثم تنفيذها والعودة مره أخرى إلى الصفحة والبحث عن أول جمله ومن ثم تنفيذها وهكذا إلى أن ينتهي الكود

كما أني أقوم بتنفيذ جميع الجمل على المتغيرات لكل جمله لكي يتمكن المستخدم من كتابه شرطة إذا كان اليوم يساوي والمتغير يكون عباره عن تنسيق تاريخ فهنا يتم ترجمه المتغير أولا ثم تنفيذ الجمله

فهل هذه العمليه صحيحه ؟ لقد وجدت أنها سريعه خصوصا أني أستخدم الداله

strpos

وهي تختلف عن تتبع سطر سطر

وبما انك أخي الكريم خبير في هذا المجال فهل تنصح بإستخدام ما توصلت له أم أن هناك مشاكل ستظهر ؟

اقتباس
انا جربت كثير من Template Engines و بعد التجربة وجدت ان PHP نفسها افضل شيء ما تكون PHP as Template lang , و هذه لعدة اسباب , اهمها تستطيع استخدام قوة الـ PHP داخل القالب , و ايضا , لن يكون هناك طبقات اخرى تاخذ وقت اضافي قاتل في عملية ال Parsing جرب استخدام صيغة الكتابية في PHP (سهلة القراءة من ناحية المصممين ) مثلا

أخي أحمد لم أفهم ماتقصد هل قصدك أن الجمل التي استخدما أقوم بتحويلها مثل جمل البي أتش بي أم أستخدم بي أتش بي نفسها ؟

إذا كنت تقصد المقصد الثاني فأنا أخالف الرأي بشده لأن هذا يجعل المصمم يقع في حيره ويكون ملف القالب ملف تنفيذي وهذا خطر لأن أي خطأ من المصمم يؤدي إلى توقف الموقع

أما إذا كنت تقصد المقصد الأول فانا معك وسأحاول ذلك لأنني فكرت بهذا :)

CMS Sfhati , Website Generator


نظام إدارة المحتوى صفحتي ... جربه الآن 


 


small-logo.png

#16
اقتباس

لقد قمت بعمل مترجم يعمل كالتالي :

البحث عن أول جمله بغض النظر عن محتواها ومن ثم تنفيذها والعودة مره أخرى إلى الصفحة والبحث عن أول جمله ومن ثم تنفيذها وهكذا إلى أن ينتهي الكود

كما أني أقوم بتنفيذ جميع الجمل على المتغيرات لكل جمله لكي يتمكن المستخدم من كتابه شرطة إذا كان اليوم يساوي والمتغير يكون عباره عن تنسيق تاريخ فهنا يتم ترجمه المتغير أولا ثم تنفيذ الجمله

فهل هذه العمليه صحيحه ؟ لقد وجدت أنها سريعه خصوصا أني أستخدم الداله

strpos

وهي تختلف عن تتبع سطر سطر

وبما انك أخي الكريم خبير في هذا المجال فهل تنصح بإستخدام ما توصلت له أم أن هناك مشاكل ستظهر ؟

بداية نصحح المصطلحات

لاتطلق على ماتقوم به كلمة مترجم

لان المترجم Compiler يقوم بالتحويل من لغة الى اخرى (ممكن اللغة الاخرى قد تكون لغة وسيطة يتم تنفيذها بعد ذلك)

ماتقوم به يطلق عليه **preprocessor** اى معالجة تسبق المعالجة التى يقوم بها المترجم الحقيقى

فهذا مثلا شبيه بجمل #define و #include التى تعرف فى لغات البرمجة لتوجيه المترجم

بالنسبة للمشاكل فانه يتضح لي انك ستواجه مشكلة بسبب استخدام strpos

وهذه المشكلة هى

ماذا لو وجدت نص الامر ولكنه فى السياق ليس امرا وانما تخيل مثلا نص رسالة لتظهر فى الصفحة

فى هذه الحالة فانك سوف تحتسب هذا النص على انه امر وسوف تتخذ خطوات لتنفيذه وهو ليس امرا

لكن المعالجة سطر سطر تختلف فيمكن ان تضيف تعليمات لادارة السياق Context بسهولة

كما يمكن ان تتوقع الاوامر فى بداية السطر للتسهيل

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

والله الموفق

#17
اقتباس
ماذا لو وجدت نص الامر ولكنه فى السياق ليس امرا وانما تخيل مثلا نص رسالة لتظهر فى الصفحة

في الحقيقه هذا يعتبر خطأ برمجي كما لو أنك قمت بوضع جمله غير برمجيه في برنامجك ماذا سيحدث ؟ طبعا سيظهر لك خطأ فورا

أعتمد في الأوامر التي أقوم بعملها على الأقواس المعكوفه وعلامة بالمئه وهذه العلامات تكون بطريقه لايمكن أن تكون بالنص بشكل تلقائي وفي حال قام أحد الزوار بإضافة هذه الرموز في تعليقاته فإن المجله تقوم بفلترة هذه الرموز وتخزينها وفي حال عرضها مرة أخرى يتم إعادة الفلتره لتعود كما كانت

اقتباس
لكن المعالجة سطر سطر تختلف فيمكن ان تضيف تعليمات لادارة السياق Context بسهولة

كما يمكن ان تتوقع الاوامر فى بداية السطر للتسهيل

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

أشكرك على المداخلات ولكن هنا أنت تخبر عن سطر سطر وهي طريقه أرى أنها بطيئه ولا تلغي فكرة الخطأ التي تحدثت عنها سابقا !!

على كل أقوم حاليا بتطبيق عملي على ماتوصلت له وفي حال تم الإنتهاء سأقوم بإختبار النتيجه وأضع بين أيديكم الشيفره التي توصلت لها

CMS Sfhati , Website Generator


نظام إدارة المحتوى صفحتي ... جربه الآن 


 


small-logo.png

#18
اقتباس

أعتمد في الأوامر التي أقوم بعملها على الأقواس المعكوفه وعلامة بالمئه وهذه العلامات تكون بطريقه لايمكن أن تكون بالنص بشكل تلقائي وفي حال قام أحد الزوار بإضافة هذه الرموز في تعليقاته فإن المجله تقوم بفلترة هذه الرموز وتخزينها وفي حال عرضها مرة أخرى يتم إعادة الفلتره لتعود كما كانت

يفضل ان لاتقيد نفسك كثيرا حتى تقدم شىء يعمل

بل عليك ان تقدم الشىء الصحيح ثم تبحث عن الطريقة التى تطبق بها

بمعنى ان طريقة العمل لابد ان تفكر بها من وجهة نظر المستخدم لتسهيل حياة المستخدم

وليس من وجهة نظرك كمبرمج او مطور لتسهل على نفسك البرمجة او التطوير

اقتباس

أشكرك على المداخلات ولكن هنا أنت تخبر عن سطر سطر وهي طريقه أرى أنها بطيئه ولا تلغي فكرة الخطأ التي تحدثت عنها سابقا !!

العفو اخى الحبيب لاشكر على واجب

بالنسبة لطريقة المعالجة سطر سطر

فواضح انه حدث لديك لبس فى الفهم

هذه الطريقة لاتسبب البطء وانما الذى يسبب البطء هو استخدامها اكثر من مرة مرارا وتكرارا

فليس البطء يكون ناتج عن قراءة التعليمات سطر سطر

فهذا مايحدث فى المترجمات (قراء التعليمات حرف حرف ) ومن ثم تحديد الاسطر وكانك تقرا التعليمات سطر سطر

وانما البطء يكون ناتج عن اعادة قراءة نفس السطر اكثر من مرة من قبل اكثر من دالة او نفس الدالة

بل الصحيح ان يتم القراءة مرة واحدة لتحقيق السرعة

اقتباس

على كل أقوم حاليا بتطبيق عملي على ماتوصلت له وفي حال تم الإنتهاء سأقوم بإختبار النتيجه وأضع بين أيديكم الشيفره التي توصلت لها

ربنا يعينك ويوفقك باذن الله ويكرمنا ويوفقنا جميعا يارب

والله الموفق

#19

توصلت إلى هذه الشيفره وهي تعمل على تتبع وتنفيذ الأوامر من خلال أول أمر تصادفه وهكذا إلى أن ينتهي الملف

<?
$_SESSION[SYNTAX_WORD][]='IF';
$_SESSION[SYNTAX_WORD][]='SQL';
$_SESSION[SYNTAX_WORD][]='EACH';
$_SESSION[SYNTAX_WORD][]='FETCH';

function do_syntax($text) {
	foreach($_SESSION[SYNTAX_WORD] as $v) {
    	if(strpos($text,$v)!==false)
        	$x_pos[$v]=strpos($text,$v);
	}
	if(!count($x_pos)) return $text;
	asort($x_pos);
	$FK=array_keys($x_pos);
	$text=START_SYNTAX($text,$FK[0]);
	return $text;
}

function START_SYNTAX($text,$WORD) {
	$start="[{$WORD}:";$end="END{$WORD}]";
	$x=extractBetweenDelimetersx($text,$start,$end);
	$text=str_replace($start.$x.$end,$x,$text);
	$text=do_syntax($text);
	return $text;
}

function extractBetweenDelimetersx($inputstr,$delimeterLeft,$delimeterRight) {
	$posLeft  = strpos($inputstr,$delimeterLeft) + strlen($delimeterLeft);
	$posRight = strpos($inputstr,$delimeterRight);
	return  substr($inputstr,$posLeft,$posRight-$posLeft);
}
?>

الإختبار مع هذا النص

 xxxxx[FETCH:1[EACH:2[IF:3ENDIF]2ENDEACH]1ENDFETCH] xxxxx
xxxxx [SQL:4ENDSQL] xxxx [FETCH:5ENDFETCH] xxxxx

كانت نتيجه التنفيذ خطوه خطوه كالتالي :

 xxxxx1[EACH:2[IF:3ENDIF]2ENDEACH]1 xxxxx
xxxxx [SQL:4ENDSQL] xxxx [FETCH:5ENDFETCH] xxxxx



 xxxxx12[IF:3ENDIF]21 xxxxx
xxxxx [SQL:4ENDSQL] xxxx [FETCH:5ENDFETCH] xxxxx



 xxxxx12321 xxxxx
xxxxx [SQL:4ENDSQL] xxxx [FETCH:5ENDFETCH] xxxxx



 xxxxx12321 xxxxx
xxxxx 4 xxxx [FETCH:5ENDFETCH] xxxxx



 xxxxx12321 xxxxx
xxxxx 4 xxxx 5 xxxxx

شو رأيكم بالمجهود :)

الفكرة من الموضوع هو إمكانيه إنشاء أوامر من قبل المطور بكل سهوله يعني عمل إضافات لهذه الإضافه بكل سهوله فمثلا إذا أردت عمل جمله تكرار للحروف أقوم بتعريف أمر كالتالي

FORCHR

الآن بقيت فكرة المتغيرات وكيف سنقوم بعمل تنفيذ لكل متغير

ما أقصدة تخيل هذا الأمر

[IF:[DATE:d-m-Y==15-09-1980] Yes this is your birth day man :) ENDIF]

أنظر أحد المتغيرات عباره عن أمر ... فهمتم مقصدي ؟؟

CMS Sfhati , Website Generator


نظام إدارة المحتوى صفحتي ... جربه الآن 


 


small-logo.png

#20

بعد التفكير وجدت أنه ليس من المنطق أن تكون الجمل التي تكوّن المتغيرات كالتي تكون بين أقواس

أي أنه ليس من المعقول أن نكتب كود كهذا

for(for(1 to 9 ){ print "x"} to 10){ print "y" }

في المقابل يمكننا كتابه كود كهذا

for(some_function(4) to 9 ){ print "y" }

لذلك سأعتمد ترميز آخر للدوال التي تنفذ في مكانها وليست كجمل التكرار أو الشرطيه

CMS Sfhati , Website Generator


نظام إدارة المحتوى صفحتي ... جربه الآن 


 


small-logo.png

#21

الحمد لله م الإنتهاء من العمل

الكود

[FOR:"i","1","10","
[FOR:"j","1","%i%","*  "
end FOR]
<br>
"end FOR]

النتيجه

*    
   *  *    
   *  *  *    
   *  *  *  *    
   *  *  *  *  *    
   *  *  *  *  *  *    
   *  *  *  *  *  *  *    
   *  *  *  *  *  *  *  *    
   *  *  *  *  *  *  *  *  *    
   *  *  *  *  *  *  *  *  *  *

الكود :

[upper:"bassaM"end upper]
[EACH:"xbassam","<hr>%xbassam:key%:%xbassam:val%<br>
[IF:"%xbassam:val%=xx","this is xx [ELSE] sry not xx "end IF] <hr>
"end EACH]

النتيجه

اقتباس
x:xx

this is xx x1:xx1

sry not xx x2:xx2

sry not xx x3:xx3

sry not xx

كما قمت بعمل المزيد من الجمل مثل سيكول وغيرها وسيتم تضمين هذه الإضافة مع مجلة مدارك في النسخ القادمة بإذن الله

للمشاركة أو الإطلاع على الكود يمكنك زياره موقع المجله

CMS Sfhati , Website Generator


نظام إدارة المحتوى صفحتي ... جربه الآن 


 


small-logo.png

#22
bastr3 كتب:

الحمد لله م الإنتهاء من العمل

الكود

[FOR:"i","1","10","
[FOR:"j","1","%i%","*  "
end FOR]
<br>
"end FOR]

النتيجه

*    
   *  *    
   *  *  *    
   *  *  *  *    
   *  *  *  *  *    
   *  *  *  *  *  *    
   *  *  *  *  *  *  *    
   *  *  *  *  *  *  *  *    
   *  *  *  *  *  *  *  *  *    
   *  *  *  *  *  *  *  *  *  *

الكود :

[upper:"bassaM"end upper]
[EACH:"xbassam","<hr>%xbassam:key%:%xbassam:val%<br>
[IF:"%xbassam:val%=xx","this is xx [ELSE] sry not xx "end IF] <hr>
"end EACH]

النتيجه

كما قمت بعمل المزيد من الجمل مثل سيكول وغيرها وسيتم تضمين هذه الإضافة مع مجلة مدارك في النسخ القادمة بإذن الله

للمشاركة أو الإطلاع على الكود يمكنك زياره موقع المجله

الله يعطيك العافية، و عمل جميل للأمام إن شاء الله.

welcome to my portfolio:

www.cornerofart.net

Submit you design

here

مواضيع مشابهة