Martín Mulone avatar Martín Mulone committed 621e928

Welcome Staticblog to bitbucket, have a nice day!.

Comments (0)

Files changed (37)

controllers/default.py

 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
+import os, glob
+from gluon.template import render
 from highlight import PluginHighlight
 
+session.forget()
+
+POSTS_PER_PAGE = 5
+
+
+def splitter(x):
+    a,b = x.split(':',1)
+    return a.strip(),b.strip()
+
+
+@cache('folders',None)
+def get_folders():
+    folder = os.path.join(request.folder,'source_blog')
+    return folder, [f for f in os.listdir(folder)
+                    if os.path.isdir(os.path.join(folder,f))]
+FOLDER, FOLDERS = get_folders()
+
+
+def get_subfolder(post_id):
+    if not post_id:
+        redirect(URL('index'))
+    for f in FOLDERS:
+        if f.startswith(post_id):
+            return f
+    redirect(URL('index'))
+
+
+def get_info(subfolder):
+    infofile = os.path.join(FOLDER, subfolder, 'info.txt')
+    if os.path.exists(infofile):
+        info = dict(splitter(line)
+        for line in open(infofile).readlines()
+        if ':' in line)
+        return info
+    return {}
+
+highlight = PluginHighlight().install()  #We need plugin highlight installed
+
+def convert2html(book_id,text):
+    extra = {}
+    def url2(*a,**b):
+        b['args'] = [book_id]+b.get('args',[])
+        return URL(*a,**b)
+    def truncate(x): return x[:70]+'...' if len(x)>70 else x
+
+    extra = highlight.extra
+    extra['verbatim'] = lambda code: cgi.escape(code)
+    extra['cite'] = lambda key: TAG.sup(
+        '[',A(key,_href=URL('reference',args=(book_id,key)),
+            _target='_blank'),']').xml()
+    extra['inxx'] = lambda code: '<div class="inxx">'+code+'</div>'
+    extra['ref'] = lambda code: '[ref:'+code+']'
+    # extra['code'] = lambda code: CODE(code,language='web2py').xml()
+    rtn = MARKMIN(text.replace('\r',''),extra=extra,url=url2)
+    return rtn
+
 
 def index():
-    """ Default Index """
 
-    response.flash = 'Well done!. You successfully read this important alert message.'
+    def read_extract(post_id):
+        subfolder = get_subfolder(post_id)
+        filename = os.path.join(FOLDER, subfolder, 'extract.markmin')
+        if os.path.isfile(filename):
+            content = open(filename).read()
+            content = convert2html(post_id,content).xml()
+            content = XML(content)
+        else:
+            content = ""
+        return content
 
-    return dict()
+    try:
+        page = int(request.args(0))
+    except:
+        page = 1
 
+    posts = {}
+    for subfolder in FOLDERS:
+        posts[subfolder] = get_info(subfolder)
 
-def getting():
-    """This is the documentation"""
+    count_posts = len(FOLDERS)
+    lmda = page * POSTS_PER_PAGE - count_posts
+    if lmda > POSTS_PER_PAGE:
+        raise HTTP(400, 'Invalid page number')
 
-    PluginHighlight().install()
+    dest = os.path.join(request.folder, 'static_blog', 'posts-%s.html' % page)
+    if not os.path.isfile(dest):
+        filename = os.path.join(request.folder, 'views', 'posts.html')
+        view_template = open(filename).read()
+        content = render(view_template , context = locals())
+        open(dest, 'w').write(content)
+        content = XML(content)
+    else:
+        content = XML(open(dest).read())
 
-    return dict()
+    return dict(content=content)
 
 
-def user():
-    """
-    exposes:
-    http://..../[app]/default/user/login
-    http://..../[app]/default/user/logout
-    http://..../[app]/default/user/register
-    http://..../[app]/default/user/profile
-    http://..../[app]/default/user/retrieve_password
-    http://..../[app]/default/user/change_password
-    use @auth.requires_login()
-        @auth.requires_membership('group name')
-        @auth.requires_permission('read','table name',record_id)
-    to decorate functions that need access control
-    """
-    if request.args(0) in  ['login']:
-        response.view = 'default/user_login.html'
-    elif request.args(0) in  ['register']:
-        response.view = 'default/user_register.html'
-    elif request.args(0) in  ['profile']:
-        response.view = 'default/user_profile.html'
-    elif request.args(0) in  ['request_reset_password']:
-        response.view = 'default/user_request_reset_password.html'
+def post():
+    post_id=str(request.args(0)).split('-')[0]
+    subfolder = get_subfolder(post_id)
+    info = cache.ram('info_%s' % subfolder, lambda: get_info(subfolder), time_expire=60*60*24)
+    filename = os.path.join(FOLDER, subfolder, 'post.markmin')
+    dest = os.path.join(request.folder, 'static_blog', 'post-%s.html' % post_id)
 
-    return dict(form=auth())
+    disqus_site = app_settings.disqus_site
+    disqus_dev = app_settings.disqus_dev
 
+    if not os.path.isfile(dest):
+        content = open(filename).read()
+        content = convert2html(post_id,content).xml()
+        #if not os.path.exists(os.path.dirname(dest)):
+        #    os.makedirs(os.path.dirname(dest))
+        open(dest, 'w').write(content)
+        content = XML(content)
+        return locals()
+    else:
+        content = XML(open(dest).read())
+        return locals()
 
-def download():
-    """
-    allows downloading of uploaded files
-    http://..../[app]/default/download/[filename]
-    """
-    return response.download(request,db)
+
+def image():
+    post_id = request.args(0)
+    key = request.args(1)
+    subfolder = get_subfolder(post_id)
+    filename = os.path.join(FOLDER, subfolder, 'images', key)
+    if not os.path.isfile(filename):
+        raise HTTP(404)
+    return response.stream(open(filename,'r'))
+
+
+def reference():
+    post_id = request.args(0)
+    key = request.args(1)
+    subfolder = get_subfolder(post_id)
+    filename = os.path.join(FOLDER, subfolder, 'references', key)
+    if not os.path.isfile(filename):
+        raise HTTP(404)
+    info = dict(splitter(line)
+    for line in open(filename).readlines()
+    if ':' in line)
+    if info['source_url']:
+        redirect(info['source_url'])
+    else:
+        return repr(info)
Add a comment to this file

databases/storage.sqlite

