مشروع جماعي : تطبيق BottlePaste
MuStafa - HaSsan كتب:جعلته على نضام bottle .
@route('/thecode',method="POST") def raw_code(n): paste=get_paste(n) conte = response.set_header('Content-Type', 'text/plain') if conte: return HTTPResponse(paste.code,) return template('***.tpl')اذا تقصد هذا
حتى اكمله
ال raw هي GET request وليست POST
لاتحتاج إلى template
تحتاج للحصول على ال paste فقط وإرسالها داخل ال response
MuStafa - HaSsan كتب:py gments هي راح نستخدمها في تلوين الكود !!
لكي نجعله افضل لنجعل لكل لغة لونها خاص !
ماذا تقصد ؟
يوجد ألوان إفتراضية ل pygments هي ماسيتم إستخدامها.
(map share people)
فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader
ahmed_youssef كتب:ال raw هي GET request وليست POST
لاتحتاج إلى template
تحتاج للحصول على ال paste فقط وإرسالها داخل ال response
ماذا تقصد ؟
يوجد ألوان إفتراضية ل pygments هي ماسيتم إستخدامها.
نعم انا اخطأت المفروض يتم ارسالها لم انتبه للكود جيدا , المهم هل ماتقصده هو هذا عندما قلت مشابه !
حيث اصبح الكود هكذا
@route('/thecoder/:n)
def raw_code(n):
paste=get_paste('%s')%int(n)
conte = response.set_header('Content-Type', 'text/plain')
if conte:
return HTTPResponse(paste.code)
نعم مكتبة pygments
فيها الوان خاصة , ويضا مميزات للخطوط
انا اﻻن اعمل عليها><
فقط اعطني معلومات عن الشيء الذي سوف افعله
راح اضع لكل لغة لون خاص بها
مثل بايثون يوجد لها لون خاص
وغيرها هكذا
تم تعديل هذه المشاركة بواسطة MuStafa - HaSsan في 30 أبريل 2013 في 20:01

لاعلاقة لك بالألوان بالمرة ، كل علاقتك هي إستخدام مكتبة Pygments على نص معين ويعاد لك ملونا
أنظر كيف تحصل على lexer حسب اللغة وكيف ستقوم بتلوين ذلك الكود عبر htmlformatter
(map share people)
فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader
pygments
from pygments import highlight
from pygments.lexers import PythonLexer
from pygments.formatters import HtmlFormatter
@route('/new', method="POST")
def new():
frm = NewPasteForm(request.POST)
formattedText =highlight(frm.codebody.data, PythonLexer(), HtmlFormatter())
return template('templates/result.html',form=frm,code= formattedText)هذه تعرض الكود منسق ولكن غير ملون
مرفق ملف المشروع حتي الأن
تم تعديل هذه المشاركة بواسطة a.atalla في 30 أبريل 2013 في 21:25
a.atalla كتب:pygments
from pygments import highlight from pygments.lexers import PythonLexer from pygments.formatters import HtmlFormatter @route('/new', method="POST") def new(): frm = NewPasteForm(request.POST) formattedText =highlight(frm.codebody.data, PythonLexer(), HtmlFormatter()) return template('templates/result.html',form=frm,code= formattedText)هذه تعرض الكود منسق ولكن غير ملون
مرفق ملف المشروع حتي الأن
جميل ولكن القصاصات لن تكون دائما بايثون
يوجد وحدة pygments.lexers يوجد بها بعض الأشياء المفيدة مثل guess_lexer , get_lexer_by_name, get_all_lexers
from pygments import highlight from pygments.formatters import HtmlFormatter from pygments.lexers import get_all_lexers, guess_lexer, get_lexer_by_name
وداخل ال model
def highlighted_code(self):
lexer=None
if self.language:
try:
lexer=get_lexer_by_name(self.language)
except:
lexer=None
if lexer is None:
lexer=guess_lexer(self.code)
formatter=HtmlFormatter(linenos=True)
return highlight(self.code, lexer, formatter)(map share people)
فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader
هذا يقوم بتلوين حسب ماخصصته من اسماء الفانكشن (الدوال) والتعليقات والسترينج واسماء المتغيرات
from pygments.style import Style
from pygments.token import Keyword, Name, Comment, String
@route('/new', method="POST")
def new():
frm = NewPasteForm(request.POST)
formattedText =highlight(frm.codebody.data, PythonLexer(), HtmlFormatter())
if formattedText:
info{
Name.Function:'#0f0'
Name : '#0f0'
String:'bg:#eee #111'
Comment:'italic #888'
}
فقط عليك ربطه بالقالب , ﻻن ليس لدي القالب انت اربطه وجربه
تم تعديل هذه المشاركة بواسطة MuStafa - HaSsan في 30 أبريل 2013 في 23:21

الكل بيعمل على كل شئ!!
ياشباب حد ملتزم بالتعامل مع قاعدة البيانات ياريت ينهي كل مايتعلق بيها
والمسئول عن التلوين ياريت ينهي كل مايتعلق بيها
هذا ملف مساعد لهيكلية ملف app.py لتقوموا بإكماله بما يناسب ... قمت بتوحيد الكود
class DBMODEL:
....
....
....
def highlighted_code(self):
pass
def __str__(self):
return "(%d, %s, %s, %s, %s)"%(self.id, self.title, self.author, self.language, self.code)
def populate_fake():
p1=Paste(title='simple', author='jack', language='perl', code="$x=3")
p2=Paste(title='simple', author='ruby', language='ruby', code="x=3\nputs x")
p3=Paste(title='complex', author='ahmed', language='Python', code="add5=lambda x: x+5")
....
....
#COMPLETE ME TO INSERT DATA TO DATABASE
def last(x):
pass
last_five= lambda : last(5)
settings.init()
#DON'T TOUCH
#pygments
languages_list=[(l[1][0], l[0]) for l in get_all_lexers()] #tuples of long/short names
languages_list.sort(key = lambda el: el[0])
languages_list.insert(0,('YOU GUESS', ''))
##DONT TOUCH
@route('/public/<filepath:path>')
def server_static(filepath):
return static_file(filepath, root=settings.staticdir)
class PasteForm(Form):
title = TextField()
language=SelectField('Language', choices=languages_list)
author = TextField()
code = TextAreaField(validators=[validators.required()])
#created_at
#hits
#expires ?
@route("/about")
def about():
return template('templates/about.html')
@route("/contact")
def contact():
return template('templates/contact.html')
@error(404)
def error404(error):
return '404=NOTHING HERE, GO BACK!'
@route("/")
def index():
pass
@route('/new', method="POST")
def new():
pass
@route('/view/<n:int>')
def view(n):
pass
@route('/raw/<n:int>')
def raw(n):
pass
@route('/download/<n:int>')
def download(n):
pass
أعتقد هكذا سيكون الموضوع منظم أكثر
(map share people)
فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader
بفضل الله تعالى تم تلوين الكود بشكل جميل ومنسق
@route('/new', method="POST")
def style():
frm = NewPasteForm(request.POST)
formattedText =highlight(frm.codebody.data, PythonLexer(), HtmlFormatter())
if formattedText:
return template('templates/Language.html',form=frm,code=formattedText)
else:
return HtmlFormatter().get_style_defs('.highlight')And template
| |
*
{% extends 'base.html' %}
{% block content %}
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>untitled</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<style type ='text/css'>
.highlight .c { color: #586E75 } /* Comment */
.highlight .k { color: #859900 } /* Keyword */
.highlight .n { color: #93A1A1 } /* Name */
.highlight .cm { color: #586E75 } /* Comment.Multiline */
.highlight .nc { color: #268BD2 } /* Name.Class */
.highlight .ni { color: #CB4B16 } /* Name.Entity */
.highlight .ne { color: #CB4B16 } /* Name.Exception */
.highlight .nf { color: #268BD2 } /* Name.Function */
.highlight .nv { color: #268BD2 } /* Name.Variable */
.highlight .mf { color: #2AA198 } /* Literal.Number.Float */
.highlight .mh { color: #2AA198 } /* Literal.Number.Hex */
.highlight .mi { color: #2AA198 } /* Literal.Number.Integer */
.highlight .mo { color: #2AA198 } /* Literal.Number.Oct */
.highlight .sb { color: #586E75 } /* Literal.String.Backtick */
.highlight .sc { color: #2AA198 } /* Literal.String.Char */
.highlight .vc { color: #268BD2 } /* Name.Variable.Class */
.highlight .vg { color: #268BD2 } /* Name.Variable.Global */
</style>
</head>
<body>
<div class = 'highlight'>
<span class = 'pr'>print</span>
<span class = 'c'></span>
<span class ='k' ></span>
<span class = 'n'></span>
<span class = 'cm'></span>
<span class = 'nc'></span>
<span class = 'ni'></span>
<span class = 'ne'></span>
<span class = 'nf'></span>
<span class = 'nv'></span>
<span class = 'mf'></span>
<span class = 'mh'></span>
<span class = 'mi'></span>
<span class = 'mo'></span>
<span class = 'sb'></span>
<span class = 'sc'></span>
<span class = 'vc'></span>
<span class = 'vg'></span>
</div>
<hr>
<h1>BottlePaste</h1>
<hr>
<h3> {{form.codetitle.data}} by {{form.codeauthor.data}}</h3>
<div>
{{code}}
</div>
<form class="form-horizontal" action="/raw" method="post">
<div>
<h5>Plain Text Code <button type="submit" class="btn">raw</button></h5>
{{form.codebody()}}
</div>
</form>
</body>
</html>
{% endblock %}
كان بامكاني ان اجعله افتراضيا بدون css
ﻻكن لم اجد له مفهوم ﻻحد مكتبات pygments
from pygments.token import Keyword, Name, Comment, String, Error, \
Number, Operator, Genericلم اجد له شرح كافي لكي افهمه
تم تعديل هذه المشاركة بواسطة MuStafa - HaSsan في 1 مايو 2013 في 17:52

قاعدة البيانات
from sqlalchemy import create_engine
from sqlalchemy import Column , Date , Integer , String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
engine = create_engine('sqlite:///bottlepaste.db',echo=True)
Base = declarative_base()
Session = sessionmaker(bind=engine)
class DBMODEL(Base):
__tablename__ = 'pastes'
id = Column(Integer,primary_key=True)
title = Column(String)
author = Column(Date)
language = Column(String)
code = Column(String)
def highlighted_code(self):
lexer=None
if self.language:
try:
lexer=get_lexer_by_name(self.language)
except:
lexer=None
if lexer is None:
lexer=guess_lexer(self.code)
formatter=HtmlFormatter(linenos=True)
return highlight(self.code, lexer, formatter)
def __str__(self):
return "(%d, %s, %s, %s, %s)"%(self.id, self.title, self.author, self.language, self.code)
ثم في دالة new
@route('/new', method="POST")
def new():
frm = PasteForm(request.POST)
if not os.path.isfile('bottlepaste.db'):
Base.metadata.create_all(engine)
newPaste = DBMODEL (title=frm.codetitle.data,author=frm.codeauthor,language=frm.language.data,code=frm.codebody.data)
s=Session()
s.add(newPaste)
try:
s.commit()
except:
pass
عند s.commit يحدث خطأ غريب رغم اني فحصت قيم المتغيرات frm.codetitle وغيرها عن طريق type وكانت str
لا يتم التخزين في قاعدة البيانات
Traceback (most recent call last):
File "/usr/lib/python2.7/site-packages/bottle.py", line 764, in _handle
return route.call(**args)
File "/usr/lib/python2.7/site-packages/bottle.py", line 1575, in wrapper
rv = callback(*a, **ka)
File "app.py", line 108, in new
s.commit()
File "/usr/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 720, in commit
self.transaction.commit()
File "/usr/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 353, in commit
self._prepare_impl()
File "/usr/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 333, in _prepare_impl
self.session.flush()
File "/usr/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 1817, in flush
self._flush(objects)
File "/usr/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 1935, in _flush
transaction.rollback(_capture_exception=True)
File "/usr/lib/python2.7/site-packages/sqlalchemy/util/langhelpers.py", line 58, in __exit__
compat.reraise(exc_type, exc_value, exc_tb)
File "/usr/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 1899, in _flush
flush_context.execute()
File "/usr/lib/python2.7/site-packages/sqlalchemy/orm/unitofwork.py", line 372, in execute
rec.execute(self)
File "/usr/lib/python2.7/site-packages/sqlalchemy/orm/unitofwork.py", line 525, in execute
uow
File "/usr/lib/python2.7/site-packages/sqlalchemy/orm/persistence.py", line 63, in save_obj
table, insert)
File "/usr/lib/python2.7/site-packages/sqlalchemy/orm/persistence.py", line 565, in _emit_insert_statements
execute(statement, params)
File "/usr/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 662, in execute
params)
File "/usr/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 761, in _execute_clauseelement
compiled_sql, distilled_params
File "/usr/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 828, in _execute_context
None, None)
File "/usr/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1024, in _handle_dbapi_exception
exc_info
File "/usr/lib/python2.7/site-packages/sqlalchemy/util/compat.py", line 163, in raise_from_cause
reraise(type(exception), exception, tb=exc_tb)
File "/usr/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 824, in _execute_context
context = constructor(dialect, self, conn, *args)
File "/usr/lib/python2.7/site-packages/sqlalchemy/engine/default.py", line 459, in _init_compiled
param.append(processors[key](compiled_params[key]))
File "/usr/lib/python2.7/site-packages/sqlalchemy/dialects/sqlite/base.py", line 297, in process
raise TypeError("SQLite Date type only accepts Python "
StatementError: SQLite Date type only accepts Python date objects as input. (original cause: TypeError: SQLite Date type only accepts Python date objects as input.) 'INSERT INTO pastes (title, author, language, code) VALUES (?, ?, ?, ?)' [{'code': '', 'author': <wtforms.fields.simple.TextField object at 0x16cbf90>, 'language': u'YOU GUESS', 'title': ''}]
سؤال خطر علي بالي :
كيف سنجعل لكل عملية Paste رابط مميز ليشاركه المستخدم مع أصدقائه ؟؟
بالنسبة للتلوين أظن أن Pygments موجودة لهذا الغرض ولا نحتاج إلي CSS ..... أليس كذلك ؟
ماافكر فيه اﻻن ان نجعله يضيف رابط مختصر عند الضغط على الزر كما قال اﻻخ احمد
ﻻكن لا اعرف كيف افكر فيه

def highlighted_code(self): lexer=None if self.language: try: lexer=get_lexer_by_name(self.language) except: lexer=None if lexer is None: lexer=guess_lexer(self.code) formatter=HtmlFormatter(linenos=True) return highlight(self.code, lexer, formatter)
.highlight .c { color: #586E75 } /* Comment */
.highlight .k { color: #859900 } /* Keyword */
.highlight .n { color: #93A1A1 } /* Name */
.highlight .cm { color: #586E75 } /* Comment.Multiline */
.highlight .nc { color: #268BD2 } /* Name.Class */
.highlight .ni { color: #CB4B16 } /* Name.Entity */
.highlight .ne { color: #CB4B16 } /* Name.Exception */
.highlight .nf { color: #268BD2 } /* Name.Function */
.highlight .nv { color: #268BD2 } /* Name.Variable */
.highlight .mf { color: #2AA198 } /* Literal.Number.Float */
.highlight .mh { color: #2AA198 } /* Literal.Number.Hex */
.highlight .mi { color: #2AA198 } /* Literal.Number.Integer */
.highlight .mo { color: #2AA198 } /* Literal.Number.Oct */
.highlight .sb { color: #586E75 } /* Literal.String.Backtick */
.highlight .sc { color: #2AA198 } /* Literal.String.Char */
.highlight .vc { color: #268BD2 } /* Name.Variable.Class */
.highlight .vg { color: #268BD2 } /* Name.Variable.Global */
StatementError: SQLite Date type only accepts Python date objects as input. (original cause: TypeError: SQLite Date type only accepts Python date objects as input.) 'INSERT INTO pastes (title, author, language, code) VALUES (?, ?, ?, ?)' [{'code': '', 'author': <wtforms.fields.simple.TextField object at 0x16cbf90>, 'language': u'YOU GUESS', 'title': ''}]newPaste = DBMODEL (title=frm.codetitle.data,author=frm.codeauthor.data,language=frm.language.data,code=frm.codebody.data)
اقتباسكيف سنجعل لكل عملية Paste رابط مميز ليشاركه المستخدم مع أصدقائه ؟؟
اقتباسبالنسبة للتلوين أظن أن Pygments موجودة لهذا الغرض ولا نحتاج إلي CSS ..... أليس كذلك ؟
اقتباسماافكر فيه اﻻن ان نجعله يضيف رابط مختصر عند الضغط على الزر كما قال اﻻخ احمد
(map share people)
فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader
ان شاء الله يتم ماقلته استاذ احمد
,
اﻻن تم انهاء التلوين مالواجب علي فعله اﻻن
تم تعديل هذه المشاركة بواسطة MuStafa - HaSsan في 1 مايو 2013 في 22:42

تمام التلوين يعمل بعض اﻷضافة لملف style.css
تم تعديل هذه المشاركة بواسطة a.atalla في 2 مايو 2013 في 09:30
قاعدة البيانات تمام :), TYPO
مرفق السورس وتم عمل أول push للمستودع
عذرا نسيت إضافة حقل للتاريخ في النسخة المرفوعة
تم تعديل هذه المشاركة بواسطة a.atalla في 2 مايو 2013 في 10:37
جيد باستطاعتنا ان نعمل sidebar
ﻻكن هناك مشكلة
يجب علينا ان نعمل اضافة الروابط ومن ثم ناتي ﻻضافة السايد بار
؟؟؟

الرابط /new دائما يحتوي علي الكود الملون هل يمكن تكوين رابط فريد من title والتحويل إليه
يوجد في ملف base.html قسم خاص لل sidebar
<div class="span2">
<!--sidebar-->
{%if last5 %}
<hr />
<h3>Last pastes</h3>
<hr />
<ul>
{% for p in last5 %}
<li class="paste-link"><a href="/view/{{p.id}}">{{p.title or 'UNTITLED'}}</a></li>
{% endfor %}
</ul>
{% endif %}
</div>كل ماعليك هو وضع متغير بإسم last5 وتمريره إلى ال template الذي تريد
اقتباس
الرابط /new دائما يحتوي علي الكود الملون هل يمكن تكوين رابط فريد من title والتحويل إليه
ماذا تقصد ؟
ضع في بالك أن الحقل title هو حقل إختياري
تم تعديل هذه المشاركة بواسطة ahmed_youssef في 2 مايو 2013 في 14:07
(map share people)
فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader
<li class="paste-link"><a href="/view/{{p.id}}">{{p.title or 'UNTITLED'}}</a></li>
لم افهم هذا السطر , ﻻ يوجد ملف باسم view
ولدي سؤال اخر مع اي دالة اكتبه هذا المتغير ومالذي سوف يحتوي ؟
تم تعديل هذه المشاركة بواسطة MuStafa - HaSsan في 2 مايو 2013 في 16:54

هذا في دالة index مثلا
@route("/")
def index():
last5=last_five_public()
title="New paste"
form= PasteForm()
return template('templates/new.html', locals())(map share people)
فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader
نعم عرفت ﻻكن فقط مالذي سوف يحتوي متغير last5
تم تعديل هذه المشاركة بواسطة MuStafa - HaSsan في 2 مايو 2013 في 17:38
