├── requirements.txt ├── README.md ├── LICENSE ├── index.html ├── app.py ├── post.html └── style.css /requirements.txt: -------------------------------------------------------------------------------- 1 | lxml==4.6.3 2 | bottle==0.12.19 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | #mirror site to localhost 2 | 1. python27 -m pip install bottle lxml peewee cssselect 3 | 2. python app.py 4 | 3. open brower and look http://localhost:8080 5 | 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 yak 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PLAIN 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 |
18 |
19 | 20 | 21 | 22 | 25 | 26 | 27 |

PLAIN

23 | 24 | 首页   注册   登录
28 |
29 |
30 |
31 |
32 |
33 | 34 |
35 |
36 |
37 | 38 | 39 |
40 |
41 | PLAIN = way to explore 42 |
43 | 44 |
45 |
46 |
47 |
现在注册 48 |
49 |
50 | 已注册用户请  登录
51 |
52 |
53 | 54 | 55 | 56 | 57 | 58 |
59 | 60 | 61 |
62 | 63 |
64 | 65 | 66 | 67 |
68 |
69 |
社区运行状况
70 |
71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 |
注册会员135633
主题214022
回复2371517
85 |
86 |
87 | 88 |
89 |
90 |
91 | 92 | 93 |
94 |
95 |
96 | 97 |
98 |
99 | 100 |
101 |
102 | 103 |
104 | 105 | %for m in posts: 106 | 107 |
108 | 109 | 110 | 111 | 112 | 113 | 114 | 118 | 123 | 124 |
{{m.node}}{{m.title}} 115 |
116 |
   
117 |
119 | 120 | 121 | {{m.author.name}} 122 |
125 |
126 | %end 127 | 128 | 129 | 130 | 133 |
134 | 135 |
136 | 137 | 138 | 139 |
140 | 141 | 142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 | DigitalOcean 152 |
153 | 154 |
155 | sdfsf 156 |
157 | 158 |
159 | 160 |
161 | 162 |
163 |
164 |
165 |
166 | 167 | 168 | 169 | 170 | 171 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | -------------------------------------------------------------------------------- /app.py: -------------------------------------------------------------------------------- 1 | # -*- encoding=utf8 -*- 2 | import urllib2 3 | import lxml.html,re 4 | import os.path,stat,io,sys,glob,time 5 | import threading,Queue 6 | from bottle import route, run,template,static_file 7 | from peewee import * 8 | db = SqliteDatabase('post.db') 9 | 10 | postlist=Queue.Queue(maxsize=200) 11 | 12 | 13 | class User(Model): 14 | uid = IntegerField(primary_key=True) 15 | name = CharField() 16 | password = FixedCharField() 17 | 18 | 19 | class Meta: 20 | database = db 21 | User._meta.auto_increment =True 22 | 23 | class Post(Model): 24 | post_id=IntegerField(primary_key=True) 25 | node = CharField() 26 | title = CharField() 27 | content = CharField() 28 | author = ForeignKeyField(User, related_name='author') 29 | 30 | class Meta: 31 | database = db 32 | 33 | class Remark(Model): 34 | remark_id=IntegerField(primary_key=True) 35 | post_id = IntegerField() 36 | content = CharField() 37 | user_id = ForeignKeyField(User, related_name='poster') 38 | 39 | class Meta: 40 | database = db 41 | db.connect() 42 | 43 | User.create_table() 44 | Post.create_table() 45 | Remark.create_table() 46 | 47 | def fetchHtml(url,options): 48 | headers={'User-Agent':options['user_agent'],"Host":'www.'+options['domain'],'Connection':"keep-alive",'Refer':options['url'],} 49 | page='' 50 | retry=0 51 | req=urllib2.Request(url) 52 | for header in headers: 53 | req.add_header(header,headers[header]) 54 | while not page and retry <3: 55 | try: 56 | page=urllib2.urlopen(url).read() 57 | except: 58 | retry=retry+1 59 | print retry 60 | time.sleep(10) 61 | return page.decode(options['charset']) 62 | 63 | class ScrapIndex(threading.Thread): 64 | 65 | def __init__(self,config): 66 | threading.Thread.__init__(self) 67 | self.config=config 68 | def run(self): 69 | print("\n run....") 70 | config=self.config 71 | url=config['url'] 72 | while True: 73 | page='' 74 | try: 75 | page=fetchHtml(url,config) 76 | except: 77 | print("error",url) 78 | if not page: 79 | continue 80 | doc = lxml.html.document_fromstring(page) 81 | for elem in doc.cssselect(config['links_css']): 82 | id=re.search(config['href_patten'],elem.get("href")).group(1) 83 | #print(elem) 84 | filename=config['save_dir']+'//'+id 85 | #print(filename) 86 | if not os.path.exists(filename): 87 | print(filename) 88 | self.touch(filename) 89 | postlist.put(id) 90 | 91 | time.sleep(config['refresh_fruiqence']) 92 | 93 | def touch(self,fname, times=None): 94 | with open(fname, 'a'): 95 | os.utime(fname, times) 96 | 97 | 98 | 99 | class Refresh(threading.Thread): 100 | def __init__(self, config): 101 | threading.Thread.__init__(self) 102 | self.config=config 103 | def run(self): 104 | 105 | dir=self.config['save_dir'] 106 | while True: 107 | now=time.time() 108 | for path_and_filename in glob.iglob(dir+"/*"): 109 | ctime=os.stat(path_and_filename)[stat.ST_CTIME] 110 | elapse=now-ctime 111 | if elapse > 86400: 112 | print("\t"*3,ctime,path_and_filename,elapse) 113 | os.remove(path_and_filename) 114 | elif elapse > 3600: 115 | print(postlist.qsize()) 116 | postlist.put(os.path.basename(path_and_filename)) 117 | 118 | time.sleep(20) 119 | 120 | 121 | 122 | class ScrapPage(threading.Thread): 123 | def __init__(self, config): 124 | threading.Thread.__init__(self) 125 | self.config=config 126 | 127 | def run(self): 128 | 129 | config=self.config 130 | while True: 131 | 132 | print(postlist.qsize()) 133 | id=postlist.get() 134 | url=config['detail_url'] % id 135 | print(url) 136 | filename=config['save_dir']+"//"+ id 137 | page='' 138 | try: 139 | page=fetchHtml(url,config) 140 | if page.find('/restricted') > -1: 141 | page='' 142 | 143 | except: 144 | print("ERROR:",url) 145 | if not page: 146 | continue 147 | doc = lxml.html.document_fromstring(page) 148 | size=0 149 | idset=[] 150 | if os.path.exists(filename): 151 | size=os.path.getsize(filename) 152 | print('size=',size) 153 | 154 | if 0 == size: 155 | header=doc.cssselect("#Main .box .header") 156 | node=header[0].findall("./a")[1].get("href").replace('/go/','') 157 | title=header[0].find("./h1").text_content() 158 | user=header[0].find("./small/a").text_content() 159 | content=doc.find_class("topic_content") 160 | if content: 161 | content=content[0].text_content() 162 | try: 163 | user = User.get(User.name ==user) 164 | user_id=user.uid 165 | except: 166 | created = User.create(name=user,password='xx') 167 | user_id=created.uid 168 | post,created=Post.get_or_create(post_id=int(id), node=node, title=title,author=user_id,content=content) 169 | #print(post,created) 170 | with open(filename,'r+') as f: 171 | f.write(chr(32)) 172 | 173 | idlist='' 174 | if 0 < size: 175 | with open(filename,'r+') as f: 176 | idlist=f.read().strip() 177 | 178 | uniq=set() 179 | if 0 != len(idlist) : 180 | uniq=set(idlist.split(',')) 181 | print("\n-----------------------------") 182 | 183 | uniqnew=set([]) 184 | for elem in doc.cssselect('#Main div.box:nth-child(4) div[id^="r_"]'): 185 | user=elem.find(".//strong/a").text_content() 186 | try: 187 | user = User.get(User.name ==user) 188 | user_id=user.uid 189 | except: 190 | created = User.create(name=user,password='xx') 191 | user_id=created.uid 192 | #print(user_id) 193 | rid=elem.get('id').replace('r_','') 194 | td=elem.find_class("reply_content") 195 | content=td[0].text_content() 196 | #print(td[0].text_content()) 197 | if rid not in uniq: 198 | uniq.add(rid) 199 | Remark.create(content=content,user_id=user_id,post_id=id) 200 | 201 | time.sleep(10) 202 | 203 | #t=ScrapIndex(config) 204 | 205 | config={'url':'https://v2ex.com/?tab=all', 206 | 'domain':'v2ex.com', 207 | 'charset':'utf-8', 208 | 'user_agent':'Mozilla/5.0 (Windows NT 6.3; rv:38.0) Gecko/20100101 Firefox/38.0', 209 | 'links_css':"div.box:nth-child(2) table td:nth-child(3) .item_title a", 210 | 'href_patten':r"/t/(\d+)#", 211 | 'save_dir':'tmp', 212 | "detail_url":"https://v2ex.com/t/%s", 213 | 'refresh_fruiqence':30} 214 | 215 | savedir=config['save_dir'] 216 | if not os.path.exists(savedir): 217 | os.mkdir(savedir) 218 | db.create_tables([User,Post,Remark]) 219 | 220 | threads=[ScrapIndex(config),Refresh(config),ScrapPage(config)] 221 | for t in threads: 222 | t.start() 223 | 224 | 225 | @route('/static/') 226 | def server_static(filepath): 227 | return static_file(filepath, root='.') 228 | @route('/') 229 | def index(): 230 | 231 | posts=Post.select().paginate(0,30) 232 | 233 | return template('index', page=1,posts=posts) 234 | 235 | @route('/recent/:page') 236 | def recent(page): 237 | page = int(page) 238 | posts=Post.select().paginate((page-1)*30,30) 239 | page=page+1 240 | return template('index',page=page, posts=posts) 241 | 242 | 243 | @route('/t/:id') 244 | def remark(id): 245 | id = int(id) 246 | post=Post.get(Post.post_id==id) 247 | 248 | remarks=Remark.select().where(Remark.post_id==id) 249 | return template('post', post=post,remarks=remarks) 250 | run(host='localhost', port=8080, debug=True) 251 | 252 | sys.exit() 253 | -------------------------------------------------------------------------------- /post.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | {{ post.title }} - {{ post.node}} 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 |
22 |
23 | 24 | 25 | 26 | 29 | 30 | 31 |