Binary file removed.

 'Editing file': 'Editando archivo',
 'Editing file "%s"': 'Editando archivo "%s"',
 'Email and SMS': 'Email and SMS',
+'enter a valid email address': 'enter a valid email address',
+'enter a value': 'enter a value',
 'enter an integer between %(min)g and %(max)g': 'enter an integer between %(min)g and %(max)g',
 'Error logs for "%(app)s"': 'Bitácora de errores en "%(app)s"',
 'errors': 'errores',
 'User ID': 'ID de Usuario',
 'Username': 'Username',
 'value already in database or empty': 'value already in database or empty',
+'value not allowed': 'value not allowed',
 'Verify Password': 'Verify Password',
 'versioning': 'versiones',
 'Videos': 'Videos',
 # -*- coding: utf-8 -*-
 
 from gluon.storage import Storage
-from gluon.tools import Auth, Recaptcha
-from gluon.tools import Mail
-from gluon.tools import Crud
-from gluon.tools import Service
-from gluon.contrib.login_methods.rpx_account import use_janrain
 from bootstrap import authbar_bootstrap, BootstrapNavBar
 
 
 APP SETTINGS START
 """
 app_settings = Storage()
-app_settings.migrate = True
-app_settings.db_uri = 'sqlite://storage.sqlite'
-app_settings.title = 'Project Name'
+app_settings.title = 'Martin Mulone - Web developer and software designer'
 app_settings.subtitle = 'powered by web2py'
 app_settings.author = 'Martin Mulone'
 app_settings.author_email = 'mulone.martin@gmail.com'
-app_settings.keywords = 'Bootstrap'
+app_settings.keywords = 'Martin Mulone, Python, Programming, HTML 5, Photography, Coding, Web2py'
 app_settings.generator = 'Web2py Framework'
 app_settings.copyright = 'Copyright 2012'
-app_settings.description = 'Bootstrap 2.04'
+app_settings.description = 'My projects'
 
-app_settings.email_server = 'logging'  # localhost
-app_settings.email_sender = 'you@example.com'
-app_settings.email_login = None  # "username:password" or None
+app_settings.disqus_site = 'username'
+app_settings.disqus_dev = '1' # Put to 0 in production
 
-"""
- REGISTER_METHOD:
- ----------------
- 'Disabled' : Nobody can register
- 'Verification': Verification here mean: mail verification
- 'Approval': Approval need an admin approval
- 'Recaptcha': Recaptcha verify that is not a bot?
- 'Janrain': Recaptcha verify that is not a bot?
- 'None': No verification, never use in production
-"""
-app_settings.register_method = 'None'
 
-"""
- Recaptcha settings
-"""
-app_settings.recaptcha_public_key = 'PUBLIC_KEY'
-app_settings.recaptcha_private_key = 'PRIVATE_KEY'
+
 
 """
 APP SETTINGS END
 response.metanames['keywords'] = app_settings.keywords
 response.metanames['generator'] = app_settings.generator
 
