import re import os import sys import difflib from gluon.contrib.markdown import WIKI RECORD_HISTORY = True ALWAYS_RELOAD_DOCSTRING = False created_by=Field('created_by',db.auth_user, default=auth.user_id, update=auth.user_id, readable=True,writable=False) created_on=Field('created_on','datetime', default=request.now, update=request.now, readable=True,writable=False) active=Field('active','boolean',default=True) diff=Field('diff','text',default='',readable=False,writable=False) changelog=Field('changelog') db.define_table('section', Field('chapter_number','integer'), Field('section_number','integer'), Field('title'), Field('content','text'), diff,created_by,created_on,active,changelog, format='%(title)s') db.define_table('wikipage', Field('section',db.section), Field('title', requires=(IS_NOT_EMPTY(), IS_NOT_IN_DB(db,'wikipage.title'))), Field('slug',readable=False,writable=False), Field('content','text'), diff,created_by,created_on,active,changelog, format='%(title)s') db.define_table('docstring', Field('title',requires=IS_MATCH('^[\w\.-]$')), Field('content','text'), diff,created_by,created_on,active,changelog, format='%(title)s') db.define_table('document', Field('title', requires=(IS_NOT_EMPTY(), IS_NOT_IN_DB(db,'document.title'))), Field('file','upload',requires=IS_NOT_EMPTY()), created_by,created_on, format='%(title)s') if RECORD_HISTORY: for tablename in ['section','wikipage','docstring']: db.define_table(tablename+'_history',Field(tablename,db[tablename]),db[tablename]) def clone(table,old_record): cache.ram.clear() if RECORD_HISTORY and old_record: row = {} for field in table.fields: if field in old_record: row[field if field!='id' else table._tablename]=old_record[field] db['%s_history'%table].insert(**row) def differ(table,form): new_record = form.vars old_record = form.record if old_record: d1 = list(difflib.Differ().compare(old_record.content.split('\n'), new_record.content.split('\n'))) new_record.diff = '\n'.join([x for x in d1 if x[:1] in ['+','-']]) # db(db.section.chapter_number==0).update(content=open(os.path.join(request.folder,'private/preface.txt'),'r').read()) # db(db.auth_user.id>0).update(registration_key='') if not db(db.section.id>0).select(): db.auth_user.insert(first_name='Massimo',last_name='Di Pierro', email='mdipierro@cs.depaul.edu', password=db.auth_user.password.requires[0]('test')[0], registration_key='') db.section.created_by.default = 1 db.section.insert(title = 'Preface to web edition', chapter_number=0,section_number=0,content=open(os.path.join(request.folder,'private/preface.txt'),'r').read()) for i in range(1,2): data = open(os.path.join(request.folder,'private','chap%i.tek' % i),'r').read() title = data.split('\n',1)[0][1:].strip() for k,section in enumerate(data.split('\n## ')): if k==0: section=('# %i. ' % (i,)) +section[2:] title = section.split('\n',1)[0][2:] else: section=('## %i.%i. ' % (i,k)) +section title = section.split('\n',1)[0][3:] db.section.insert(title = title, content=section, chapter_number=i,section_number=k) toc = db(db.section.active==True).select(db.section.chapter_number, db.section.section_number, db.section.title, orderby=db.section.chapter_number|\ db.section.section_number, cache=(cache.ram,3600)) def wiki(text): ### fix internal references text = re.sub('\]\(book_image/(?P.*?)\)','](/%s/static/book_image/\g)' \ % request.application,text) text = re.sub('\]\(document/(?P.*?)\)','](/%s/default/download/\g)' \ % request.application,text) text = re.sub('\]\(section/(?P.*?)\)','](/%s/default/section/\g)' \ % request.application,text) text = re.sub('\]\(docstring/(?P.*?)\)','](/%s/default/docstring/\g)' \ % request.application,text) text = re.sub('\]\(wikipage/(?P.*?)\)','](/%s/default/wikipage/\g)' \ % request.application,text) ### ability to interpret some reST syntax text = re.compile('^[ ]*:(?P.+?):(?![\w-])',re.M).sub('* **\g:**',text) text = re.sub('::(?P\s+)',':\g',text) t = WIKI(text).xml() # syntax highlight the code r = re.compile('
\s*(?P.*?)\s*
',re.S) while True: m = r.search(t) if not m: break link = URL(r=request,f='docstring') t = t[:m.start()]+CODE(m.group('code').replace('<','<').replace('>','>').strip(), language='web2py',link=link).xml()+t[m.end():] return XML(t) def tt(d): try: dt = request.now - d except: return '' if dt.days>=365*2: return '%s years ago' % int(dt.days/365) elif dt.days>=365: return '1 years ago' elif dt.days>=60: return '%s months ago' % int(dt.days/30) elif dt.days>21: return '1 months ago' elif dt.days>=14: return '%s weeks ago' % int(dt.days/7) elif dt.days>=7: return '1 week ago' elif dt.days>=2: return '%s days ago' % int(dt.days) elif dt.days==1: return '1 day ago' else: return 'today' def logformat(record): try: return "created by %s %s" % (record.created_by.nickname, tt(record.created_on)) except: return "created by %s on %s" % (record.created_by, record.created_on)