public static function vxBuild($user_id, $weblog_id)
 {
     $start = microtime(true);
     $Weblog = new Weblog($weblog_id);
     if ($start - $Weblog->blg_lastbuilt < BABEL_WEBLOG_BUILD_INTERVAL) {
         $_SESSION['babel_message_weblog'] = _vo_ico_silk('clock') . ' 距离上次构建时间尚不足 ' . BABEL_WEBLOG_BUILD_INTERVAL . ' 秒,本次操作取消,请等待 ' . (BABEL_WEBLOG_BUILD_INTERVAL - intval($start - $Weblog->blg_lastbuilt)) . ' 秒之后再试验';
     } else {
         require_once BABEL_PREFIX . '/libs/textile/classTextile.php';
         require_once BABEL_PREFIX . '/libs/markdown/markdown.php';
         require_once BABEL_PREFIX . '/libs/htmlpurifier/library/HTMLPurifier.auto.php';
         $purifier_config = HTMLPurifier_Config::createDefault();
         $purifier_config->set('Core', 'Encoding', 'UTF-8');
         $purifier_config->set('HTML', 'Doctype', 'XHTML 1.0 Transitional');
         $purifier = new HTMLPurifier($purifier_config);
         $Textile = new Textile();
         $bytes = 0;
         $files = 0;
         /* check user home directory */
         $usr_dir = BABEL_WEBLOG_PREFIX . '/' . BABEL_WEBLOG_WWWROOT . '/' . $Weblog->blg_name;
         if (!file_exists($usr_dir)) {
             mkdir($usr_dir);
         }
         /* clean old files */
         foreach (glob($usr_dir . '/*.html') as $filename) {
             unlink($filename);
         }
         foreach (glob($usr_dir . '/*.css') as $filename) {
             unlink($filename);
         }
         foreach (glob($usr_dir . '/*.rss') as $filename) {
             unlink($filename);
         }
         $s = new Smarty();
         $s->template_dir = BABEL_PREFIX . '/res/weblog/themes/' . $Weblog->blg_theme;
         if (!is_dir(BABEL_PREFIX . '/tplc/' . $Weblog->blg_theme)) {
             mkdir(BABEL_PREFIX . '/tplc/' . $Weblog->blg_theme);
         }
         $s->compile_dir = BABEL_PREFIX . '/tplc/' . $Weblog->blg_theme;
         $s->cache_dir = BABEL_PREFIX . '/cache/smarty';
         $s->config_dir = BABEL_PREFIX . '/cfg';
         $s->assign('ico_feed', 'http://' . BABEL_WEBLOG_SITE_STATIC . '/img/icons/silk/feed.png');
         $s->assign('site_theme', $Weblog->blg_theme);
         $s->assign('site_static', BABEL_WEBLOG_SITE_STATIC);
         $s->assign('site_babel', BABEL_DNS_NAME);
         $s->assign('site_weblog_root', 'http://' . BABEL_WEBLOG_SITE . '/' . $Weblog->blg_name . '/');
         $s->assign('site_url', 'http://' . BABEL_WEBLOG_SITE . '/' . $Weblog->blg_name . '/');
         $s->assign('site_title', make_plaintext($Weblog->blg_title));
         $s->assign('site_description', make_plaintext($Weblog->blg_description));
         $s->assign('site_category', make_plaintext(Vocabulary::site_name));
         $s->assign('site_lang', 'en');
         $s->assign('license_show', $Weblog->blg_license_show);
         $s->assign('license_code', Weblog::vxGetLicenseCode($Weblog->blg_license));
         $s->assign('built', date('Y-n-j G:i:s T', time()));
         $s->assign('user_nick', $Weblog->usr_nick);
         $s->assign('user_nick_plain', make_plaintext($Weblog->usr_nick));
         $s->assign('user_nick_url', urlencode($Weblog->usr_nick));
         $s->assign('user_brief_plain', make_plaintext($Weblog->usr_brief));
         $s->assign('user_created_plain_short', date('n/j/Y', $Weblog->usr_created));
         if ($Weblog->usr_portrait == '') {
             $s->assign('user_portrait', '/img/p_' . $Weblog->usr_gender . '.gif');
             $s->assign('user_portrait_s', '/img/p_' . $Weblog->usr_gender . '_s.gif');
             $s->assign('user_portrait_n', '/img/p_' . $Weblog->usr_gender . '_n.gif');
         } else {
             $s->assign('user_portrait', '/img/p/' . $Weblog->usr_portrait . '.' . BABEL_PORTRAIT_EXT);
             $s->assign('user_portrait_s', '/img/p/' . $Weblog->usr_portrait . '_s.' . BABEL_PORTRAIT_EXT);
             $s->assign('user_portrait_n', '/img/p/' . $Weblog->usr_portrait . '_n.' . BABEL_PORTRAIT_EXT);
         }
         $s->assign('user_ing', $Weblog->blg_ing);
         $s->assign('google_analytics', '<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script><script type="text/javascript">_uacct = "UA-841322-3"; urchinTracker();</script>');
         $sql = "SELECT DISTINCT bet_tag FROM babel_weblog_entry_tag WHERE bet_eid IN (SELECT bge_id FROM babel_weblog_entry WHERE bge_pid = {$Weblog->blg_id}) ORDER BY bet_tag ASC";
         $rs = mysql_query($sql);
         $_tags = array();
         while ($_tag = mysql_fetch_array($rs)) {
             $_tags[] = $_tag;
         }
         mysql_free_result($rs);
         $s->assign('tags', $_tags);
         $links = array();
         foreach ($Weblog->blg_links as $category) {
             $category['category'] = str_replace('\\|', '|', $category['category']);
             $category_md5 = md5($category['category']);
             if (count($category['links']) > 0) {
                 $links[$category_md5] = array();
                 $links[$category_md5]['category'] = make_plaintext($category['category']);
                 $links[$category_md5]['links'] = array();
                 foreach ($category['links'] as $link) {
                     $link['title'] = str_replace('\\|', '|', $link['title']);
                     $link_md5 = md5($link['url']);
                     $links[$category_md5]['links'][$link_md5] = array();
                     $links[$category_md5]['links'][$link_md5]['title'] = make_plaintext($link['title']);
                     $links[$category_md5]['links'][$link_md5]['url'] = make_plaintext($link['url']);
                 }
             }
         }
         $s->assign('links', $links);
         if ($Weblog->blg_theme == 'cloud') {
             $sql_order = "ASC";
             $sql_limit_index = "";
         } else {
             $sql_order = "DESC";
             $sql_limit_index = "LIMIT 10";
         }
         /* S: index.smarty */
         $sql = "SELECT bge_id, bge_title, bge_body, bge_mode, bge_tags, bge_comments, bge_trackbacks, bge_comment_permission, bge_published, usr_id, usr_nick FROM babel_weblog_entry, babel_user WHERE bge_uid = usr_id AND bge_uid = {$Weblog->usr_id} AND bge_pid = {$Weblog->blg_id} AND bge_status = 1 ORDER BY bge_published {$sql_order} {$sql_limit_index}";
         $rs = mysql_query($sql);
         $entries_count = mysql_num_rows($rs);
         $_entries = array();
         $_ids = array();
         $i = 0;
         while ($_entry = mysql_fetch_array($rs)) {
             $i++;
             $_entries[$_entry['bge_id']] = $_entry;
             $_ids[$i] = $_entry['bge_id'];
             if ($i == 1) {
                 $_entries[$_entry['bge_id']]['first'] = 1;
             } else {
                 $_entries[$_entry['bge_id']]['first'] = 0;
             }
             if ($i == $entries_count) {
                 $_entries[$_entry['bge_id']]['last'] = 1;
             } else {
                 $_entries[$_entry['bge_id']]['last'] = 0;
             }
             if ($_entries[$_entry['bge_id']]['first'] == 0 && $_entries[$_entry['bge_id']]['first'] == 1) {
                 $_entries[$_entry['bge_id']]['middle'] = 1;
             } else {
                 $_entries[$_entry['bge_id']]['middle'] = 0;
             }
             $_entries[$_entry['bge_id']]['url'] = 'http://' . BABEL_WEBLOG_SITE . '/' . $Weblog->blg_name . '/entry-' . $_entry['bge_id'] . '.html';
             $_entries[$_entry['bge_id']]['url_url'] = urlencode($_entries[$_entry['bge_id']]['url']);
             $_entries[$_entry['bge_id']]['bge_title_plain'] = make_plaintext($_entry['bge_title']);
             $_entries[$_entry['bge_id']]['bge_title_url'] = urlencode($_entry['bge_title']);
             $_entries[$_entry['bge_id']]['usr_nick_plain'] = make_plaintext($_entry['usr_nick']);
             $_entries[$_entry['bge_id']]['usr_nick_url'] = urlencode($_entry['usr_nick']);
             $_entries[$_entry['bge_id']]['bge_published_plain'] = date('Y-n-j G:i:s T', $_entry['bge_published']);
             switch (intval($_entry['bge_mode'])) {
                 case 0:
                     // plain text
                     $_entries[$_entry['bge_id']]['bge_body_plain'] = make_plaintext(trim($_entry['bge_body']));
                     break;
                 case 1:
                     // html
                     $_entries[$_entry['bge_id']]['bge_body_plain'] = $purifier->purify($_entry['bge_body']);
                     break;
                 case 2:
                     // ubb
                     $_entries[$_entry['bge_id']]['bge_body_plain'] = format_ubb($_entry['bge_body']);
                     break;
                 case 3:
                     // textile
                     $_entries[$_entry['bge_id']]['bge_body_plain'] = $purifier->purify($Textile->TextileThis($_entry['bge_body']));
                     break;
                 case 4:
                     //
                     $_entries[$_entry['bge_id']]['bge_body_plain'] = $purifier->purify(Markdown($_entry['bge_body']));
                     break;
             }
             $_entries[$_entry['bge_id']]['bge_body_plain_rss'] = htmlspecialchars($_entries[$_entry['bge_id']]['bge_body_plain']);
             if ($_entry['bge_tags'] == '') {
                 $_entries[$_entry['bge_id']]['bge_tags_plain'] = '';
                 $_entries[$_entry['bge_id']]['bge_tags_plain_comma'] = '';
             } else {
                 $_entries[$_entry['bge_id']]['bge_tags_plain'] = Weblog::vxMakeTagLink($_entry['bge_tags']);
                 $_entries[$_entry['bge_id']]['bge_tags_plain_comma'] = Weblog::vxMakeTagLinkComma($_entry['bge_tags']);
             }
             $_entries[$_entry['bge_id']]['bge_published_plain_short'] = date('m/d/Y', $_entry['bge_published']);
             $_entries[$_entry['bge_id']]['bge_published_plain_long'] = date('m/d/Y H:i:s T', $_entry['bge_published']);
         }
         mysql_free_result($rs);
         $i = 0;
         foreach ($_ids as $num => $id) {
             $i++;
             $next = $i + 1;
             $prev = $i - 1;
             if (isset($_ids[$next])) {
                 $_entries[$id]['next'] = $_ids[$next];
             } else {
                 $_entries[$id]['next'] = 0;
             }
             if (isset($_ids[$prev])) {
                 $_entries[$id]['prev'] = $_ids[$prev];
             } else {
                 $_entries[$id]['prev'] = 0;
             }
         }
         $s->assign('entries', $_entries);
         $file_index = $usr_dir . '/index.html';
         $o_index = $s->fetch('index.smarty');
         $files++;
         $bytes += file_put_contents($file_index, $o_index);
         $file_feed_main = $usr_dir . '/index.rss';
         $o_feed_main = $s->fetch('feed.smarty');
         $files++;
         $bytes += file_put_contents($file_feed_main, $o_feed_main);
         /* E: index.smarty */
         /* S: tag.smarty */
         foreach ($_tags as $tag) {
             $s->assign('tag_cur', $tag['bet_tag']);
             $tag_sql = mysql_real_escape_string($tag['bet_tag']);
             $sql = "SELECT bge_id, bge_title, bge_body, bge_tags, bge_comments, bge_trackbacks, bge_mode, bge_comment_permission, bge_published, usr_id, usr_nick FROM babel_weblog_entry, babel_user WHERE bge_uid = usr_id AND bge_uid = {$Weblog->usr_id} AND bge_pid = {$Weblog->blg_id} AND bge_status = 1 AND bge_id IN (SELECT bet_eid FROM babel_weblog_entry_tag WHERE bet_tag = '{$tag_sql}') ORDER BY bge_published {$sql_order}";
             $rs = mysql_query($sql);
             $_entries = array();
             $i = 0;
             while ($_entry = mysql_fetch_array($rs)) {
                 $i++;
                 $_entries[$_entry['bge_id']] = $_entry;
                 $_entries[$_entry['bge_id']]['url'] = 'http://' . BABEL_WEBLOG_SITE . '/' . $Weblog->blg_name . '/entry-' . $_entry['bge_id'] . '.html';
                 $_entries[$_entry['bge_id']]['url_url'] = urlencode($_entries[$_entry['bge_id']]['url']);
                 $_entries[$_entry['bge_id']]['bge_title_plain'] = make_plaintext($_entry['bge_title']);
                 $_entries[$_entry['bge_id']]['bge_title_url'] = urlencode($_entry['bge_title']);
                 $_entries[$_entry['bge_id']]['usr_nick_plain'] = make_plaintext($_entry['usr_nick']);
                 $_entries[$_entry['bge_id']]['usr_nick_url'] = urlencode($_entry['usr_nick']);
                 $_entries[$_entry['bge_id']]['bge_published_plain'] = date('Y-n-j G:i:s T', $_entry['bge_published']);
                 switch (intval($_entry['bge_mode'])) {
                     case 0:
                         // plain text
                         $_entries[$_entry['bge_id']]['bge_body_plain'] = make_plaintext(trim($_entry['bge_body']));
                         break;
                     case 1:
                         // html
                         $_entries[$_entry['bge_id']]['bge_body_plain'] = $purifier->purify($_entry['bge_body']);
                         break;
                     case 2:
                         // ubb
                         $_entries[$_entry['bge_id']]['bge_body_plain'] = format_ubb($_entry['bge_body']);
                         break;
                     case 3:
                         // textile
                         $_entries[$_entry['bge_id']]['bge_body_plain'] = $purifier->purify($Textile->TextileThis($_entry['bge_body']));
                         break;
                     case 4:
                         //
                         $_entries[$_entry['bge_id']]['bge_body_plain'] = $purifier->purify(Markdown($_entry['bge_body']));
                         break;
                 }
                 $_entries[$_entry['bge_id']]['bge_body_plain_rss'] = htmlspecialchars($_entries[$_entry['bge_id']]['bge_body_plain']);
                 if ($_entry['bge_tags'] == '') {
                     $_entries[$_entry['bge_id']]['bge_tags_plain'] = '';
                 } else {
                     $_entries[$_entry['bge_id']]['bge_tags_plain'] = Weblog::vxMakeTagLink($_entry['bge_tags']);
                 }
                 if ($_entry['bge_tags'] == '') {
                     $_entries[$_entry['bge_id']]['bge_tags_plain_comma'] = '';
                 } else {
                     $_entries[$_entry['bge_id']]['bge_tags_plain_comma'] = Weblog::vxMakeTagLinkComma($_entry['bge_tags']);
                 }
                 $_entries[$_entry['bge_id']]['bge_published_plain_short'] = date('m/d/Y', $_entry['bge_published']);
                 $_entries[$_entry['bge_id']]['bge_published_plain_long'] = date('m/d/Y H:i:s T', $_entry['bge_published']);
             }
             mysql_free_result($rs);
             $s->assign('entries', $_entries);
             $s->assign('count_tag_cur', $i);
             $file_tag = $usr_dir . '/tag-' . $tag['bet_tag'] . '.html';
             $o_tag = $s->fetch('tag.smarty');
             $files++;
             $bytes += file_put_contents($file_tag, $o_tag);
             $file_feed_tag = $usr_dir . '/tag-' . $tag['bet_tag'] . '.rss';
             $o_feed_tag = $s->fetch('feed_tag.smarty');
             $files++;
             $bytes += file_put_contents($file_feed_tag, $o_feed_tag);
         }
         /* E: tag.smarty */
         /* S: entry.smarty */
         $sql = "SELECT bge_id, bge_title, bge_body, bge_tags, bge_comments, bge_trackbacks, bge_mode, bge_comment_permission, bge_published, usr_id, usr_nick FROM babel_weblog_entry, babel_user WHERE bge_uid = usr_id AND bge_uid = {$Weblog->usr_id} AND bge_pid = {$Weblog->blg_id} AND bge_status = 1 ORDER BY bge_published {$sql_order}";
         $rs = mysql_query($sql);
         $i = 0;
         while ($_entry = mysql_fetch_array($rs)) {
             $i++;
             $next = $i + 1;
             $prev = $i - 1;
             if (isset($_ids[$next])) {
                 $_entry['next'] = $_ids[$next];
             } else {
                 $_entry['next'] = 0;
             }
             if (isset($_ids[$prev])) {
                 $_entry['prev'] = $_ids[$prev];
             } else {
                 $_entry['prev'] = 0;
             }
             $_entry['url'] = 'http://' . BABEL_WEBLOG_SITE . '/' . $Weblog->blg_name . '/entry-' . $_entry['bge_id'] . '.html';
             $_entry['url_url'] = urlencode($_entry['url']);
             $_entry['bge_title_plain'] = make_plaintext($_entry['bge_title']);
             $_entry['bge_title_url'] = urlencode($_entry['bge_title']);
             $_entry['usr_nick_plain'] = make_plaintext($_entry['usr_nick']);
             $_entry['usr_nick_url'] = urlencode($_entry['usr_nick']);
             $_entry['bge_body_plain'] = make_plaintext($_entry['bge_body']);
             $_entry['bge_published_plain'] = date('Y-n-j G:i:s T', $_entry['bge_published']);
             switch (intval($_entry['bge_mode'])) {
                 case 0:
                     // plain text
                     $_entry['bge_body_plain'] = make_plaintext(trim($_entry['bge_body']));
                     break;
                 case 1:
                     // html
                     $_entry['bge_body_plain'] = $purifier->purify($_entry['bge_body']);
                     break;
                 case 2:
                     // ubb
                     $_entry['bge_body_plain'] = format_ubb($_entry['bge_body']);
                     break;
                 case 3:
                     // textile
                     $_entry['bge_body_plain'] = $purifier->purify($Textile->TextileThis($_entry['bge_body']));
                     break;
                 case 4:
                     //
                     $_entry['bge_body_plain'] = $purifier->purify(Markdown($_entry['bge_body']));
                     break;
             }
             if ($_entry['bge_tags'] == '') {
                 $_entry['bge_tags_plain'] = '';
             } else {
                 $_entry['bge_tags_plain'] = Weblog::vxMakeTagLink($_entry['bge_tags']);
             }
             if ($_entry['bge_tags'] == '') {
                 $_entry['bge_tags_plain_comma'] = '';
             } else {
                 $_entry['bge_tags_plain_comma'] = Weblog::vxMakeTagLinkComma($_entry['bge_tags']);
             }
             $_entry['bge_published_plain_short'] = date('m/d/Y', $_entry['bge_published']);
             $_entry['bge_published_plain_long'] = date('m/d/Y H:i:s T', $_entry['bge_published']);
             $file_entry = $usr_dir . '/entry-' . $_entry['bge_id'] . '.html';
             $s->assign('entry', $_entry);
             $o_entry = $s->fetch('entry.smarty');
             $files++;
             $bytes += file_put_contents($file_entry, $o_entry);
         }
         /* style.smarty */
         $file_style = $usr_dir . '/style.css';
         $s->left_delimiter = '[';
         $s->right_delimiter = ']';
         $o_style = $s->fetch('style.smarty');
         $files++;
         $bytes += file_put_contents($file_style, $o_style);
         $s->left_delimiter = '{';
         $s->right_delimiter = '}';
         $Weblog->vxAddBuild();
         $Weblog->vxTouchBuild();
         $Weblog->vxUpdateComments();
         // Ping Ping-o-Matic
         /*
         require_once('Zend/Http/Client.php');
         $blg_url_url = urlencode('http://' . BABEL_WEBLOG_SITE . '/' . $Weblog->blg_name . '/');
         $blg_title_url = urlencode($Weblog->blg_title);
         $ping = 'http://pingomatic.com/ping/?title=' . $blg_title_url . '&blogurl=' . $blg_url_url . '&rssurl=&chk_weblogscom=on&chk_blogs=on&chk_technorati=on&chk_feedburner=on&chk_newsgator=on&chk_feedster=on&chk_myyahoo=on&chk_blogstreet=on&chk_icerocket=on';
         $client = new Zend_Http_Client($ping, array('timeout' => 15));
         try {
         	$client->request();
         } catch (Exception $e) {
         }
         */
         $end = microtime(true);
         $elapsed = $end - $start;
         $_SESSION['babel_message_weblog'] = _vo_ico_silk('tick') . ' 博客网站 ' . make_plaintext($Weblog->blg_title) . ' 基于 ' . $Weblog->blg_theme . ' 主题重新构建成功,' . $files . ' 个文件共写入了 ' . $bytes . ' 字节,共耗时 <small>' . $elapsed . '</small> 秒,<a href="http://' . BABEL_WEBLOG_SITE . '/' . $Weblog->blg_name . '/?.rand=' . rand(11, 99) . '" class="t" target="_blank">现在查看</a> <img src="/img/ext.png" align="absmiddle" />';
     }
 }