PLAIN

27 | 28 | 首页   注册   登录
32 |
33 |
34 |
35 |
36 |
37 | 38 |
39 |
40 |
41 | 42 | 43 |
44 |
45 | PLAIN = way to explore 46 |
47 | PLAIN 是一个关于xx比分享和探索的地方 48 |
49 |
50 |
51 |
现在注册 52 |
53 |
54 | 已注册用户请  登录
55 |
56 |
57 | 58 | 59 | 60 | 61 |
62 |
63 |
64 | 65 | 66 | 67 | 推荐书目 68 | 69 |
70 | 71 | 黑客与画家 72 | 73 |
74 | 75 | REWORK 简体中文版 76 | 77 |
78 | 79 | REWORK 精装原版 80 | 81 |
82 | 83 | 深入浅出设计模式 Head First Design Patterns 84 | 85 |
86 | 87 | 代码之美 Beautiful Code 88 | 89 |
90 | 91 | 数据之美 Beautiful Data 92 | 93 |
94 | 95 | 信息论、编码与密码学 96 | 97 |
98 | 99 | Free as in Freedom 100 | 101 |
102 | 103 | 设计原本 104 | 105 |
106 | 107 | 精通正则表达式 108 | 109 | 110 | 111 | 116 |
117 |
118 | 119 | 120 | 121 | 122 |
123 | 124 | 125 | 126 | 127 | 128 |
129 | 130 | 131 | 132 | 133 |
134 |
135 |
136 | 137 |
138 |
139 | PLAIN  ›  {{ post.node}} 140 |
141 |

{{ post.title }}

142 |
143 |
{{post.author.name}} · 144 |
145 | 146 | 147 | 148 |
149 | 150 |

151 | {{ post.content }} 152 |

153 |
154 | 155 |
156 | 157 | 158 | 159 |
160 | 161 |
162 | 163 | 164 |
165 |
166 |  |   167 |
168 | 169 | 170 | 171 | %for m in remarks: 172 |
173 | 174 | 175 | 176 | 179 | 180 | 185 | 186 |
177 | {{ m.user_id.name}} 178 |
   
