Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

A very special blog mode is in.

  • Loading branch information...
commit 639f55e6a5c94d3361654fb891adb7be34bdfef2 1 parent e931028
@livid authored
View
6 app.yaml.example
@@ -23,6 +23,12 @@ handlers:
- url: /css/.*
script: css.py
+- url: /blog/([a-zA-Z0-9\_\-]+)
+ script: blog.py
+
+- url: /entry/([0-9]+)
+ script: blog.py
+
- url: /settings
script: member.py
View
80 blog.py
@@ -0,0 +1,80 @@
+#!/usr/bin/env python
+# coding=utf-8
+
+import os
+import base64
+import re
+import time
+import datetime
+import hashlib
+import httplib
+import string
+import pickle
+
+from google.appengine.ext import webapp
+from google.appengine.api import memcache
+from google.appengine.api import images
+from google.appengine.ext import db
+from google.appengine.ext.webapp import util
+from google.appengine.ext.webapp import template
+
+from v2ex.babel import Member
+from v2ex.babel import Avatar
+from v2ex.babel import Counter
+from v2ex.babel.security import *
+from v2ex.babel.ua import *
+from v2ex.babel.da import *
+from v2ex.babel.l10n import *
+from v2ex.babel.ext.cookies import Cookies
+from v2ex.babel.ext.sessions import Session
+
+from v2ex.babel import SYSTEM_VERSION
+
+from v2ex.babel.handlers import BaseHandler
+
+import config
+
+template.register_template_library('v2ex.templatetags.filters')
+
+class BlogHandler(BaseHandler):
+ def get(self, member_username):
+ one = GetMemberByUsername(member_username)
+ if one:
+ self.values['one'] = one
+ topics = db.GqlQuery("SELECT * FROM Topic WHERE node_name = 'blog' AND member_num = :1 ORDER BY created DESC", one.num)
+ self.values['topics'] = topics
+ friends = db.GqlQuery("SELECT * FROM MemberBookmark WHERE member_num = :1", one.num)
+ self.values['friends'] = friends
+ self.set_title(u'Blog')
+ self.finalize(template_name='blog')
+ else:
+ self.set_title(u'Member Not Found')
+ self.finalize(template_name='member_not_found')
+
+class BlogEntryHandler(BaseHandler):
+ def get(self, topic_num):
+ topic = GetKindByNum('Topic', int(topic_num))
+ if topic:
+ if topic.node_name == 'blog':
+ self.values['one'] = topic.member
+ self.values['topic'] = topic
+ if topic.replies > 0:
+ self.values['replies'] = db.GqlQuery("SELECT * FROM Reply WHERE topic_num = :1", topic.num)
+ self.values['page_title'] = topic.title
+ self.finalize(template_name='blog_entry')
+ else:
+ self.redirect('/t/' + str(topic.num) + '#reply' + str(topic.replies))
+ else:
+ self.set_title(u'Topic Not Found')
+ self.finalize(template_name='topic_not_found')
+
+def main():
+ application = webapp.WSGIApplication([
+ ('/blog/([a-z0-9A-Z\_\-]+)', BlogHandler),
+ ('/entry/([0-9]+)', BlogEntryHandler)
+ ],
+ debug=True)
+ util.run_wsgi_app(application)
+
+if __name__ == '__main__':
+ main()
View
6 feed.py
@@ -37,7 +37,7 @@ def get(self):
self.values['site_updated'] = datetime.datetime.now()
q = db.GqlQuery("SELECT * FROM Topic ORDER BY created DESC LIMIT 10")
topics = []
- IGNORED = ['newbie', 'in', 'flamewar', 'pointless', 'tuan', '528491', 'chamber', 'autistic']
+ IGNORED = ['newbie', 'in', 'flamewar', 'pointless', 'tuan', '528491', 'chamber', 'autistic', 'blog', 'love', 'flood']
for topic in q:
if topic.node.name not in IGNORED:
topics.append(topic)
@@ -70,10 +70,8 @@ def get(self, node_name):
template_values['site_updated'] = datetime.datetime.now()
q = db.GqlQuery("SELECT * FROM Topic WHERE node = :1 ORDER BY created DESC LIMIT 10", node)
topics = []
- IGNORED = ['pointless', 'flamewar', 'in', 'newbie']
for topic in q:
- if topic.node.name not in IGNORED:
- topics.append(topic)
+ topics.append(topic)
template_values['topics'] = topics
template_values['feed_title'] = site.title + u'' + node.title
path = os.path.join(os.path.dirname(__file__), 'tpl', 'feed', 'index.xml')
View
7 index.yaml
@@ -158,6 +158,13 @@ indexes:
- kind: Topic
properties:
+ - name: member_num
+ - name: node_name
+ - name: created
+ direction: desc
+
+- kind: Topic
+ properties:
- name: node
- name: created
View
4 main.py
@@ -116,7 +116,7 @@ def get(self):
s = s + '<div class="section">' + section.title + '</div><div class="cell">' + n + '</div>'
memcache.set('home_sections_neue', s, 600)
template_values['s'] = s
- ignored = ['newbie', 'in', 'flamewar', 'pointless', 'tuan', '528491', 'chamber', 'autistic']
+ ignored = ['newbie', 'in', 'flamewar', 'pointless', 'tuan', '528491', 'chamber', 'autistic', 'blog', 'love', 'flood']
if browser['ios']:
home_rendered = memcache.get('home_rendered_mobile')
if home_rendered is None:
@@ -278,7 +278,7 @@ def get(self):
else:
q2 = db.GqlQuery("SELECT * FROM Topic ORDER BY last_touched DESC LIMIT 16,50")
topics = []
- ignored = ['newbie', 'in', 'flamewar', 'pointless']
+ ignored = ['flamewar', 'pointless']
for topic in q2:
if topic.node_name not in ignored:
topics.append(topic)
View
19 member.py
@@ -30,6 +30,8 @@
from v2ex.babel import SYSTEM_VERSION
+from v2ex.babel.handlers import BaseHandler
+
import config
template.register_template_library('v2ex.templatetags.filters')
@@ -59,6 +61,9 @@ def get(self, member_username):
template_values['page_title'] = site.title + u'' + one.username
template_values['canonical'] = 'http://' + site.domain + '/member/' + one.username
if one is not False:
+ blog = db.GqlQuery("SELECT * FROM Topic WHERE node_name = :1 AND member_num = :2 ORDER BY created DESC LIMIT 1", 'blog', one.num)
+ if blog.count() > 0:
+ template_values['blog'] = blog[0]
q2 = db.GqlQuery("SELECT * FROM Topic WHERE member_num = :1 ORDER BY created DESC LIMIT 10", one.num)
template_values['topics'] = q2
replies = memcache.get('member::' + str(one.num) + '::participated')
@@ -132,7 +137,6 @@ def get(self, member_username):
self.response.out.write(output)
else:
self.error(404)
-
class SettingsHandler(webapp.RequestHandler):
def get(self):
@@ -188,19 +192,6 @@ def get(self):
except:
blocked = []
template_values['member_stats_blocks'] = len(blocked)
- member_topics = memcache.get('Member_' + str(member.num) + '_topics_count')
- if member_topics is None:
- q = db.GqlQuery("SELECT __key__ FROM Topic WHERE member = :1", member)
- member_topics = q.count()
- memcache.set('Member_' + str(member.num) + '_topics_count', member_topics, 3600 * 4)
- template_values['member_stats_topics'] = member_topics
- member_replies = memcache.get('Member_' + str(member.num) + '_replies_count')
- if member_replies is None:
- replies = Reply.all()
- replies.filter("member = ", member)
- member_replies = replies.count()
- memcache.set('Member_' + str(member.num) + '_replies_count', member_replies, 3600 * 4)
- template_values['member_stats_replies'] = member_replies
if browser['ios']:
path = os.path.join(os.path.dirname(__file__), 'tpl', 'mobile', 'member_settings.html')
else:
View
55 notifications.py
@@ -59,6 +59,9 @@ def get(self):
if n.type == 'mention_reply':
n.text = u'<a href="/member/' + n.member.username + u'"><strong>' + n.member.username + u'</strong></a> 在回复 <a href="' + n.link1 + '">' + self.escape(n.label1) + u'</a> 时提到了你'
notifications.append(n)
+ if n.type == 'mention_topic':
+ n.text = u'<a href="/member/' + n.member.username + u'"><strong>' + n.member.username + u'</strong></a> 在创建主题 <a href="' + n.link1 + '">' + self.escape(n.label1) + u'</a> 时提到了你'
+ notifications.append(n)
i = i + 1
self.values['notifications'] = notifications
self.set_title(u'提醒系统')
@@ -80,6 +83,7 @@ def post(self, member_key):
member.notifications = count
member.put()
+# For mentions in reply content
class NotificationsReplyHandler(BaseHandler):
def post(self, reply_key):
reply = db.get(db.Key(reply_key))
@@ -129,6 +133,56 @@ def post(self, reply_key):
for k in keys:
taskqueue.add(url='/notifications/check/' + k)
+# For mentions in topic title and content
+class NotificationsTopicHandler(BaseHandler):
+ def post(self, topic_key):
+ topic = db.get(db.Key(topic_key))
+ combined = topic.title + " " + topic.content
+ ms = re.findall('(@[a-zA-Z0-9\_]+\.?)\s?', combined)
+ keys = []
+ if (len(ms) > 0):
+ for m in ms:
+ m_id = re.findall('@([a-zA-Z0-9\_]+\.?)', m)
+ if (len(m_id) > 0):
+ if (m_id[0].endswith('.') != True):
+ member_username = m_id[0]
+ member = GetMemberByUsername(member_username)
+ if member:
+ if member.key() != topic.member.key() and member.key() not in keys:
+ q = db.GqlQuery('SELECT * FROM Counter WHERE name = :1', 'notification.max')
+ if (q.count() == 1):
+ counter = q[0]
+ counter.value = counter.value + 1
+ else:
+ counter = Counter()
+ counter.name = 'notification.max'
+ counter.value = 1
+ q2 = db.GqlQuery('SELECT * FROM Counter WHERE name = :1', 'notification.total')
+ if (q2.count() == 1):
+ counter2 = q2[0]
+ counter2.value = counter2.value + 1
+ else:
+ counter2 = Counter()
+ counter2.name = 'notification.total'
+ counter2.value = 1
+
+ notification = Notification(parent=member)
+ notification.num = counter.value
+ notification.type = 'mention_topic'
+ notification.payload = topic.content
+ notification.label1 = topic.title
+ notification.link1 = '/t/' + str(topic.num) + '#reply' + str(topic.replies)
+ notification.member = topic.member
+ notification.for_member_num = member.num
+
+ keys.append(str(member.key()))
+
+ counter.put()
+ counter2.put()
+ notification.put()
+ for k in keys:
+ taskqueue.add(url='/notifications/check/' + k)
+
class NotificationsFeedHandler(BaseHandler):
def head(self, private_token):
pass
@@ -161,6 +215,7 @@ def main():
('/notifications/?', NotificationsHandler),
('/notifications/check/(.+)', NotificationsCheckHandler),
('/notifications/reply/(.+)', NotificationsReplyHandler),
+ ('/notifications/topic/(.+)', NotificationsTopicHandler),
('/n/([a-z0-9]+).xml', NotificationsFeedHandler)
],
debug=True)
View
BIN  static/img/chat.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN  static/img/gear.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
5 topic.py
@@ -310,6 +310,7 @@ def post(self, node_name):
taskqueue.add(url='/index/topic/' + str(topic.num))
except:
pass
+
# Twitter Sync
if member.twitter_oauth == 1 and member.twitter_sync == 1:
access_token = OAuthToken.from_string(member.twitter_oauth_string)
@@ -327,6 +328,10 @@ def post(self, node_name):
if diff.seconds > (86400 * 60):
member.newbie = 0
member.put()
+
+ # Notifications: mention_topic
+ taskqueue.add(url='/notifications/topic/' + str(topic.key()))
+
self.redirect('/t/' + str(topic.num) + '#reply0')
else:
if browser['ios']:
View
3  tpl/api/nodes_all.json
@@ -1,5 +1,6 @@
[
{% for node in nodes %}
+ {% ifequal forloop.counter 1 %}{% else %},{% endifequal %}
{
"id" : {{ node.num }},
"name" : "{{ node.name }}",
@@ -18,6 +19,6 @@
"footer" : null,
{% endif %}
"created" : "{{ node.created }}"
- },
+ }
{% endfor %}
]
View
2  tpl/desktop/backstage_member.html
@@ -18,7 +18,7 @@
<div class="sep20"></div>
{% endif %}
<div class="box">
- <div class="cell"><div class="fr"><a href="/member/{{ one.username|escape }}" target="_blank">Preview</a></div><span class="fade"><a href="/">{{ site.title }}</a> <span class="chevron">&nbsp;&nbsp;</span> <a href="/backstage">{{ l10n.backstage }}</a> <span class="chevron">&nbsp;&nbsp;</span> {{ one.username|escape }}</span></div>
+ <div class="cell"><div class="fr"><a href="/member/{{ one.username|escape }}" target="_blank">返回会员首页</a></div><span class="fade"><a href="/">{{ site.title }}</a> <span class="chevron">&nbsp;&nbsp;</span> <a href="/backstage">{{ l10n.backstage }}</a> <span class="chevron">&nbsp;&nbsp;</span> {{ one.username|escape }}</span></div>
<div class="inner">
<form action="/backstage/member/{{ one.username }}" method="post">
{% if errors %}
View
7 tpl/desktop/backstage_site.html
@@ -100,7 +100,12 @@
首页顶部内容
</td>
<td width="200" align="left">
- <textarea class="ml" name="home_top">{{ site_home_top|escape }}</textarea>
+ <span class="fade">请使用 HTML 编辑此部分</span>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <textarea class="mle tall" name="home_top">{{ site_home_top|escape }}</textarea>
</td>
</tr>
<tr>
View
97 tpl/desktop/blog.html
@@ -0,0 +1,97 @@
+{% include 'common/head.html' %}
+<body>
+ {% include 'common/top.html' %}
+ <div id="Wrapper">
+ <div id="Main">
+ <div id="Sidebar">
+ </div>
+ <div id="Rightbar">
+ <div class="box">
+ <div class="cell">
+ <table cellpadding="0" cellspacing="0" border="0" width="100%">
+ <tr>
+ <td width="48" valign="top"><a href="/member/{{ member.username }}">{{ one|avatar:"normal"}}</a></td>
+ <td width="10" valign="top"></td>
+ <td width="auto" align="left"><span class="bigger"><a href="/member/{{ one.username }}">{{ one.username }}</a></span>
+ <div class="sep5"></div>
+ <span class="fade">{{ one.tagline|escape }}</span>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div class="inner">
+ {% if one.bio %}
+ {{ one.bio|escape|mentions|urlize|linebreaksbr }}<div class="sep10"></div>
+ {% endif %}
+ <table cellpadding="5" cellspacing="0" border="0" width="100%">
+ {% if one.location %}
+ <tr>
+ <td width="16" valign="middle"><img src="http://v2ex.com/static/img/location.png" border="0" /></td>
+ <td><a href="http://www.google.com/maps?q={{ one.location|escape }}" target="_blank">{{ one.location|escape }}</a></td>
+ </tr>
+ {% endif %}
+ {% if one.website %}
+ <tr>
+ <td width="16" valign="middle"><img src="http://v2ex.com/static/img/mobileme.png" border="0" /></td>
+ <td><a href="{{ one.website|escape }}" target="_blank">{{ one.website|escape }}</a></td>
+ </tr>
+ {% endif %}
+ {% if one.twitter %}
+ <tr>
+ <td width="16" valign="middle"><img src="http://v2ex.com/static/img/twitter.png" border="0" /></td>
+ <td>@<a href="https://twitter.com/{{ one.twitter|escape }}" target="_blank">{{ one.twitter|escape }}</a></td>
+ </tr>
+ {% endif %}
+ {% if one.psn %}
+ <tr>
+ <td width="16" valign="middle"><img src="http://v2ex.com/static/img/psn.png" border="0" /></td>
+ <td><a href="http://us.playstation.com/publictrophy/index.htm?onlinename={{ one.psn|escape }}" target="_blank">{{ one.psn|escape }}</a></td>
+ </tr>
+ {% endif %}
+ </table>
+ </div>
+ </div>
+ <div class="sep20"></div>
+ <div class="box">
+ <div class="cell"><strong class="fade">{{ one.username }} 关注的</strong></div>
+ <div class="inner">
+ {% for friend in friends %}
+ <div style="display: inline-block; margin: 5px;"><a href="/member/{{ friend.one.username }}/blog">{{ friend.one|avatar:"normal" }}</a></div>
+ {% endfor %}
+ </div>
+ </div>
+ </div>
+ <div id="Content">
+ <div class="box">
+ <div class="cell">
+ <h1 style="font-size: 32px; padding: 0px; margin: 0px 40px 0px 0px; display: inline-block;" align="absmiddle">{{ one.username }}'s Blog</h1><h2 style="font-size: 20px; padding: 0px; margin: 0px; display: inline-block; color: #999; font-weight: 400;" align="absmiddle">Random Thoughts</h1>
+ </div>
+ {% for topic in topics %}
+ {% if forloop.last %}
+ <div class="inner">
+ {% else %}
+ <div class="cell">
+ {% endif %}
+ {% if topic.content %}
+ <h4>{{ topic.title|escape }}</h4>
+ <div class="sep20"></div>
+ <div class="content">
+ {{ topic.content_rendered }}
+ </div>
+ {% else %}
+ <div class="content">
+ {{ topic.title|escape|mentions|urlize }}
+ </div>
+ {% endif %}
+ <div class="sep10"></div>
+ <small class="fade">Posted at <a href="/entry/{{ topic.num }}" class="dark">{{ topic.created|timesince }}</a> ago • {{ topic.replies }} comments</small>
+ </div>
+ {% endfor %}
+ </div>
+ </div>
+ <div class="c"></div>
+ </div>
+ </div>
+ {% include 'common/bottom.html' %}
+</body>
+</html>
View
90 tpl/desktop/blog_entry.html
@@ -0,0 +1,90 @@
+{% include 'common/head.html' %}
+<body>
+ {% include 'common/top.html' %}
+ <div id="Wrapper">
+ <div id="Main">
+ <div id="Sidebar">
+ </div>
+ <div id="Rightbar">
+ <div class="box">
+ <div class="cell">
+ <table cellpadding="0" cellspacing="0" border="0" width="100%">
+ <tr>
+ <td width="48" valign="top"><a href="/member/{{ member.username }}">{{ one|avatar:"normal"}}</a></td>
+ <td width="10" valign="top"></td>
+ <td width="auto" align="left"><span class="bigger"><a href="/member/{{ one.username }}">{{ one.username }}</a></span>
+ <div class="sep5"></div>
+ <span class="fade">{{ one.tagline|escape }}</span>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div class="inner">
+ {% if one.bio %}
+ {{ one.bio|escape|mentions|urlize|linebreaksbr }}<div class="sep10"></div>
+ {% endif %}
+ <table cellpadding="5" cellspacing="0" border="0" width="100%">
+ {% if one.location %}
+ <tr>
+ <td width="16" valign="middle"><img src="http://v2ex.com/static/img/location.png" border="0" /></td>
+ <td><a href="http://www.google.com/maps?q={{ one.location|escape }}" target="_blank">{{ one.location|escape }}</a></td>
+ </tr>
+ {% endif %}
+ {% if one.website %}
+ <tr>
+ <td width="16" valign="middle"><img src="http://v2ex.com/static/img/mobileme.png" border="0" /></td>
+ <td><a href="{{ one.website|escape }}" target="_blank">{{ one.website|escape }}</a></td>
+ </tr>
+ {% endif %}
+ {% if one.twitter %}
+ <tr>
+ <td width="16" valign="middle"><img src="http://v2ex.com/static/img/twitter.png" border="0" /></td>
+ <td>@<a href="https://twitter.com/{{ one.twitter|escape }}" target="_blank">{{ one.twitter|escape }}</a></td>
+ </tr>
+ {% endif %}
+ {% if one.psn %}
+ <tr>
+ <td width="16" valign="middle"><img src="http://v2ex.com/static/img/psn.png" border="0" /></td>
+ <td><a href="http://us.playstation.com/publictrophy/index.htm?onlinename={{ one.psn|escape }}" target="_blank">{{ one.psn|escape }}</a></td>
+ </tr>
+ {% endif %}
+ </table>
+ </div>
+ </div>
+ </div>
+ <div id="Content">
+ <div class="box">
+ <div class="cell">
+ <h1 style="font-size: 32px; padding: 0px; margin: 0px 40px 0px 0px; display: inline-block;" align="absmiddle"><a href="/blog/{{ one.username }}">{{ one.username }}'s Blog</a></h1><h2 style="font-size: 20px; padding: 0px; margin: 0px; display: inline-block; color: #999; font-weight: 400;" align="absmiddle">Random Thoughts</h1>
+ </div>
+ <div class="inner">
+ {% if topic.content %}
+ <h4>{{ topic.title|escape }}</h4>
+ <div class="sep20"></div>
+ <div class="content">
+ {{ topic.content_rendered }}
+ </div>
+ {% else %}
+ <div class="content">
+ {{ topic.title|escape|mentions|urlize }}
+ </div>
+ {% endif %}
+ <div class="sep10"></div>
+ <small class="fade">Posted at {{ topic.created|timezone:8 }} • {{ topic.replies }} comments</small>
+ {% if replies %}
+ <div class="sep20"></div>
+ <table width="100%" cellpadding="0" cellspacing="2" border="0">
+ {% for reply in replies %}
+ <tr><td width="80" align="right" valign="top" style="padding: 5px 10px 5px 10px;"><a href="/member/{{ reply.member.username }}">{{ reply.member.username }}</a></td><td valign="top" style="background-color: #f5f5f5; -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; padding: 5px 10px 5px 10px;"><div class="fr snow"><strong><small>{{ forloop.counter }} • {{ reply.created|timesince }} ago</small></strong></div>{{ reply.content|escape|mentions|urlize }}</td></tr>
+ {% endfor %}
+ </table>
+ {% endif %}
+ </div>
+ </div>
+ </div>
+ <div class="c"></div>
+ </div>
+ </div>
+ {% include 'common/bottom.html' %}
+</body>
+</html>
View
6 tpl/desktop/member_home.html
@@ -32,6 +32,7 @@
<div class="sep10"></div>
<div align="center"><small><strong><a href="/backstage/deactivate/user/{{ one.key }}" class="dark">DEACTIVATE</a></strong></small></div>
{% endif %}
+ {% if member %}{% ifequal member.level 0 %}<div class="sep10"></div><div align="center"><a href="/backstage/member/{{ one.username }}"><img src="/static/img/gear.png" border="0" alt="管理" /></a></div>{% endifequal %}{% endif %}
</td>
<td width="10" valign="top"></td>
<td width="auto" align="left" valign="top">{% if show_follow %}<div class="fr"><div class="sep3"></div>{% if favorited %}<a href="/unfollow/{{ one.num }}" class="super inverse button" onClick="recordOutboundLink(this, 'Social Graph', 'unfollow');">取消特别关注</a>{% else %}<a href="/follow/{{ one.num }}" class="super special button" onClick="recordOutboundLink(this, 'Social Graph', 'follow');">加入特别关注</a>{% endif %}</div>{% endif %}<h2 style="padding: 0px; margin: 0px; font-size: 22px; line-height: 22px;">{{ one.username }}</h2>
@@ -76,6 +77,11 @@
</tr>
</table>
</div>
+ {% if blog %}
+ <div class="cell">
+ <img src="/static/img/chat.png" align="absmiddle" />&nbsp; <span class="fade">Latest from {{ one.username }}'s Blog</span> &nbsp;<span class="chevron">›</span>&nbsp; <a href="/blog/{{ one.username }}">{{ blog.title|escape }}</a>
+ </div>
+ {% endif %}
{% if one.bio %}
<div class="inner">
{{ one.bio|escape|imgly|mentions|urlize|linebreaksbr }}
View
8 tpl/desktop/member_settings.html
@@ -14,14 +14,6 @@
<div class="cell">
<table cellpadding="5" cellspacing="0" border="0">
<tr>
- <td align="right"><span class="fade">{{ l10n.total_topics }}</span></td>
- <td align="left"><strong>{{ member_stats_topics }}</strong></td>
- </tr>
- <tr>
- <td align="right"><span class="fade">{{ l10n.total_replies }}</span></td>
- <td align="left"><strong>{{ member_stats_replies }}</strong></td>
- </tr>
- <tr>
<td align="right"><span class="fade">{{ l10n.blocked }}</span></td>
<td align="left"><strong>{{ member_stats_blocks }}</strong></td>
</tr>
View
8 tpl/themes/default/style.css
@@ -44,6 +44,14 @@ h3 {
margin: 0px;
}
+h4 {
+ font-size: 20px;
+ line-height: 20px;
+ font-weight: 500;
+ padding: 0px 0px 0px 0px;
+ margin: 0px;
+}
+
form {
display: inline;
padding: none;
Please sign in to comment.
Something went wrong with that request. Please try again.