-app_settings.verify_email = 'Click on the link http://'+request.env.http_host+\
-                                 URL(r=request,c='default',f='user',args=['verify_email'])+\
-                                 '/%(key)s to verify your email'
-app_settings.reset_password = 'Click on the link http://'+request.env.http_host+\
-                                   URL(r=request,c='default',f='user',args=['reset_password'])+\
-                                   '/%(key)s to reset your password'
-
-db = DAL(app_settings.db_uri)
 
 def render_metanames():
     """ Render Metanames """
             };
         ''')
 
-def init_mail():
-    """ Init Mail """
-
-    mail = Mail()  # mailer
-    mail.settings.server = app_settings.email_server or\
-                           'smtp.gmail.com:587'  # your SMTP server
-    mail.settings.sender = app_settings.email_sender  # your email
-    mail.settings.login = app_settings.email_login  # your credentials
-
-    return mail
-
-def init_auth():
-    """ Auth """
-
-    auth = Auth(db, hmac_key=Auth.get_or_create_key())
-
-    #If I use janrain to login, disable register.
-    if app_settings.register_method in ['Disabled', 'Janrain']:
-        # disable register
-        auth.settings.actions_disabled.append('register')
-
-    # If I use Recaptcha to register.
-    if app_settings.register_method in ['Recaptcha']:
-        auth.settings.captcha = Recaptcha(request,
-            app_settings.recaptcha_public_key,
-            app_settings.recaptcha_private_key)
-
-    # creates all needed tables
-    auth.define_tables(username=True, migrate=app_settings.migrate)
-    auth.settings.mailer = mail  # for user email verification
-
-    if app_settings.register_method in ['None', 'Recaptcha', 'Approval']:
-        auth.settings.registration_requires_verification = False
-    else:
-        auth.settings.registration_requires_verification = True
-
-    if app_settings.register_method in ['Approval']:
-        auth.settings.registration_requires_approval = True
-    else:
-        auth.settings.registration_requires_approval = False
-
-    auth.settings.reset_password_requires_verification = True
-
-    if app_settings.register_method in ['Janrain']:
-        ## if you need to use OpenID, Facebook, MySpace, Twitter, Linkedin, etc.
-        ## register with janrain.com, write your domain:api_key in private/janrain.key
-        use_janrain(auth,filename='private/janrain.key')
-
-    auth.messages.verify_email = app_settings.verify_email
-    auth.messages.reset_password = app_settings.reset_password
-
-    return auth
 
 # by default give a view/generic.extension to all actions from localhost
 # none otherwise. a pattern can be 'controller/function.extension'
 response.generic_patterns = ['*'] if request.is_local else []
 
-mail = init_mail()
-auth = init_auth()
-crud = Crud(db)
-crud.settings.auth = None  # =auth to enforce authorization on crud
-service = Service()
-
-#########################################################################
-## Define your tables below (or better in another model file) for example
-##
-## >>> db.define_table('mytable',Field('myfield','string'))
-##
-## Fields can be 'string','text','password','integer','double','boolean'
-##       'date','time','datetime','blob','upload', 'reference TABLENAME'
-## There is an implicit 'id integer autoincrement' field
-## Consult manual for more options, validators, etc.
-##
-## More API examples for controllers:
-##
-## >>> db.mytable.insert(myfield='value')
-## >>> rows=db(db.mytable.myfield=='value').select(db.mytable.ALL)
-## >>> for row in rows: print row.id, row.myfield
-#########################################################################
-
-
 #########################################################################
 ## Define your menu
 #########################################################################
 def _menu():
 
     skeleton = [
-        ('Home', URL('default', 'index')),
-        ('Get started', URL('default', 'getting')),
-        ('Bootstrap', '', [
-            ('Home', 'http://twitter.github.com/bootstrap/index.html'),
-            ('Getting started', 'http://twitter.github.com/bootstrap/getting-started.html'),
-            ('Scattfolding', 'http://twitter.github.com/bootstrap/scaffolding.html'),
-            ('Base Css', 'http://twitter.github.com/bootstrap/base-css.html'),
-            ('Components', 'http://twitter.github.com/bootstrap/components.html'),
-            ('Javascript', 'http://twitter.github.com/bootstrap/javascript.html')
-        ]),
-        ('Test', '', [
-            ('Multilevel', '',[
-                ('Multilevel Child', ''),
-                ('Multilevel Child II', '')
-            ])
-        ])
+        ('Back to my site', 'http://www.martinmulone.com.ar/')
     ]
 
     response.menu = BootstrapNavBar(skeleton)
 
 _menu()  #Call to create menu
-
-
-

modules/highlight.py

 class PluginHighlight(object):
     """ http://softwaremaniacs.org/soft/highlight/en/    """
 
-    def __init__(self):
+    def __init__(self, extra=None):
 
-        self.extra = {}
+        if not extra:
+            self.extra = {}
+        else:
+            self.extra = extra
         self.extra_blocks()
 
     def extra_blocks(self):

source_blog/001-My-second-post/extract.markmin

+``web2py`` was launched in 2007 and now, after four years of continuous development, we have reached a very much needed fourth edition of this book. During this time, ``web2py`` has managed to win the affection of thousands of knowledgeable users and more than one hundred developers. Our collective effort has created one of the most full-featured Open Source Web Frameworks in existence.
Add a comment to this file

source_blog/001-My-second-post/images/index

Empty file added.

source_blog/001-My-second-post/info.txt

+title: My first post
+created_on: 2011-12-18 23:00:51
+tags: web2py
+published: True
+authors: Martin
+modified_on: 2012-06-12 14:15:18

source_blog/001-My-second-post/post.markmin

+``web2py`` was launched in 2007 and now, after four years of continuous development, we have reached a very much needed fourth edition of this book. During this time, ``web2py`` has managed to win the affection of thousands of knowledgeable users and more than one hundred developers. Our collective effort has created one of the most full-featured Open Source Web Frameworks in existence.
+
+I originally started ``web2py`` as a teaching tool because, I believe, the ability to build high quality web applications is of critical importance for the growth of a free and open society. It prevents the biggest players from monopolizing the flow of information. This motivation continues to be valid and it is even more important today.
+
+In general, the purpose of any web framework is to make web development easier, faster and prevent developers from making mistakes, especially in matters related to security. In ``web2py`` we address these issues with our three main goals:
+
+''Ease of use'' is the primary goal for ``web2py``. For us, this means reducing the learning and deployment time. This is why ``web2py`` is a full-stack framework without dependencies. It requires no installation and has no configuration files. Everything works ''out of the box'', including a web server, database and a web-based IDE that gives access to all the main features. The API includes just 12 core objects, which are easy to work with and memorize. It can interoperate with most web servers, database and all Python libraries.
+
+''Faster'' development is the secondary goal. Every function of ``web2py`` has a default behavior (which can be overridden).  For example, as soon as you have specified your data models, you will have access to a web-based database administration panel. ``web2py`` also generates automatically forms for your data and it allows you to easily expose the data in HTML, XML, JSON, RSS, etc.
+
+''Security'' is at the heart of ``web2py``, and our goal here is to lock everything down to keep your systems and data safe. Therefore, our database layer eliminates SQL Injections. The template language prevents Cross Site Scripting vulnerabilities. The forms generated by ``web2py`` provide field validation and block Cross Site Request Forgeries. Passwords are always stored hashed. Sessions are stored server-side by default to prevent Cookie Tampering and session cookies are uuid to prevent Cookie Stealing.
+
+``web2py`` has always been built from the user perspective and is constantly optimized internally to become faster and leaner, whilst always maintaining ''backward compatibility''.
+
+``web2py`` is free for you to use. If you benefit from it, we hope you will feel a little more like contributing back to society in whatever form you choose.
+
+In 2011 InfoWorld magazine reviewed six of the most popular full-stack Python based web frameworks and ranked web2py highest. Also in 2011, web2py won the Bossie Award for best Open Source Development Software.
+
+
Add a comment to this file

source_blog/001-My-second-post/references/index

Empty file added.

source_blog/002-My-first-post/extract.markmin

+``web2py`` was launched in 2007 and now, after four years of continuous development, we have reached a very much needed fourth edition of this book. During this time, ``web2py`` has managed to win the affection of thousands of knowledgeable users and more than one hundred developers. Our collective effort has created one of the most full-featured Open Source Web Frameworks in existence.
+
+``
+db = DAL('sqlite://storage.sqlite')
+db.define_table('contact',
+   Field('name'),
+   Field('phone'))
+``:python
+
Add a comment to this file

source_blog/002-My-first-post/images/index

Empty file added.

source_blog/002-My-first-post/info.txt

+title: My second post
+created_on: 2011-12-18 23:00:51
+tags: web2py
+published: True
+authors: Martin
+modified_on: 2012-06-12 14:15:18

source_blog/002-My-first-post/post.markmin

+``web2py`` was launched in 2007 and now, after four years of continuous development, we have reached a very much needed fourth edition of this book. During this time, ``web2py`` has managed to win the affection of thousands of knowledgeable users and more than one hundred developers. Our collective effort has created one of the most full-featured Open Source Web Frameworks in existence.
+
+I originally started ``web2py`` as a teaching tool because, I believe, the ability to build high quality web applications is of critical importance for the growth of a free and open society. It prevents the biggest players from monopolizing the flow of information. This motivation continues to be valid and it is even more important today.
+
+In general, the purpose of any web framework is to make web development easier, faster and prevent developers from making mistakes, especially in matters related to security. In ``web2py`` we address these issues with our three main goals:
+
+''Ease of use'' is the primary goal for ``web2py``. For us, this means reducing the learning and deployment time. This is why ``web2py`` is a full-stack framework without dependencies. It requires no installation and has no configuration files. Everything works ''out of the box'', including a web server, database and a web-based IDE that gives access to all the main features. The API includes just 12 core objects, which are easy to work with and memorize. It can interoperate with most web servers, database and all Python libraries.
+
+''Faster'' development is the secondary goal. Every function of ``web2py`` has a default behavior (which can be overridden).  For example, as soon as you have specified your data models, you will have access to a web-based database administration panel. ``web2py`` also generates automatically forms for your data and it allows you to easily expose the data in HTML, XML, JSON, RSS, etc.
+
+''Security'' is at the heart of ``web2py``, and our goal here is to lock everything down to keep your systems and data safe. Therefore, our database layer eliminates SQL Injections. The template language prevents Cross Site Scripting vulnerabilities. The forms generated by ``web2py`` provide field validation and block Cross Site Request Forgeries. Passwords are always stored hashed. Sessions are stored server-side by default to prevent Cookie Tampering and session cookies are uuid to prevent Cookie Stealing.
+
+``web2py`` has always been built from the user perspective and is constantly optimized internally to become faster and leaner, whilst always maintaining ''backward compatibility''.
+
+``web2py`` is free for you to use. If you benefit from it, we hope you will feel a little more like contributing back to society in whatever form you choose.
+
+In 2011 InfoWorld magazine reviewed six of the most popular full-stack Python based web frameworks and ranked web2py highest. Also in 2011, web2py won the Bossie Award for best Open Source Development Software.
+
+
Add a comment to this file

source_blog/002-My-first-post/references/index

Empty file added.

static/css/layout.css

  */
 /* Override some defaults */
 
+body {
+    background: url("../images/renzler.gif") repeat scroll 0 0 transparent;
+
+}
+.container-center {
+    background-color: #fff; padding: 15px;
+    border:1px solid #2a9bff;
+    border-radius:10px;
+    -moz-border-radius:10px;
+    -webkit-border-radius:10px;
+}
+.widget-front {
+    display: block;
+    line-height: 20px;
+    padding: 12px;}
+
 /* Web2py */
 td.w2p_fl, td.w2p_fw, td.w2p_fc { vertical-align:top; }
 td.w2p_fl { text-align:right; }
 td.w2p_fl,  td.w2p_fw {padding-right: 7px;}
 
-footer {padding-top: 10px; border-top: 1px solid #ddd; margin-bottom: 40px;}
+footer {padding-top: 10px; margin-top: 20px; border-top: 4px solid #ddd; margin-bottom: 40px; color: #919191;}
 .flash {
     display: none;
     position: fixed;
     margin-top: -18px;}
 .flash.alert {margin-bottom: 10px !important;}
 div.error { color: #ec6f5a;}
+
+
+
+
+/* #Instant Press widgets
+================================================== */
+.post_meta,
+.post_metabottom {font-size: 0.9em;}
+.post_metabottom {border-top: 1px solid #ddd;}
+.post_description {
+    margin: 15px 0px 20px 0px;
+}
+.post_extract {
+    background-color: #f1f1f1;
+    border-radius:5px;
+    -moz-border-radius:5px;
+    -webkit-border-radius:5px;
+    margin: 10px 20px 40px 20px;
+    padding: 5px 26px 15px 26px;
+}
+.i2p_post {margin: 10px 20px 40px 20px;
+    padding: 5px 26px 15px 26px;}
+.post_title {
+    color: #555;
+}
+.post_title a {
+    color: #555;
+}
+.post_title h3 {line-height: 30px;}
+
+
Add a comment to this file

static/images/bit-tile-blue.gif

Added
New image
Add a comment to this file

static/images/cabin.gif

Added
New image
Add a comment to this file

static/images/dark-tile.gif

Added
New image
Add a comment to this file

static/images/facebook32.png

Added
New image
Add a comment to this file

static/images/light-tile.gif

Added
New image
Add a comment to this file

static/images/maleuser.png

Added
New image
Add a comment to this file

static/images/renzler.gif

Added
New image
Add a comment to this file

static/images/twitter.png

Added
New image
Add a comment to this file

static/images/users.png

Removed
Old image
Add a comment to this file

static/images/waves.gif

Added
New image

Empty file added.

views/default/getting.html

-{{extend 'layout.html'}}
-
-
-<ul class="breadcrumb">
-    <li class="active">Getting started</li>
-</ul>
-
-<span class="label label-important">Important!. This is Beta</span>
-        
-<h1>Getting started</h1>
-
-        <p>
-            This is an scatfolding application based on popular layout 'twitter bootstrap'. This application has
-            my own modification, preserving common functions of web2py welcome.
-        </p>
-
-<h2>Features</h2>
-        <ul>
-            <li>Based on twitter bootstrap layout, preserving all by default. Some little css hacks you can see in 'static/css/layout.css'</li>
-            <li>Rule One-model: faster clean code. It's only have 1 model "00main.py".</li>
-            <li>Clean views. Take a look to "views/index.html" only 4 lines.</li>
-            <li>Based on responsive layout, work on differents screens</li>
-        </ul>
-
-<h2>Download</h2>
-        <p>You can download from <a href="https://bitbucket.org/mulonemartin/bootstrap">bitbucket</a></p>
-
-<h2>Contact</h2>
-        <p>I'm Martin Mulone you can contact me by <a href="mailto: mulone.martin@gmail.com">mail</a>
-        </p>
-
-<h2>Application structure</h2>
-<p>Some important files</p>
-<pre class="prettyprint"><span class="pln">  bootstrap</span><span class="pun">/</span><span class="pln">
-  </span><span class="pun">├──</span><span class="pln"> controllers</span><span class="pun">/</span><span class="pln"> </span>
-    <span class="pun">│</span><span class="pln">   </span><span class="pun">├──</span><span class="pln"> appadmin.py</span>
-    <span class="pun">│</span><span class="pln">   </span><span class="pun">├──</span><span class="pln"> default.py</span>
-    <span class="pun">├──</span><span class="pln"> models</span><span class="pun">/</span><span class="pln"> </span>
-    <span class="pun">│</span><span class="pln">   </span><span class="pun">├──</span><span class="pln"> 00main.py</span>
-    <span class="pun">├──</span><span class="pln"> modules</span><span class="pun">/</span><span class="pln"> </span>
-    <span class="pun">│</span><span class="pln">   </span><span class="pun">├──</span><span class="pln"> bootstrap.py</span>
-    <span class="pun">│</span><span class="pln">   </span><span class="pun">├──</span><span class="pln"> highlight.py</span>
-    <span class="pun">│</span><span class="pln">   </span><span class="pun">├──</span><span class="pln"> navigation.py</span>
-    <span class="pun">├──</span><span class="pln"> static</span><span class="pun">/</span><span class="pln"> </span>
-    <span class="pun">│</span><span class="pln">   </span><span class="pun">├──</span><span class="pln"> css / layout.css</span>
-    <span class="pun">├──</span><span class="pln"> views</span><span class="pun">/</span><span class="pln"> </span>
-    <span class="pun">│</span><span class="pln">   </span><span class="pun">├──</span><span class="pln"> layout.html</span>
-    <span class="pun">│</span><span class="pln">   </span><span class="pun">├──</span><span class="pln"> default/index.html</span>
-</pre>
-
-        <br />
-        <br />
-
-
-
-
-<h1>Examples</h1>
-
-<h2>Menu dropdown</h2>
-<p>Allow multilevel dropdown items. Some example in model:</p>
-<pre><code class="python">
-    #########################################################################
-    ## Define your menu
-    #########################################################################
-
-    def _menu():
-
-        skeleton = [
-            ('Home', URL('default', 'index')),
-            ('Get started', URL('default', 'getting')),
-            ('Bootstrap', '', [
-                ('Home', 'http://twitter.github.com/bootstrap/index.html'),
-                ('Getting started', 'http://twitter.github.com/bootstrap/getting-started.html'),
-                ('Scattfolding', 'http://twitter.github.com/bootstrap/scaffolding.html'),
-                ('Base Css', 'http://twitter.github.com/bootstrap/base-css.html'),
-                ('Components', 'http://twitter.github.com/bootstrap/components.html'),
-                ('Javascript', 'http://twitter.github.com/bootstrap/javascript.html')
-            ]),
-            ('Test', '', [
-                ('Multilevel', '',[
-                    ('Multilevel Child', ''),
-                    ('Multilevel Child II', '')
-            ])
-            ])
-        ]
-
-        response.menu = BootstrapNavBar(skeleton)
-
-    _menu()  #Call to create menu
-
-</code></pre>
-<br />
-
-<h2>Highlight JS plugin</h2>
-<p>Highlight your source code with this plugin.</p>
-<pre><code class="python">
-    from highlight import PluginHighlight
-    def getting():
-        """This is the documentation"""
-
-        PluginHighlight().install()
-        mycode = PRE(CODE('print "hello world!"', _class="python"))
-        return dict(mycode=mycode)
-</code></pre>
-<br />
-
-<h2>Application settings</h2>
-<p>Change your settings in models/00main.py</p>
-<pre><code class="python">
-    """
-    APP SETTINGS START
-    """
-    app_settings = Storage()
-    app_settings.migrate = True
-    app_settings.db_uri = 'sqlite://storage.sqlite'
-    app_settings.title = 'Project Name'
-    app_settings.subtitle = 'powered by web2py'
-    app_settings.author = 'Martin Mulone'
-    app_settings.author_email = 'mulone.martin@gmail.com'
-    app_settings.keywords = 'Bootstrap'
-    app_settings.generator = 'Web2py Framework'
-    app_settings.copyright = 'Copyright 2012'
-    app_settings.description = 'Bootstrap 2.04'
-
-    app_settings.email_server = 'logging'  # localhost
-    app_settings.email_sender = 'you@example.com'
-    app_settings.email_login = None  # "username:password" or None
-
-    """
-    REGISTER_METHOD:
-    ----------------
-    'Disabled' : Nobody can register
-    'Verification': Verification here mean: mail verification
-    'Approval': Approval need an admin approval
-    'Recaptcha': Recaptcha verify that is not a bot?
-    'Janrain': Recaptcha verify that is not a bot?
-    'None': No verification, never use in production
-    """
-    app_settings.register_method = 'None'
-
-    """
-    Recaptcha settings
-    """
-    app_settings.recaptcha_public_key = 'PUBLIC_KEY'
-    app_settings.recaptcha_private_key = 'PRIVATE_KEY'
-
-    """
-    APP SETTINGS END
-    """
-</code></pre>
-<br />
-
-<h2>New helper DropDownMenu</h2>
-<p>DropdownMenu helper.</p>
-        {{from bootstrap import ButtonDropDown
-        =ButtonDropDown(T('Actions'), [('Action #1', '#link'), ('Action #2', '#action2')]).xml()
-        }}
-        <br />
-<pre><code class="python">
-    from bootstrap import ButtonDropDown
-    def index():
-        dropdown = ButtonDropDown(T('Actions'), [('Action #1', '#link'), ('Action #2', '#action2'])
-        return dict(dropdown=dropdown)
-</code></pre>
-
-
-<br />
-<h2>RAW grid</h2>
-<p>This is a grid, that you can customize at you own. Based of bootstrap table design. Not too magic but you can
-customize everything allowing also direct queries.</p>
-
-<p>Render like this</p>
-
-{{
-thead = TR(_class='')
-thead.append(TH('Id', _class=''))
-thead.append(TH('Role', _class=''))
-thead.append(TH('Description', _class=''))
-thead.append(TH('', _style='width: 70px'))
-table = TABLE(THEAD(thead), _class='table table-striped table-bordered table-condensed')
-tbody = TBODY()
-
-count = 0
-for row in range(5):
-    dropdown = ButtonDropDown('Menu', [('edit', '#'), ('remove', '#')])
-    count += 1
-    tr = TR(_class='')
-    tr.append(TD(row))
-    tr.append(TD('Role %s' % row))
-    tr.append(TD('Description %s' % row))
-    tr.append(TD(dropdown.xml()))
-    tbody.append(tr)
-    pass
-
-table.append(tbody)
-
-=DIV(DIV(table, _class='web2py_table'), _class='web2py_grid ')
-}}
-        
- <div class="alert">
-     To see more working example of the grid, take a look to usersadmin app on <a href="https://bitbucket.org/mulonemartin/usersadmin">bitbucket</a>
- </div>
-        
-<h4>Crud example on Auth Groups</h4>
-
-<pre><code class="python">
-    class GridGroups(RawGrid):
-    """ Grid """
-
-        def __init__(self, db, auth):
-
-            RawGrid.__init__(self, db, rows_per_page=100)
-            self.auth = auth
-
-        def are(self, table=None, vars=None):
-            """ ARE add, remove, edit """
-
-            request = current.request
-            self.table = table
-            self.vars = vars
-
-            try:
-                action = request.args[0]
-            except IndexError:
-                action = 'grid'
-
-            try:
-                value = request.args[1]
-            except IndexError:
-                value = ''
-            if action in ['edit', 'remove']:
-                raise ValueError("Need: value argument")
-
-            self.action = action
-
-            if action in ['edit']:
-                self.onedit(value)
-            elif action in ['remove']:
-                self.onremove(value)
-            elif action in ['add']:
-                self.onadd()
-            elif action in ['grid']:
-                return self.grid(vars=vars)
-            else:
-                raise PRETTYHTTP(400, 'Action not recognize')
-
-            return self
-
-        def render_table(self, rows):
-            """ La tabla """
-
-            db = self.db
-            auth = self.auth
-            T = current.T
-
-            thead = TR(_class='')
-            thead.append(TH('Id', _class=''))
-            thead.append(TH('Role', _class=''))
-            thead.append(TH('Description', _class=''))
-            thead.append(TH('Act', _style='width: 70px'))
-            table = TABLE(THEAD(thead), _class='table table-striped table-bordered table-condensed')
-            tbody = TBODY()
-
-            count = 0
-            for row in rows:
-                edit = A(SPAN(_class='icon group'), SPAN(T('Edit')),
-                _href=URL('users', 'groups',  args=['edit', row.id]),
-                _title=T('Edit group'), _class='')
-
-                remove = A(SPAN(_class='icon group'), SPAN(T('Remove')),
-                _href=URL('users', 'groups', args=['remove', row.id]),
-                _title=T('Remove group'), _class='')
-
-                dropdown = ButtonDropDown('Menu', [edit, remove])
-
-                count += 1
-                tr = TR(_class='')
-                tr.append(TD(row.id))
-                tr.append(TD(row.role))
-                tr.append(TD(row.description))
-                tr.append(TD(dropdown.xml()))
-                tbody.append(tr)
-
-            table.append(tbody)
-
-            return DIV(DIV(table, _class='web2py_table'), _class='web2py_grid ')
-
-        def query(self, vars=None):
-            """ El query de la consulta """
-
-            db = self.db
-            request = current.request
-
-            try:
-                page = int(request.vars.page)
-            except:
-                page = 1
-
-            query = (db.auth_group.id > 0)
-            found_rows = db(query).count()
-
-            limit_inf = (self.rows_per_page * page) - self.rows_per_page
-            limit_sup = limit_inf + self.rows_per_page
-            self.offset = limit_inf
-
-            rows = db(query).select(orderby=~db.auth_group.id,
-            limitby=(limit_inf, limit_sup))
-
-            return rows, found_rows
-</code></pre>
-
-<p>controllers/users.py</p>
-<pre><code class="python">
-    @auth.requires_membership('Admin')
-    def groups():
-    """ Groups """
-
-        grid = GridGroups(db, auth).are(table=db.auth_group)
-
-        return dict(grid=grid)
-
-</code></pre>
-
-

views/default/index.html

 {{extend 'layout.html'}}
 
+<div class="row">
 
-<ul class="breadcrumb">
-    <li class="active">Home</li>
-</ul>
+    <div class="span8">
+
+        {{=content}}
+
+    </div>
+
+    <div class="span4">
+
+        <div align="center"><img alt="" src="{{=URL('static', 'images/maleuser.png')}}"></div>
+        <div class="caption">
+            <h3>About me</h3>
+            <p>I'm Martin Mulone a fulltime web developer and software designer. I work as a freelancer. Also I co-run my own <a href="http://www.tecnodoc.com.ar">company</a> located in Argentina, dedicated to bring IT solution to libraries, archives and goverment in matter of documentary preservation.</p>
+            <p>I have extensive experience in FLOSS projects and associated tools. Also I'm the creator of instant2press, CMS/ blog developed in Web2py Framework. I enjoy a lot developing with python and javascript.</p>
+            <p>Also I'm instructor in a local club of a sail boat called "laser" pretty amazing!</p>
+
+            <a href="http://twitter.com/mulonemartin"> <img src="{{=URL('static', 'images/twitter.png')}}" style="padding-top: 4px;" /></a>
+            <a href="http://www.facebook.com/martin.mulone"><img src="{{=URL('static', 'images/facebook32.png')}}" style="padding-top: 4px;" /></a>
+            <a href="http://twitter.com/mulonemartin"><img src="{{=URL('static', 'images/linkeldn.png')}}" style="padding-top: 4px;" /></a>
+
+
+        </div>
+
+    </div>
+
+</div>
+
+

views/default/post.html

+{{extend 'layout.html'}}
+
+<div class="row">
+
+    <div class="span8">
+
+        <div class="i2p_post">
+            <div class="post_title"><h3>{{=info['title']}}</h3></div>
+            <div class="post_description"> {{=content}}</div>
+            <div style="clear: both;"></div>
+            <div class="post_metabottom">
+                <div class="post_updated">
+                    This article was updated <span class="updated_on"> {{=info['modified_on']}} </span>
+                    by <span class="updated_by">{{=info['authors']}}</span>
+                </div>
+
+            </div>
+
+            <div class="post-comments">
+
+                <div id="disqus_thread"></div>
+                <script type="text/javascript">
+                    /* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
+                    var disqus_shortname = '{{=disqus_site}}'; // required: replace example with your forum shortname
+                    var disqus_developer = '{{=disqus_dev}}';
+
+                    /* * * DON'T EDIT BELOW THIS LINE * * */
+                    (function() {
+                        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
+                        dsq.src = 'http://' + disqus_shortname + '.disqus.com/embed.js';
+                        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
+                    })();
+                </script>
+                <noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
+                <a href="http://disqus.com" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a>
+
+            </div>
+        </div>
+    </div>
+
+
+    <div class="span4">
+
+        <div align="center"><img alt="" src="{{=URL('static', 'images/maleuser.png')}}"></div>
+        <div class="caption">
+            <h3>About me</h3>
+            <p>I'm Martin Mulone a fulltime web developer and software designer. I work as a freelancer. Also I co-run my own <a href="http://www.tecnodoc.com.ar">company</a> located in Argentina, dedicated to bring IT solution to libraries, archives and goverment in matter of documentary preservation.</p>
+            <p>I have extensive experience in FLOSS projects and associated tools. Also I'm the creator of instant2press, CMS/ blog developed in Web2py Framework. I enjoy a lot developing with python and javascript.</p>
+            <p>Also I'm instructor in a local club of a sail boat called "laser" pretty amazing!</p>
+
+            <a href="http://twitter.com/mulonemartin"> <img src="{{=URL('static', 'images/twitter.png')}}" style="padding-top: 4px;" /></a>
+            <a href="http://www.facebook.com/martin.mulone"><img src="{{=URL('static', 'images/facebook32.png')}}" style="padding-top: 4px;" /></a>
+            <a href="http://twitter.com/mulonemartin"><img src="{{=URL('static', 'images/linkeldn.png')}}" style="padding-top: 4px;" /></a>
+
+        </div>
+
+    </div>
+
+</div>
+
+

views/default/user.html

-{{extend 'layout.html'}}
-
-<ul class="breadcrumb">
-    <li><a href="#">Home</a> <span class="divider">/</span></li>
-    <li class="active"><a href="#">Account</a> </li>
-</ul>
-
-<h2>{{=T( request.args(0).replace('_',' ').capitalize() )}}</h2>
-<div id="web2py_user_form">
-    {{=form}}
-    {{if request.args(0)=='login':}}
-    {{if not 'register' in auth.settings.actions_disabled:}}
-    <br/><a href="{{=URL(r=request,args='register')}}">{{=T('Register')}}</a>
-    {{pass}}
-    {{if not 'request_reset_password' in auth.settings.actions_disabled:}}
-    <br/><a href="{{=URL(r=request,args='request_reset_password')}}">{{=T('Lost password')}}</a>
-    {{pass}}
-    {{pass}}
-</div>
-
-
-
-<script language="javascript">
-<!--
- jQuery("#web2py_user_form input:visible:enabled:first").focus();
-//-->
-</script>

views/default/user_login.html

-{{extend 'layout.html'}}
-
-<style type="text/css">
-    legend {margin-bottom: 4px !important;}
-    .control-group {
-        margin-bottom: 4px !important;
-    }
-</style>
-
-<ul class="breadcrumb">
-    <li><a href="#">Home</a> <span class="divider">/</span></li>
-    <li><a href="#">Account</a> <span class="divider">/</span></li>
-    <li class="active">{{=T( request.args(0).replace('_',' ').capitalize() )}}</li>
-</ul>
-
-
-<div class="row">
-    <div class="span6 form-horizontal">
-        {{=form.custom.begin}}
-        <fieldset>
-            <legend>{{=T( request.args(0).replace('_',' ').capitalize() )}}</legend>
-
-            <div class="control-group">
-                <label class="control-label">{{=form.custom.label.username}}</label>
-                <div class="controls">{{=form.custom.widget.username}}</div>
-            </div>
-
-            <div class="control-group">
-                <label class="control-label">{{=form.custom.label.password}}</label>
-                <div class="controls">{{=form.custom.widget.password}}</div>
-            </div>
-
-            <div class="control-group">
-                <label class="control-label"><input class="checkbox" id="auth_user_remember" name="remember" type="checkbox" value="on" /></label>
-                <div class="controls">Remember me (for 30 days)</div>
-            </div>
-
-            <div class="form-actions">
-                {{form.custom.submit['_class']='btn btn-success'
-                =form.custom.submit}}
-                <button type="reset" class="btn">Cancelar</button>
-            </div>
-
-        </fieldset>
-        {{=form.custom.end}}
-    </div>
-
-    <div class="span6">
-        <img src="{{=URL('static', 'images/users.png')}}" />
-    </div>
-
-</div>
-
-
-
-    {{if not 'register' in auth.settings.actions_disabled:}}
-        <br/><a href="{{=URL(r=request,args='register')}}">{{=T('Register')}}</a>
-    {{pass}}
-    {{if not 'request_reset_password' in auth.settings.actions_disabled:}}
-        <br/><a href="{{=URL(r=request,args='request_reset_password')}}">{{=T('Lost password')}}</a>
-    {{pass}}
-
-
-
-<script language="javascript">
-<!--
- jQuery("#web2py_user_form input:visible:enabled:first").focus();
-//-->
-</script>

views/default/user_profile.html

-{{extend 'layout.html'}}
-
-<style type="text/css">
-    legend {margin-bottom: 4px !important;}
-    .control-group {
-        margin-bottom: 4px !important;
-    }
-</style>
-
-
-<ul class="breadcrumb">
-    <li><a href="#">Home</a> <span class="divider">/</span></li>
-    <li><a href="#">Account</a> <span class="divider">/</span></li>
-    <li class="active">{{=T( request.args(0).replace('_',' ').capitalize() )}}</li>
-</ul>
-
-
-<div class="row">
-    <div class="span6 form-horizontal">
-        {{=form.custom.begin}}
-        <fieldset>
-            <legend>{{=T( request.args(0).replace('_',' ').capitalize() )}}</legend>
-
-            <div class="control-group">
-                <label class="control-label">{{=form.custom.label.first_name}}</label>
-                <div class="controls">{{=form.custom.widget.first_name}}</div>
-            </div>
-
-            <div class="control-group">
-                <label class="control-label">{{=form.custom.label.last_name}}</label>
-                <div class="controls">{{=form.custom.widget.last_name}}</div>
-            </div>
-
-            <div class="control-group">
-                <label class="control-label">{{=form.custom.label.username}}</label>
-                <div class="controls">{{=form.custom.widget.username}}</div>
-            </div>
-
-            <div class="control-group">
-                <label class="control-label">{{=form.custom.label.email}}</label>
-                <div class="controls">{{=form.custom.widget.email}}</div>
-            </div>
-
-            <div class="form-actions">
-                {{form.custom.submit['_class']='btn btn-success'
-                =form.custom.submit}}
-                <button type="reset" class="btn">Cancelar</button>
-            </div>
-
-        </fieldset>
-        {{=form.custom.end}}
-    </div>
-
-    <div class="span6">
-        <img src="{{=URL('static', 'images/users.png')}}" />
-    </div>
-
-</div>
-
-
-
-
-<script language="javascript">
-<!--
- jQuery("#web2py_user_form input:visible:enabled:first").focus();
-//-->
-</script>

views/default/user_register.html

-{{extend 'layout.html'}}
-
-<style type="text/css">
-    legend {margin-bottom: 4px !important;}
-    .control-group {
-        margin-bottom: 4px !important;
-    }
-</style>
-
-
-<ul class="breadcrumb">
-    <li><a href="#">Home</a> <span class="divider">/</span></li>
-    <li><a href="#">Account</a> <span class="divider">/</span></li>
-    <li class="active">{{=T( request.args(0).replace('_',' ').capitalize() )}}</li>
-</ul>
-
-
-<div class="row">
-    <div class="span6 form-horizontal">
-        {{=form.custom.begin}}
-        <fieldset>
-            <legend>{{=T( request.args(0).replace('_',' ').capitalize() )}}</legend>
-
-            <div class="control-group">
-                <label class="control-label">{{=form.custom.label.first_name}}</label>
-                <div class="controls">{{=form.custom.widget.first_name}}</div>
-            </div>
-
-            <div class="control-group">
-                <label class="control-label">{{=form.custom.label.last_name}}</label>
-                <div class="controls">{{=form.custom.widget.last_name}}</div>
-            </div>
-
-            <div class="control-group">
-                <label class="control-label">{{=form.custom.label.username}}</label>
-                <div class="controls">{{=form.custom.widget.username}}</div>
-            </div>
-
-            <div class="control-group">
-                <label class="control-label">{{=form.custom.label.email}}</label>
-                <div class="controls">{{=form.custom.widget.email}}</div>
-            </div>
-
-            <div class="control-group">
-                <label class="control-label">{{=form.custom.label.password}}</label>
-                <div class="controls">{{=form.custom.widget.password}}</div>
-            </div>
-
-            <div class="control-group">
-                <label class="control-label">{{=T('Password again')}}</label>
-                <div class="controls">{{=form.custom.widget.password_two}}</div>
-            </div>
-
-
-            <div class="form-actions">
-                {{form.custom.submit['_class']='btn btn-success'
-                =form.custom.submit}}
-                <button type="reset" class="btn">Cancelar</button>
-            </div>
-
-        </fieldset>
-        {{=form.custom.end}}
-    </div>
-
-    <div class="span6">
-        <img src="{{=URL('static', 'images/users.png')}}" />
-    </div>
-
-</div>
-
-
-
-
-<script language="javascript">
-<!--
- jQuery("#web2py_user_form input:visible:enabled:first").focus();
-//-->
-</script>

views/default/user_request_reset_password.html

-{{extend 'layout.html'}}
-
-<style type="text/css">
-    legend {margin-bottom: 4px !important;}
-    .control-group {
-        margin-bottom: 4px !important;
-    }
-</style>
-
-
-<ul class="breadcrumb">
-    <li><a href="#">Home</a> <span class="divider">/</span></li>
-    <li><a href="#">Account</a> <span class="divider">/</span></li>
-    <li class="active">{{=T( request.args(0).replace('_',' ').capitalize() )}}</li>
-</ul>
-
-
-<div class="row">
-    <div class="span6 form-horizontal">
-        {{=form.custom.begin}}
-        <fieldset>
-            <legend>{{=T( request.args(0).replace('_',' ').capitalize() )}}</legend>
-
-
-            <div class="control-group">
-                <label class="control-label">{{=form.custom.label.email}}</label>
-                <div class="controls">{{=form.custom.widget.email}}</div>
-            </div>
-
-            <div class="form-actions">
-                {{form.custom.submit['_class']='btn btn-success'
-                =form.custom.submit}}
-                <button type="reset" class="btn">Cancelar</button>
-            </div>
-
-        </fieldset>
-        {{=form.custom.end}}
-    </div>
-
-    <div class="span6">
-        <img src="{{=URL('static', 'images/users.png')}}" />
-    </div>
-
-</div>
-
-<script language="javascript">
-<!--
- jQuery("#web2py_user_form input:visible:enabled:first").focus();
-//-->
-</script>

views/layout.html

                 <span class="icon-bar"></span>
             </a>
 
-            {{=authbar_bootstrap(auth)}}
-             <a class="brand" href="{{=URL('default', 'index')}}">{{=response.title}}</a>
+            <div style="float: right;">
+                <a href="http://twitter.com/mulonemartin"> <img src="{{=URL('static', 'images/twitter.png')}}" style="padding-top: 4px;" /></a>
+                <a href="http://www.facebook.com/martin.mulone"><img src="{{=URL('static', 'images/facebook32.png')}}" style="padding-top: 4px;" /></a>
+            </div>
+
+             <a class="brand" href="{{=URL('default', 'index')}}">Martin Mulone <span class="label label-important">blog</span></a>
             {{=response.menu}} <!-- here render navbar -->
 
         </div>
     </div>
 </div>
 
-<div class="container">
+<div class="container container-center">
 
     {{include}} <!-- Here render the views -->
 
     <footer>
-        <div style="float: left;"><small>&copy; Company 2012</small></div>
+        <div style="float: left;"><small>by Martin Mulone  Copyright &copy; 2012</small></div>
         <div style="float: right; text-align: right;">
-            <small>Powered by <a href="http://web2py.com">Web2py</a> and <a href="http://twitter.github.com/bootstrap/index.html">Twitter Bootstrap</a>. <br />
-            Icons from <a href="http://glyphicons.com">Glyphicons Free</a>.
-            Time and date by <a href="http://www.ama3.com/anytime/">Any+Time</a> <br />
-            Base application by Martin Mulone. Get it <a href="https://bitbucket.org/mulonemartin/bootstrap">here</a></small></div>
+            <small>Powered by <a href="http://web2py.com">Web2py</a> and <a href="http://twitter.github.com/bootstrap/index.html">Twitter Bootstrap</a>.</small></div>
     </footer>
 
 
+{{from gluon import *}}
+<div class="i2p_post_index">
+    {{for key in sorted(posts):}}{{post = posts[key]}}{{id=key.split('-')[0]}}
+    <div class="post_extract">
+        <div class="post_title"><h3>{{=A(post['title'], _href=URL('post', args="%s-%s" % (id, (IS_SLUG()(post['title']))[0])))}}</h3></div>
+        <!--<div class="post_tags">{{=post['tags']}}</div>-->
+        <div class="post_description">{{=read_extract(id)}}</div>
+        <div style="clear: both;"></div>
+        <div class="post_metabottom">
+            <div class="post_updated">
+                This article was updated <span class="updated_on"> {{=post['modified_on']}} </span>
+                by <span class="updated_by">{{=post['authors']}}</span>
+            </div>
+
+        </div>
+    </div>
+    {{pass}}
+</div>
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.