181 |
{{ m.content }}
182 |
183 | 184 |
187 |
188 | %end 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 |
205 |
206 | 207 | 208 | 209 | 210 | 211 | 212 |
213 | 214 | 215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
224 | DigitalOcean 225 |
226 | 关于   ·   FAQ   ·   API   ·   我们的愿景   ·   IP 查询   ·   工作空间   ·   广告投放   ·   鸣谢   ·   上网首页   ·   838 人在线   最高记录 1630   ·   227 |
228 | 创意工作者们的社区 229 |
230 | Lovingly made by OLIVIDA 231 |
232 | VERSION: 3.9.0 · 48ms · UTC 09:40 · PVG 17:40 · LAX 02:40 · JFK 05:40
♥ Do have faith in what you're doing.
233 |
234 | 沪ICP备15015613号-1 235 |
236 |
237 |
238 |
239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | -------------------------------------------------------------------------------- /style.css: -------------------------------------------------------------------------------- 1 | html { 2 | padding: 0px; 3 | margin: 0px; 4 | } 5 | 6 | body { 7 | padding: 0px; 8 | margin: 0px; 9 | font-family: "Helvetica Neue", "Luxi Sans", "DejaVu Sans", Tahoma, "Hiragino Sans GB", "Microsoft Yahei", sans-serif; 10 | } 11 | h1 { 12 | font-size: 24px; 13 | font-weight: 500; 14 | line-height: 100%; 15 | margin: 5px 0px 20px 0px; 16 | padding: 0px; 17 | word-wrap: break-word; 18 | } 19 | 20 | h2 { 21 | font-size: 18px; 22 | font-weight: 500; 23 | line-height: 100%; 24 | margin: 20px 0px 20px 0px; 25 | padding: 0px 0px 8px 0px; 26 | border-bottom: 1px solid #e2e2e2; 27 | } 28 | 29 | h3 { 30 | font-size: 16px; 31 | font-weight: 500; 32 | line-height: 100%; 33 | margin: 5px 0px 20px 0px; 34 | padding: 0px; 35 | } 36 | 37 | hr { 38 | border: none; 39 | height: 1px; 40 | color: #e2e2e2; 41 | background-color: #e2e2e2; 42 | margin-bottom: 1em; 43 | } 44 | 45 | pre { 46 | font-family: 'Consolas', 'Panic Sans', 'Consolas', 'DejaVu Sans Mono', 47 | 'Bitstream Vera Sans Mono', 'Menlo', 'Microsoft Yahei', monospace; 48 | font-size: 13px; 49 | letter-spacing: 0.015em; 50 | line-height: 120%; 51 | padding: 0.5em; 52 | margin: 0px; 53 | white-space: pre; 54 | overflow-x: auto; 55 | overflow-y: auto; 56 | } 57 | 58 | pre a { 59 | color: inherit; 60 | text-decoration: underline; 61 | } 62 | 63 | code { 64 | background-color: #f8f8f8; 65 | padding: 1px 2px 1px 2px; 66 | border-radius: 2px; 67 | font-family: 'Consolas', 'Panic Sans', 'DejaVu Sans Mono', 68 | 'Bitstream Vera Sans Mono', 'Menlo', 'Microsoft Yahei', monospace; 69 | } 70 | 71 | a:link, a:visited, a:active { 72 | color: #778087; 73 | text-decoration: none; 74 | word-break: break-all; 75 | } 76 | 77 | a:hover { 78 | color: #4d5256; 79 | text-decoration: underline; 80 | } 81 | 82 | a.dark:link, a.dark:visited, a.dark:active { 83 | color: gray; 84 | text-decoration: none; 85 | } 86 | 87 | a.dark:hover { 88 | color: #385f8a; 89 | text-decoration: none; 90 | } 91 | 92 | a.gray:link, a.gray:visited, a.gray:active { 93 | color: #ccc; 94 | text-decoration: none; 95 | } 96 | 97 | a.gray:hover { 98 | color: #999; 99 | text-decoration: none; 100 | } 101 | 102 | a.top:link, a.top:visited { 103 | color: #556; 104 | text-decoration: none; 105 | } 106 | 107 | a.top:hover { 108 | color: #99a; 109 | text-decoration: none; 110 | } 111 | 112 | a.top:active { 113 | color: #001; 114 | text-decoration: none; 115 | } 116 | 117 | a.tab:link, a.tab:visited, a.tab:active { 118 | display: inline-block; 119 | font-size: 13px; 120 | line-height: 13px; 121 | padding: 5px 8px 5px 8px; 122 | margin-right: 5px; 123 | border-radius: 3px; 124 | color: #555; 125 | } 126 | 127 | a.tab:hover { 128 | background-color: #f5f5f5; 129 | color: #000; 130 | text-decoration: none; 131 | } 132 | 133 | a.tab_current:link, a.tab_current:visited, a.tab_current:active { 134 | display: inline-block; 135 | font-size: 13px; 136 | line-height: 13px; 137 | padding: 5px 8px 5px 8px; 138 | margin-right: 5px; 139 | border-radius: 3px; 140 | background-color: #334; 141 | color: #fff; 142 | } 143 | 144 | a.tab_current:hover { 145 | background-color: #445; 146 | color: #fff; 147 | text-decoration: none; 148 | } 149 | 150 | a.node:link, a.node:visited, a.node:active { 151 | background-color: #f5f5f5; 152 | font-size: 10px; 153 | line-height: 10px; 154 | display: inline-block; 155 | padding: 4px 4px 4px 4px; 156 | -moz-border-radius: 2px; 157 | -webkit-border-radius: 2px; 158 | border-radius: 2px; 159 | text-decoration: none; 160 | color: #999; 161 | } 162 | 163 | a.node:hover { 164 | text-decoration: none; 165 | background-color: #e2e2e2; 166 | color: #777; 167 | } 168 | 169 | a.op:link, a.op:visited, a.op:active { 170 | background-color: #f0f0f0; 171 | font-size: 10px; 172 | line-height: 10px; 173 | display: inline-block; 174 | padding: 4px 4px 3px 4px; 175 | border-radius: 3px; 176 | text-decoration: none; 177 | border: 1px solid #ddd; 178 | color: #666; 179 | vertical-align: baseline; 180 | } 181 | 182 | a.op:hover { 183 | text-decoration: none; 184 | background-color: #e0e0e0; 185 | border: 1px solid #c0c0c0; 186 | color: #333; 187 | } 188 | 189 | a.opo:link, a.opo:visited, a.opo:active { 190 | background-color: #73d0da; 191 | font-size: 10px; 192 | line-height: 10px; 193 | display: inline-block; 194 | padding: 3px 4px 3px 4px; 195 | border-radius: 3px 196 | text-decoration: none; 197 | color: #333; 198 | } 199 | 200 | a.opo:hover { 201 | border: 1px solid #000; 202 | } 203 | 204 | a.opo-100:link, a.opo-100:visited, a.opo-100:active { 205 | background-color: #323a45; 206 | font-size: 10px; 207 | line-height: 10px; 208 | display: inline-block; 209 | padding: 3px 4px 3px 4px; 210 | border-radius: 3px 211 | text-decoration: none; 212 | color: #eee; 213 | } 214 | 215 | a.opo-1000:link, a.opo-1000:visited, a.opo-1000:active { 216 | background-color: #3f6184; 217 | font-size: 10px; 218 | line-height: 10px; 219 | display: inline-block; 220 | padding: 3px 4px 3px 4px; 221 | border-radius: 3px 222 | text-decoration: none; 223 | color: #ddd; 224 | } 225 | 226 | a.opo-50000:link, a.opo-50000:visited, a.opo-50000:active { 227 | background-color: #778899; 228 | font-size: 10px; 229 | line-height: 10px; 230 | display: inline-block; 231 | padding: 3px 4px 3px 4px; 232 | border-radius: 3px 233 | text-decoration: none; 234 | color: #ccc; 235 | } 236 | 237 | a.opo-100000:link, a.opo-100000:visited, a.opo-100000:active { 238 | background-color: #f6f7f9; 239 | font-size: 10px; 240 | line-height: 10px; 241 | display: inline-block; 242 | padding: 3px 4px 3px 4px; 243 | border-radius: 3px 244 | text-decoration: none; 245 | color: #333; 246 | } 247 | 248 | a.tb:link, a.tb:visited, a.tb:active { 249 | font-size: 11px; 250 | line-height: 12px; 251 | color: #333; 252 | text-decoration: none; 253 | display: inline-block; 254 | padding: 3px 10px 3px 10px; 255 | border-radius: 15px; 256 | text-shadow: 0px 1px 0px #fff; 257 | } 258 | 259 | a.tb:hover { 260 | background-color: rgba(255, 255, 255, 0.3); 261 | color: #000; 262 | text-decoration: none; 263 | border-radius: 15px; 264 | } 265 | 266 | a.opo:hover { 267 | text-decoration: none; 268 | background-color: #666; 269 | border: 1px solid #333; 270 | color: #fff; 271 | } 272 | 273 | a.black:link, a.black:visited, a.black:active { 274 | color: rgba(0, 0, 0, 1); 275 | text-decoration: none; 276 | } 277 | 278 | a.black:hover { 279 | color: rgba(0, 0, 0, 1); 280 | text-decoration: underline; 281 | text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.2); 282 | } 283 | 284 | ul { 285 | list-style: square; 286 | margin: 1em 0px 1em 1em; 287 | padding: 0px; 288 | } 289 | 290 | ul li, ol li { 291 | padding: 0px; 292 | margin: 0px; 293 | } 294 | 295 | ol { 296 | margin: 1em 0px 0em 2em; 297 | padding: 0px; 298 | } 299 | 300 | #Top { 301 | text-align: center; 302 | background-color: #fff; 303 | height: 44px; 304 | font-size: 15px; 305 | font-weight: 500; 306 | background-size: 44px 44px; 307 | border-bottom: 1px solid rgba(0, 0, 0, 0.22); 308 | } 309 | 310 | #Wrapper { 311 | text-align: center; 312 | background-color: #e2e2e2; 313 | background-image: url("/static/img/shadow_light.png"); 314 | background-repeat: repeat-x; 315 | } 316 | 317 | #Bottom { 318 | border-top: 1px solid rgba(0, 0, 0, 0.22); 319 | background-color: #fff; 320 | text-align: center; 321 | color: #999; 322 | } 323 | 324 | #MySQL { 325 | background-color: #333; 326 | padding: 5px; 327 | font-size: 12px; 328 | color: #fff; 329 | border-top: 2px solid #ccc; 330 | text-align: left; 331 | } 332 | 333 | #Leftbar { 334 | width: 0px; 335 | float: left; 336 | } 337 | 338 | #Rightbar { 339 | width: 270px; 340 | float: right; 341 | } 342 | 343 | #Main { 344 | width: auto; 345 | margin: 0px 290px 0px 0px; 346 | } 347 | 348 | #q { 349 | border: none; 350 | width: 222px; 351 | height: 26px; 352 | margin: 0px 0px 2px 30px; 353 | background-color: transparent; 354 | font-family: "Helvetica Neue", "Luxi Sans", "DejaVu Sans", Tahoma, "Hiragino Sans GB", STHeiti !important; 355 | font-size: 12px; 356 | line-height: 16px; 357 | outline: none; 358 | } 359 | 360 | .alt { 361 | background-color: #f5f5f5; 362 | } 363 | 364 | .corner_left { 365 | border-top-left-radius: 3px; 366 | border-bottom-left-radius: 3px; 367 | } 368 | 369 | .corner_right { 370 | border-top-right-radius: 3px; 371 | border-bottom-right-radius: 3px; 372 | } 373 | 374 | .gray { 375 | color: #999; 376 | } 377 | 378 | .fade { 379 | color: #ccc; 380 | } 381 | 382 | .snow { 383 | color: #e2e2e2; 384 | } 385 | 386 | .green { 387 | color: #393; 388 | } 389 | 390 | .blue { 391 | color: #485CC7; 392 | } 393 | 394 | .bigger { 395 | font-size: 16px; 396 | } 397 | 398 | .small { 399 | font-size: 11px; 400 | } 401 | 402 | .content { 403 | width: 970px; 404 | margin: 0px auto 0px auto; 405 | } 406 | 407 | .box { 408 | background-color: #fff; 409 | border-radius: 3px; 410 | box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.1); 411 | border-bottom: 1px solid #e2e2e2; 412 | } 413 | 414 | .transparent { 415 | background-color: transparent; 416 | border: 2px dashed rgba(0, 0, 0, 0.1); 417 | border-radius: 3px; 418 | box-shadow: none; 419 | } 420 | 421 | .page { 422 | font-size: 14px; 423 | line-height: 1.6; 424 | padding: 10px; 425 | } 426 | 427 | .inner { 428 | padding: 10px; 429 | font-size: 12px; 430 | line-height: 150%; 431 | text-align: left; 432 | } 433 | 434 | .header { 435 | padding: 10px; 436 | font-size: 14px; 437 | line-height: 120%; 438 | text-align: left; 439 | border-bottom: 1px solid #e2e2e2; 440 | overflow: auto; 441 | } 442 | 443 | .caution { 444 | padding: 10px; 445 | font-size: 12px; 446 | line-height: 150%; 447 | text-align: left; 448 | 449 | background-color: #f0f0f0; 450 | border-top: 1px solid #e2e2e2; 451 | border-bottom: 1px solid #e2e2e2; 452 | } 453 | 454 | .dock_area { 455 | background-color: #edf3f5; 456 | background-image: url("/static/img/dock_shadow.png"); 457 | background-repeat: repeat-x; 458 | padding: 0px; 459 | } 460 | 461 | .cell { 462 | padding: 10px; 463 | font-size: 12px; 464 | line-height: 120%; 465 | text-align: left; 466 | border-bottom: 1px solid #e2e2e2; 467 | } 468 | 469 | .cell_tabs { 470 | padding: 10px 10px 0px 10px; 471 | border-bottom: 1px solid #e2e2e2; 472 | text-align: center; 473 | } 474 | 475 | .cell_tab:link, .cell_tab:visited { 476 | font-size: 14px; 477 | border-bottom: 3px solid transparent; 478 | display: inline-block; 479 | text-decoration: none; 480 | margin-right: 15px; 481 | padding: 0px 5px 5px 5px; 482 | color: #99a; 483 | } 484 | 485 | .cell_tab:hover { 486 | color: #778087; 487 | border-bottom: 3px solid #f0f0f0; 488 | } 489 | 490 | .cell_tab_current:link, .cell_tab_current:visited { 491 | font-size: 14px; 492 | border-bottom: 3px solid #778087; 493 | display: inline-block; 494 | text-decoration: none; 495 | margin-right: 15px; 496 | padding: 0px 5px 5px 5px; 497 | } 498 | 499 | .cell_ops { 500 | padding: 10px; 501 | font-size: 12px; 502 | line-height: 120%; 503 | text-align: left; 504 | border-bottom: 1px solid #e2e2e2; 505 | background-color: #F9F9F9; 506 | box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.05) inset; 507 | } 508 | 509 | .collapsed { 510 | display: none; 511 | } 512 | 513 | .well { 514 | padding: 10px; background-color: #f9f9f9; border-radius: 5px; box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.1) inset; 515 | } 516 | 517 | .cell[id^=r_]>table,.inner[id^=r_]>table{table-layout:fixed} 518 | 519 | div.node { 520 | padding: 5px; 521 | background-color: transparent; 522 | border-radius: 3px; 523 | box-shadow: none; 524 | } 525 | 526 | div.node .node_compose { 527 | float: right; 528 | visibility: hidden; 529 | margin: 3px 0px 0px 0px; 530 | } 531 | 532 | div.node:hover { 533 | background-color: #f9f9f9; 534 | box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) inset; 535 | } 536 | 537 | div.node:hover .node_compose { 538 | float: right; 539 | visibility: visible; 540 | } 541 | 542 | .subtle { 543 | background-color: #fffff9; 544 | border-left: 3px solid #fffbc1; 545 | padding: 10px; 546 | font-size: 12px; 547 | line-height: 120%; 548 | text-align: left; 549 | border-bottom: 1px solid #e2e2e2; 550 | } 551 | 552 | .grid { 553 | padding: 0px; 554 | font-size: 13px; 555 | line-height: 120%; 556 | text-align: left; 557 | } 558 | 559 | .problem { 560 | padding: 10px; 561 | font-size: 13px; 562 | line-height: 120%; 563 | text-align: left; 564 | background-color: #ffffc0; 565 | border-left: 5px solid #fff000; 566 | border-bottom: 1px solid #e2e2e2; 567 | color: #333; 568 | } 569 | 570 | .outdated { 571 | padding: 10px; 572 | font-size: 12px; 573 | line-height: 120%; 574 | text-align: left; 575 | background-color: #f9f9f9; 576 | border-left: 5px solid #f0f0f0; 577 | border-bottom: 1px solid #e2e2e2; 578 | color: #999; 579 | } 580 | 581 | .message { 582 | padding: 10px; 583 | font-size: 13px; 584 | line-height: 120%; 585 | text-align: left; 586 | background-color: #f3faff; 587 | border-left: 5px solid #c7e8ff; 588 | border-bottom: 1px solid #e2e2e2; 589 | color: #333; 590 | cursor: pointer; 591 | } 592 | 593 | .inner a.thank, .cell a.thank { 594 | display: inline-block; 595 | line-height: 12px; 596 | visibility: hidden; 597 | } 598 | 599 | .inner:hover a.thank, .cell:hover a.thank { 600 | display: inline-block; 601 | line-height: 12px; 602 | border-radius: 5px; 603 | visibility: visible; 604 | } 605 | 606 | .inner:hover a.thank:hover, .cell:hover a.thank:hover { 607 | background-color: #f5f5f5; 608 | text-decoration: none; 609 | } 610 | 611 | .grid_item { 612 | background-color: #f9f9f9; 613 | width: 25%; 614 | height: 160px; 615 | padding: 0px; 616 | margin: 0px; 617 | box-shadow: none; 618 | display: inline-block; 619 | transition: box-shadow 0.2s; 620 | text-decoration: none; 621 | } 622 | 623 | .grid_item:hover { 624 | background-color: #f0f0f0; 625 | box-shadow: 0px 5px 20px rgba(0, 0, 0, 0.08) inset; 626 | cursor: pointer; 627 | text-decoration: none; 628 | } 629 | 630 | .thank_area { 631 | display: inline-block; 632 | padding: 2px 5px 2px 5px; 633 | line-height: 12px; 634 | } 635 | 636 | .thanked { 637 | display: inline-block; 638 | background-color: #f9f9f9; 639 | color: #e0e0e0; 640 | border-radius: 3px; 641 | } 642 | 643 | .social_label:link, .social_label:visited { 644 | background-color: #f9f9f9; 645 | padding: 5px 15px 5px 6px; 646 | font-size: 14px; 647 | line-height: 100%; 648 | text-decoration: none; 649 | display: inline-block; 650 | margin: 0px 10px 10px 0px; 651 | border-radius: 20px; 652 | outline: none; 653 | } 654 | 655 | .social_label:hover { 656 | background-color: #e9e9e9; 657 | outline: none; 658 | } 659 | 660 | .social_label:active { 661 | box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.2) inset; 662 | outline: none; 663 | } 664 | 665 | .sep20 { 666 | height: 20px; 667 | } 668 | 669 | .sep10 { 670 | height: 10px; 671 | } 672 | 673 | .sep5 { 674 | height: 5px; 675 | } 676 | 677 | .sep3 { 678 | height: 3px; 679 | } 680 | 681 | .c { 682 | clear: both; 683 | } 684 | 685 | .chevron { 686 | font-family: "Lucida Grande"; 687 | font-weight: 500; 688 | } 689 | 690 | .fr { 691 | float: right; 692 | text-align: right; 693 | } 694 | 695 | .fl { 696 | float: left; 697 | } 698 | 699 | .f11 { 700 | font-size: 11px; 701 | } 702 | 703 | .f12 { 704 | font-size: 12px; 705 | } 706 | 707 | .f13 { 708 | font-size: 13px; 709 | } 710 | 711 | .f14 { 712 | font-size: 14px; 713 | } 714 | 715 | .no { 716 | font-size: 9px; 717 | line-height: 9px; 718 | font-weight: 500; 719 | border-radius: 10px; 720 | display: inline-block; 721 | background-color: #f0f0f0; 722 | color: #ccc; 723 | padding: 2px 5px 2px 5px; 724 | } 725 | 726 | .reply_content { 727 | font-size: 14px; 728 | line-height: 1.6; 729 | color: #000; 730 | word-break: break-all; 731 | word-wrap: break-word; 732 | } 733 | 734 | .topic_content { 735 | font-size: 14px; 736 | line-height: 1.6; 737 | color: #000; 738 | word-break: break-all; 739 | word-wrap: break-word; 740 | } 741 | 742 | .gist { 743 | word-break: normal; 744 | } 745 | 746 | .topic_content .gist .gist-data, .reply_content .gist .gist-data { 747 | max-height: 20em; 748 | } 749 | 750 | .topic_content>*:first-child, .reply_content>*:first-child { 751 | margin-top: 0 !important; 752 | } 753 | 754 | .topic_content>*:last-child, .reply_content>*:last-child, .gist>*:last-child { 755 | margin-bottom: 0 !important; 756 | } 757 | 758 | .syntax_error { 759 | background-color: #e2e2e2; 760 | padding: 7px; 761 | color: #000; 762 | font-size: 12px; 763 | line-height: 100%; 764 | margin-top: -10px; 765 | } 766 | 767 | .topic_buttons { 768 | padding: 5px; 769 | font-size: 14px; 770 | line-height: 120%; 771 | 772 | background: #eeeeee; 773 | background: -moz-linear-gradient(top, #eeeeee 0%, #cccccc 100%); 774 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#eeeeee), color-stop(100%,#cccccc)); 775 | background: -webkit-linear-gradient(top, #eeeeee 0%,#cccccc 100%); 776 | background: -o-linear-gradient(top, #eeeeee 0%,#cccccc 100%); 777 | background: -ms-linear-gradient(top, #eeeeee 0%,#cccccc 100%); 778 | background: linear-gradient(to bottom, #eeeeee 0%,#cccccc 100%); 779 | filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#cccccc',GradientType=0 ); 780 | 781 | border-radius: 0px 0px 3px 3px; 782 | text-align: left; 783 | } 784 | 785 | #topic_thank { 786 | display: inline-block; 787 | } 788 | 789 | /* FORM */ 790 | 791 | .sl { 792 | border-radius: 3px; 793 | padding: 5px; 794 | font-size: 14px; 795 | border: 1px solid #ccc; 796 | width: 310px; 797 | font-family: "Helvetica Neue", "Luxi Sans", "DejaVu Sans", Tahoma, "Hiragino Sans GB", "Microsoft Yahei", sans-serif; 798 | 799 | } 800 | 801 | .sl:focus { 802 | border: 1px solid rgba(128, 128, 160, 0.6); 803 | outline: none; 804 | } 805 | 806 | .sls { 807 | border-radius: 3px; 808 | padding: 5px; 809 | font-size: 14px; 810 | border: 1px solid #ccc; 811 | width: 240px; 812 | font-family: "Helvetica Neue", "Luxi Sans", "DejaVu Sans", Tahoma, "Hiragino Sans GB", "Microsoft Yahei"; 813 | } 814 | 815 | .sls:focus { 816 | border: 1px solid rgba(128, 128, 160, 0.6); 817 | outline: none; 818 | } 819 | 820 | .sll { 821 | border-radius: 3px; 822 | padding: 5px; 823 | font-size: 14px; 824 | border: 1px solid #ccc; 825 | width: 650px; 826 | font-family: "Helvetica Neue", "Luxi Sans", "DejaVu Sans", Tahoma, "Hiragino Sans GB", "Microsoft Yahei", sans-serif; 827 | } 828 | 829 | .sll:focus { 830 | border: 1px solid rgba(128, 128, 160, 0.6); 831 | outline: none; 832 | } 833 | 834 | .ml { 835 | border-radius: 3px; 836 | padding: 5px; 837 | font-size: 14px; 838 | border: 1px solid #ccc; 839 | display: block; 840 | width: 310px; 841 | height: 160px; 842 | font-family: "Helvetica Neue", "Luxi Sans", "DejaVu Sans", Tahoma, "Hiragino Sans GB", "Microsoft Yahei", sans-serif; 843 | } 844 | 845 | .ml:focus { 846 | border: 1px solid rgba(128, 128, 160, 0.6); 847 | outline: none; 848 | } 849 | 850 | /* Multi Line Large */ 851 | 852 | .mll { 853 | border-radius: 3px; 854 | padding: 5px; 855 | font-size: 14px; 856 | border: 1px solid #ccc; 857 | display: block; 858 | width: 650px; 859 | height: 8em; 860 | overflow-y: auto; 861 | font-family: "Helvetica Neue", "Luxi Sans", "DejaVu Sans", Tahoma, "Hiragino Sans GB", "Microsoft Yahei", sans-serif; 862 | resize: vertical; 863 | } 864 | 865 | .mll:focus { 866 | border: 1px solid rgba(128, 128, 160, 0.6); 867 | outline: none; 868 | } 869 | 870 | /* Multi Line Embedded */ 871 | 872 | .mle { 873 | border-radius: 3px; 874 | padding: 5px; 875 | font-size: 14px; 876 | border: 1px solid #ccc; 877 | display: block; 878 | width: 640px; 879 | height: 100px; 880 | font-family: "Helvetica Neue", "Luxi Sans", "DejaVu Sans", Tahoma, "Hiragino Sans GB", "Microsoft Yahei", sans-serif; 881 | resize: vertical; 882 | } 883 | 884 | .mle:focus { 885 | border: 1px solid rgba(128, 128, 160, 0.6); 886 | outline: none; 887 | } 888 | 889 | /* Markdown: Single Line */ 890 | 891 | ::-webkit-input-placeholder { 892 | color: #c0c0c0; 893 | } 894 | 895 | :-moz-placeholder { /* Firefox 18- */ 896 | color: #c0c0c0; 897 | } 898 | 899 | ::-moz-placeholder { /* Firefox 19+ */ 900 | color: #c0c0c0; 901 | } 902 | 903 | :-ms-input-placeholder { 904 | color: #c0c0c0; 905 | } 906 | 907 | .msl { 908 | width: 660px; 909 | border: none; 910 | resize: none; 911 | background-color: #f9f9f9; 912 | outline: none; 913 | font-size: 14px; 914 | line-height: 20px; 915 | padding: 10px; 916 | font-family: 'Helvetica Neue', 'Hiragino Sans GB', 'Microsoft Yahei', sans-serif; 917 | margin: 0px; 918 | } 919 | 920 | .msl:focus { 921 | background-color: #fff; 922 | } 923 | 924 | .short { 925 | height: 52px; 926 | } 927 | 928 | .tall { 929 | height: 320px; 930 | } 931 | 932 | .super.button { 933 | background-image: url("/static/img/bg_blended_light.png"); 934 | padding: 4px 15px 4px 15px; 935 | border: 1px solid rgba(80,80,90, 0.2); 936 | border-bottom-color: rgba(80,80,90, 0.35); 937 | border-radius: 3px; 938 | font-size: 12px; 939 | /*line-height: 12px;*/ 940 | outline: none; 941 | } 942 | 943 | .normal.button { 944 | background-color: #fff; 945 | color: #333; 946 | text-shadow: 0px 1px 0px #fff; 947 | text-decoration: none; 948 | font-weight: bold; 949 | box-shadow: 0px 1px 0px rgba(66, 66, 77, 0.1); 950 | } 951 | 952 | .normal.button:hover { 953 | background-color: #f9f9f9; 954 | border: 1px solid rgba(60,60,70,0.3); 955 | color: #333; 956 | text-shadow: 0px 1px 0px #fff; 957 | text-decoration: none; 958 | font-weight: bold; 959 | cursor: pointer; 960 | box-shadow: 0px 1px 0px rgba(66, 66, 77, 0.1); 961 | } 962 | 963 | .normal.button:active { 964 | background-color: #e2e2e2; 965 | color: #333; 966 | text-shadow: 0px 1px 0px #fff; 967 | text-decoration: none; 968 | font-weight: bold; 969 | cursor: pointer; 970 | box-shadow: 0px 1px 0px rgba(66, 66, 77, 0.1); 971 | } 972 | 973 | .special.button { background-color: #ffcc00; color: #532b17; text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.6); text-decoration: none; font-weight: 600; -moz-box-shadow: 0px 1px 2px rgba(233, 175, 0, 0.6); border: 1px solid rgba(200, 150, 0, 0.8); } 974 | 975 | .special.button:hover { background-color: #ffdf00; color: #402112; text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.7); text-decoration: none; text-decoration: none; font-weight: 600; cursor: pointer; -moz-box-shadow: 0px 1px 2px rgba(233, 175, 0, 0.5); border: 1px solid rgba(200, 150, 0, 1); } 976 | 977 | .special.button:active { background-color: #ffbb00; color: #402112; text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.7); text-decoration: none; text-decoration: none; font-weight: 600; cursor: pointer; -moz-box-shadow: 0px 1px 2px rgba(233, 175, 0, 0.5); border: 1px solid rgba(200, 150, 0, 1); } 978 | 979 | .inverse.button { background-color: #ccc; color: #999; text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.6); text-decoration: none; font-weight: 600; -moz-box-shadow: 0px 1px 2px rgba(200, 200, 200, 0.8); border: 1px solid rgba(150, 150, 150, 0.8); } 980 | 981 | .inverse.button:hover { background-color: #999; color: #fff; text-shadow: 0px -1px 1px rgba(0, 0, 0, 0.5); text-decoration: none; text-decoration: none; font-weight: 600; cursor: pointer; -moz-box-shadow: 0px 1px 2px rgba(200, 200, 200, 1); border: 1px solid rgba(150, 150, 150, 0.6); } 982 | 983 | .inverse.button:active { background-color: #888; color: #fff; text-shadow: 0px -1px 1px rgba(0, 0, 0, 0.5); text-decoration: none; text-decoration: none; font-weight: 600; cursor: pointer; -moz-box-shadow: 0px 1px 2px rgba(200, 200, 200, 1); border: 1px solid rgba(150, 150, 150, 0.6); } 984 | 985 | .item { 986 | background-position: 0 bottom; 987 | background-repeat: repeat-x; 988 | } 989 | 990 | .item_node { 991 | font-size: 12px; 992 | line-height: 12px; 993 | padding: 4px 10px 4px 10px; 994 | margin: 0px 5px 5px 0px; 995 | border-radius: 16px; 996 | display: inline-block; 997 | 998 | border: 1px solid #e5e5e5; 999 | } 1000 | 1001 | .item_node:hover { 1002 | text-decoration: none; 1003 | color: #333; 1004 | 1005 | border: 1px solid #ccc; 1006 | box-shadow: 0px 1px 2px rgba(0, 0, 32, 0.1); 1007 | } 1008 | 1009 | .item_node:active { 1010 | text-decoration: none; 1011 | background-color: #f9f9f9; 1012 | color: #333; 1013 | 1014 | border: 1px solid #ccc; 1015 | box-shadow: 0px 1px 2px rgba(0, 0, 32, 0.1) inset; 1016 | outline: none; 1017 | } 1018 | 1019 | .item_title { 1020 | font-size: 16px; 1021 | line-height: 130%; 1022 | text-shadow: 0px 1px 0px #fff; 1023 | word-wrap: break-word; 1024 | hyphens: auto; 1025 | } 1026 | 1027 | .item_hot_topic_title { 1028 | font-size: 13px; 1029 | line-height: 120%; 1030 | text-shadow: 0px 1px 0px #fff; 1031 | } 1032 | 1033 | .tag:link, .tag:visited { 1034 | padding: 5px 10px 5px 10px; 1035 | line-height: 100%; 1036 | background-color: #f0f0f0; 1037 | border-radius: 10px; 1038 | margin: 0px 5px 0px 5px; 1039 | display: inline-block; 1040 | } 1041 | 1042 | .tag:hover { 1043 | background-color: #99a; 1044 | color: #fff; 1045 | text-decoration: none; 1046 | } 1047 | 1048 | .tag>li { 1049 | opacity: .15; 1050 | } 1051 | 1052 | /* COUNT */ 1053 | 1054 | a.count_orange:link, a.count_orange:active { 1055 | line-height: 12px; 1056 | font-weight: bold; 1057 | color: white; 1058 | background-color: #ff9900; 1059 | display: inline-block; 1060 | padding: 2px 10px 2px 10px; 1061 | -moz-border-radius: 12px; 1062 | -webkit-border-radius: 12px; 1063 | border-radius: 12px; 1064 | text-decoration: none; 1065 | margin-right: 5px; 1066 | word-break: keep-all; 1067 | } 1068 | 1069 | a.count_orange:hover { 1070 | line-height: 12px; 1071 | font-weight: bold; 1072 | color: white; 1073 | background-color: #ffa722; 1074 | display: inline-block; 1075 | padding: 2px 10px 2px 10px; 1076 | -moz-border-radius: 12px; 1077 | -webkit-border-radius: 12px; 1078 | border-radius: 12px; 1079 | text-decoration: none; 1080 | } 1081 | 1082 | a.count_livid:link, a.count_livid:active { 1083 | line-height: 12px; 1084 | font-weight: bold; 1085 | color: white; 1086 | background-color: #aab0c6; 1087 | display: inline-block; 1088 | padding: 2px 10px 2px 10px; 1089 | -moz-border-radius: 12px; 1090 | -webkit-border-radius: 12px; 1091 | border-radius: 12px; 1092 | text-decoration: none; 1093 | margin-right: 5px; 1094 | word-break: keep-all; 1095 | } 1096 | 1097 | a.count_livid:hover { 1098 | line-height: 12px; 1099 | font-weight: bold; 1100 | color: white; 1101 | background-color: #969cb1; 1102 | display: inline-block; 1103 | padding: 2px 10px 2px 10px; 1104 | -moz-border-radius: 12px; 1105 | -webkit-border-radius: 12px; 1106 | border-radius: 12px; 1107 | text-decoration: none; 1108 | } 1109 | 1110 | a.count_blue:visited, a.count_green:visited, a.count_orange:visited, a.count_livid:visited { 1111 | line-height: 12px; 1112 | font-weight: bold; 1113 | color: white; 1114 | background-color: #e5e5e5; 1115 | display: inline-block; 1116 | padding: 2px 10px 2px 10px; 1117 | -moz-border-radius: 12px; 1118 | -webkit-border-radius: 12px; 1119 | border-radius: 12px; 1120 | text-decoration: none; 1121 | margin-right: 5px; 1122 | } 1123 | 1124 | /* PAGE */ 1125 | 1126 | .page_current { 1127 | display: inline-block; 1128 | font-weight: bold; 1129 | font-size: 14px; 1130 | line-height: 14px; 1131 | padding: 5px 8px 5px 8px; 1132 | background-color: #f0f0f0; 1133 | -moz-border-radius: 3px; 1134 | -webkit-border-radius: 3px; 1135 | border-radius: 3px; 1136 | margin: 0px 2px 0px 2px; 1137 | border: 1px solid #bbb; 1138 | color: #000; 1139 | box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1); 1140 | } 1141 | 1142 | .page_normal:link, .page_normal:visited, .page_normal:active { 1143 | display: inline-block; 1144 | font-weight: normal; 1145 | font-size: 13px; 1146 | line-height: 13px; 1147 | padding: 3px 6px 3px 6px; 1148 | background-color: #fff; 1149 | -moz-border-radius: 3px; 1150 | -webkit-border-radius: 3px; 1151 | border-radius: 3px; 1152 | margin: 0px 2px 0px 2px; 1153 | text-decoration: none; 1154 | border: 1px solid #e2e2e2; 1155 | box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1); 1156 | } 1157 | 1158 | .page_normal:hover { 1159 | display: inline-block; 1160 | font-weight: normal; 1161 | font-size: 13px; 1162 | line-height: 13px; 1163 | padding: 3px 6px 3px 6px; 1164 | background-color: #f0f0f0; 1165 | color: #000; 1166 | -moz-border-radius: 3px; 1167 | -webkit-border-radius: 3px; 1168 | border-radius: 3px; 1169 | margin: 0px 2px 0px 2px; 1170 | text-decoration: none; 1171 | border: 1px solid #ccc; 1172 | } 1173 | 1174 | .online { 1175 | color: #fff; 1176 | font-size: 10px; 1177 | line-height: 10px; 1178 | font-weight: 500; 1179 | padding: 2px 5px 2px 5px; 1180 | -moz-border-radius: 10px; 1181 | -webkit-border-radius: 10px; 1182 | border-radius: 10px; 1183 | display: inline-block; 1184 | 1185 | background: #52bf1c; 1186 | background: -moz-linear-gradient(top, #52bf1c 0%, #438906 100%); 1187 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#52bf1c), color-stop(100%,#438906)); 1188 | background: -webkit-linear-gradient(top, #52bf1c 0%,#438906 100%); 1189 | background: -o-linear-gradient(top, #52bf1c 0%,#438906 100%); 1190 | background: -ms-linear-gradient(top, #52bf1c 0%,#438906 100%); 1191 | background: linear-gradient(top, #52bf1c 0%,#438906 100%); 1192 | filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#52bf1c', endColorstr='#438906',GradientType=0 ); 1193 | } 1194 | 1195 | .payload { 1196 | display: inline-block; 1197 | background-color: #f5f5f5; 1198 | padding: 5px 10px 5px 10px; 1199 | font-size: 14px; 1200 | line-height: 120%; 1201 | -moz-border-radius: 3px; 1202 | -webkit-border-radius: 3px; 1203 | border-radius: 3px; 1204 | word-break: break-all; 1205 | word-wrap: break-word; 1206 | } 1207 | 1208 | /* BALANCE */ 1209 | 1210 | a.balance_area:link, a.balance_area:visited, .balance_area { 1211 | color: #000; 1212 | font-size: 11px; 1213 | line-height: 16px; 1214 | padding: 5px 10px 5px 10px; 1215 | -moz-border-radius: 20px; 1216 | -webkit-border-radius: 20px; 1217 | border-radius: 20px; 1218 | text-decoration: none; 1219 | color: #666; 1220 | text-shadow: 0px 1px 0px white; 1221 | display: inline-block; 1222 | margin: -4px -5px 0px 0px; 1223 | 1224 | background: #f5f5f5; 1225 | background: -moz-linear-gradient(top, #f5f5f5 0%, #e2e2e2 100%); 1226 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f5f5f5), color-stop(100%,#e2e2e2)); 1227 | background: -webkit-linear-gradient(top, #f5f5f5 0%,#e2e2e2 100%); 1228 | background: -o-linear-gradient(top, #f5f5f5 0%,#e2e2e2 100%); 1229 | background: -ms-linear-gradient(top, #f5f5f5 0%,#e2e2e2 100%); 1230 | background: linear-gradient(top, #f5f5f5 0%,#e2e2e2 100%); 1231 | filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#e2e2e2',GradientType=0 ); 1232 | } 1233 | 1234 | a.balance_area:active { 1235 | text-decoration: none; 1236 | color: #333; 1237 | color: #000; 1238 | 1239 | background: #f0f0f0; 1240 | background: -moz-linear-gradient(top, #f0f0f0 0%, #c9c9c9 100%); 1241 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f0f0f0), color-stop(100%,#c9c9c9)); 1242 | background: -webkit-linear-gradient(top, #f0f0f0 0%,#c9c9c9 100%); 1243 | background: -o-linear-gradient(top, #f0f0f0 0%,#c9c9c9 100%); 1244 | background: -ms-linear-gradient(top, #f0f0f0 0%,#c9c9c9 100%); 1245 | background: linear-gradient(top, #f0f0f0 0%,#c9c9c9 100%); 1246 | filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f0f0f0', endColorstr='#c9c9c9',GradientType=0 ); 1247 | } 1248 | 1249 | a.balance_area:hover { 1250 | text-decoration: none; 1251 | color: #333; 1252 | color: #000; 1253 | 1254 | background: #f9f9f9; 1255 | background: -moz-linear-gradient(top, #f9f9f9 0%, #f0f0f0 100%); 1256 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f9f9f9), color-stop(100%,#f0f0f0)); 1257 | background: -webkit-linear-gradient(top, #f9f9f9 0%,#f0f0f0 100%); 1258 | background: -o-linear-gradient(top, #f9f9f9 0%,#f0f0f0 100%); 1259 | background: -ms-linear-gradient(top, #f9f9f9 0%,#f0f0f0 100%); 1260 | background: linear-gradient(top, #f9f9f9 0%,#f0f0f0 100%); 1261 | filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f9f9f9', endColorstr='#f0f0f0',GradientType=0 ); 1262 | } 1263 | 1264 | /* DATA */ 1265 | 1266 | table.data { 1267 | 1268 | } 1269 | 1270 | table.data td.h, table.data th.h { 1271 | text-align: left; 1272 | font-size: 12px; 1273 | font-weight: bold; 1274 | border-right: 1px solid #ccc; 1275 | border-bottom: 2px solid #ccc; 1276 | text-shadow: 0px 1px 0px #fff; 1277 | 1278 | background: #f5f5f5; 1279 | background: -moz-linear-gradient(top, #f5f5f5 0%, #e2e2e2 100%); 1280 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f5f5f5), color-stop(100%,#e2e2e2)); 1281 | background: -webkit-linear-gradient(top, #f5f5f5 0%,#e2e2e2 100%); 1282 | background: -o-linear-gradient(top, #f5f5f5 0%,#e2e2e2 100%); 1283 | background: -ms-linear-gradient(top, #f5f5f5 0%,#e2e2e2 100%); 1284 | background: linear-gradient(top, #f5f5f5 0%,#e2e2e2 100%); 1285 | filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#e2e2e2',GradientType=0 ); 1286 | } 1287 | 1288 | table.data td.d { 1289 | text-align: left; 1290 | font-size: 12px; 1291 | font-weight: normal; 1292 | border-right: 1px solid #ccc; 1293 | border-bottom: 1px solid #ccc; 1294 | } 1295 | 1296 | .positive { 1297 | color: #0aa31c; 1298 | } 1299 | 1300 | .negative { 1301 | color: #ff3c00; 1302 | } 1303 | 1304 | .note { 1305 | font-size: 15px; 1306 | line-height: 150%; 1307 | font-family: "Helvetica Neue", "Arial", "Hiragino Sans GB", 'Microsoft Yahei', sans-serif; 1308 | } 1309 | 1310 | .note_item { 1311 | padding: 10px; 1312 | font-size: 12px; 1313 | line-height: 100%; 1314 | text-align: left; 1315 | border-bottom: 1px solid #e2e2e2; 1316 | } 1317 | 1318 | .note_item:hover { 1319 | background-color: #f9f9f9; 1320 | } 1321 | 1322 | .note_item_icon_arrow { 1323 | display: inline-block; 1324 | width: 16px; 1325 | height: 16px; 1326 | vertical-align: middle; 1327 | background-image: url("/static/img/ico_arrow.png"); 1328 | background-repeat: no-repeat; 1329 | margin-right: 8px; 1330 | margin-top: -2px; 1331 | } 1332 | 1333 | .note_item_icon_code { 1334 | display: inline-block; 1335 | width: 16px; 1336 | height: 16px; 1337 | vertical-align: middle; 1338 | background-image: url("/static/img/ico_code.png"); 1339 | background-repeat: no-repeat; 1340 | margin-right: 8px; 1341 | margin-top: -2px; 1342 | } 1343 | 1344 | .note_item_icon_note { 1345 | display: inline-block; 1346 | width: 16px; 1347 | height: 16px; 1348 | vertical-align: middle; 1349 | background-image: url("/static/img/ico_note.png"); 1350 | background-repeat: no-repeat; 1351 | margin-right: 8px; 1352 | margin-top: -2px; 1353 | } 1354 | 1355 | .note_item_icon_note_arrow { 1356 | display: inline-block; 1357 | width: 16px; 1358 | height: 16px; 1359 | vertical-align: middle; 1360 | background-image: url("/static/img/ico_note_arrow.png"); 1361 | background-repeat: no-repeat; 1362 | margin-right: 8px; 1363 | margin-top: -2px; 1364 | } 1365 | 1366 | .note_item_icon_document_rich { 1367 | display: inline-block; 1368 | width: 16px; 1369 | height: 16px; 1370 | vertical-align: middle; 1371 | background-image: url("/static/img/ico_document_rich.png"); 1372 | background-repeat: no-repeat; 1373 | margin-right: 8px; 1374 | margin-top: -2px; 1375 | } 1376 | 1377 | .note_item_icon_folder { 1378 | display: inline-block; 1379 | width: 16px; 1380 | height: 16px; 1381 | vertical-align: middle; 1382 | background-image: url("/static/img/ico_folder_blue.png"); 1383 | background-repeat: no-repeat; 1384 | margin-right: 8px; 1385 | margin-top: -2px; 1386 | } 1387 | 1388 | .note_item_info { 1389 | display: inline-block; 1390 | float: right; 1391 | color: #999; 1392 | vertical-align: middle; 1393 | margin-top: 3px; 1394 | } 1395 | 1396 | .note_item_title { 1397 | display: inline-block; 1398 | font-size: 14px; 1399 | line-height: 120%; 1400 | } 1401 | 1402 | #editor { 1403 | position: relative; 1404 | width: auto; 1405 | height: 600px; 1406 | font-size: 16px; 1407 | line-height: 130%; 1408 | } 1409 | 1410 | .event_badge { 1411 | float: left; 1412 | display: block; 1413 | width: 40px; 1414 | text-align: center; 1415 | padding: 0px 10px 0px 10px; 1416 | border-left: 4px solid #e2e2e2; 1417 | vertical-align: top; 1418 | } 1419 | 1420 | .event_day { 1421 | font-size: 24px; 1422 | line-height: 24px; 1423 | font-weight: bold; 1424 | color: #000; 1425 | margin: 5px 0px 5px 0px; 1426 | } 1427 | 1428 | .event_month { 1429 | font-size: 14px; 1430 | line-height: 14px; 1431 | font-weight: bold; 1432 | color: #999; 1433 | } 1434 | 1435 | .event_body { 1436 | display: block; 1437 | margin-left: 74px; 1438 | } 1439 | 1440 | .event_title { 1441 | font-size: 15px; 1442 | line-height: 20px; 1443 | font-weight: 500; 1444 | margin-bottom: 5px; 1445 | } 1446 | 1447 | .event_brief { 1448 | font-size: 14px; 1449 | line-height: 120%; 1450 | color: #666; 1451 | margin-top: 10px; 1452 | margin-bottom: 10px; 1453 | } 1454 | 1455 | .event_location { 1456 | font-size: 11px; 1457 | line-height: 20px; 1458 | color: #999; 1459 | } 1460 | 1461 | .event_ops { 1462 | padding-top: 5px; 1463 | font-size: 12px; 1464 | line-height: 12px; 1465 | color: #ccc; 1466 | } 1467 | 1468 | img.avatar { 1469 | -moz-border-radius: 4px; 1470 | border-radius: 4px; 1471 | } 1472 | 1473 | a.img_sq { 1474 | min-width: 160px; 1475 | min-height: 160px; 1476 | text-align: center; 1477 | vertical-align: bottom; 1478 | border: none; 1479 | padding: 5px; 1480 | display: inline-block; 1481 | text-decoration: none; 1482 | background-color: #fff; 1483 | } 1484 | 1485 | a.img_sq:hover { 1486 | text-decoration: none; 1487 | background-color: #f0f0f0; 1488 | border-radius: 3px; 1489 | } 1490 | 1491 | a.img_sqm { 1492 | text-align: center; 1493 | vertical-align: bottom; 1494 | border: none; 1495 | padding: 4px 0px 0px 4px; 1496 | display: inline-block; 1497 | text-decoration: none; 1498 | background-color: #fff; 1499 | } 1500 | 1501 | a.img_sqm:hover { 1502 | text-decoration: none; 1503 | background-color: #f0f0f0; 1504 | border-radius: 3px; 1505 | } 1506 | 1507 | a.btn_hero { 1508 | background-color: #fff; 1509 | border: 1px solid #778087; 1510 | font-size: 18px; 1511 | line-height: 18px; 1512 | padding: 10px 20px 10px 20px; 1513 | border-radius: 5px; 1514 | } 1515 | 1516 | a.btn_hero:hover { 1517 | color: #fff; 1518 | background-color: #778087; 1519 | text-decoration: none; 1520 | } 1521 | 1522 | .votes { 1523 | display: inline-block; 1524 | } 1525 | 1526 | .vote:link, .vote:visited, .vote { 1527 | text-decoration: none; 1528 | font-size: 10px; 1529 | line-height: 1; 1530 | padding: 2px 8px 2px 8px; 1531 | border: 1px solid #e2e2e2; 1532 | border-radius: 3px; 1533 | color: #778; 1534 | display: inline-block; 1535 | vertical-align: baseline; 1536 | text-align: center; 1537 | } 1538 | 1539 | .vote:hover { 1540 | color: #667; 1541 | border: 1px solid #667; 1542 | text-decoration: none; 1543 | } 1544 | 1545 | .vote:active { 1546 | background-color: #f0f0f0; 1547 | border: 1px solid #aaa; 1548 | box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.2) inset; 1549 | } 1550 | 1551 | .note>*:first-child, .markdown_body>*:first-child, .page>*:first-child { 1552 | margin-top: 0 !important; 1553 | } 1554 | 1555 | .note>*:last-child, .markdown_body>*:last-child, .problem>*:last-child, .page>*:last-child { 1556 | margin-bottom: 0 !important; 1557 | } 1558 | 1559 | .markdown_body>p>img { 1560 | max-width: 660px; 1561 | } 1562 | 1563 | .markdown_body table { 1564 | border-collapse: collapse; 1565 | } 1566 | 1567 | .markdown_body td, .markdown_body th { 1568 | border: 1px solid #e2e2e2; 1569 | padding: 6px 10px 6px 10px; 1570 | } --------------------------------------------------------------------------------