<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
class Snippet extends NEW_Controller
{
public function __construct()
{
parent::__construct();
$this->lang->load('snippet');
$this->load->model('snippet_m');
$this->load->library('geshilib');
$this->load->helper('bbcode');
}
private $languages = array(
'asm' => 'Assembler',
'autohotkey' => 'AutoHotkey',
'autoit' => 'AutoIt',
'c' => 'C',
'cpp' => 'C++',
'csharp' => 'C#',
'css' => 'CSS',
'd' => 'D',
'delphi' => 'Delphi',
'fsharp' => 'F#',
'go' => 'Go',
'html5' => 'HTML',
'java' => 'Java',
'javascript' => 'JavaScript',
'lua' => 'LUA',
'objc' => 'Objective-C',
'pascal' => 'Pascal',
'perl' => 'Perl',
'php' => 'PHP',
'python' => 'Python',
'sql' => 'SQL',
'text' => 'Text',
'vb' => 'Visual Basic'
);
// /snippet
public function Index()
{
$data['newest_snippets'] = $this->snippet_m->GetNewestSnippets($this->config->item('snippet_per_page_count'));
foreach ($data['newest_snippets'] as &$snippet)
{
$snippet['snippet_url'] = site_url(array('snippet', 'view', $snippet['snippet_id'], url_title_ex($snippet['snippet_name'])));
$snippet['snippet_time'] = FormatTime($snippet['snippet_time']);
$snippet['snippet_name'] = htmlspecialchars($snippet['snippet_name']);
$snippet['snippet_language'] = $this->languages[$snippet['snippet_language']];
$snippet['user_url'] = site_url(array('forum', 'profile', $snippet['user_id'].'-'.url_title_ex($snippet['user_name'])));
$snippet['user_name'] = FormatUserTag($snippet['user_name'], $snippet['user_color']);
}
$this->load->helper('text');
$data['last_comments'] = $this->snippet_m->GetLastComments($this->config->item('snippet_last_comments_count'));
foreach ($data['last_comments'] as &$comment)
{
$comment['comment_url'] = site_url(array('snippet', 'view', $comment['snippet_id'], url_title_ex($comment['snippet_name']))).'#C'.$comment['comment_id'];
$comment['comment_text'] = word_limiter(htmlspecialchars($comment['comment_text']), 9);
}
$data['popular_tags'] = $this->snippet_m->GetPopularTags($this->config->item('snippet_popular_tags_count'));
foreach ($data['popular_tags'] as &$tag)
{
$tag['tag_url'] = site_url(array('snippet', 'search', 'tag', urlencode($tag['tag_name'])));
}
$data['title'] = 'Snippets';
$data['selected_header'] = 5;
$data['shoutbox_content'] = $this->FormatShoutboxMessages();
$data['notifications'] = $this->GetNotifications();
$data['user_online'] = $this->GetOnlineUser();
if ($this->uri->IsMobile())
{
$this->load->view('mobile/shared/header', $data);
$this->load->view('mobile/downloads/index', $data);
$this->load->view('mobile/shared/footer', $data);
}
else
{
$this->load->view('desktop/shared/header', $data);
$this->load->view('desktop/shared/content_start');
$this->load->view('desktop/shared/sidebar', $data);
$this->load->view('desktop/snippet/content_start', $data);
$this->load->view('desktop/snippet/index', $data);
$this->load->view('desktop/snippet/content_end', $data);
$this->load->view('desktop/shared/content_end');
$this->load->view('desktop/shared/footer', $data);
}
}
// /snippet/view/random
public function RouteToRandomSnippt()
{
$snippet = $this->snippet_m->GetRandomSnippet();
redirect(site_url(array('snippet', 'view', $snippet['snippet_id'], url_title_ex($snippet['snippet_name']))), 'location');
}
// /snippet/view/<id>/name
public function ViewSnippetById($snippetId)
{
$snippet = $this->snippet_m->GetSnippetById($snippetId);
if ($snippet === false)
{
$this->ShowErrorPage($this->lang->line('snippet_snippet_not_found'), site_url('snippet'));
}
$snippet['snippet_time'] = FormatTime($snippet['snippet_time'], 'j. M Y', false);
$snippet['snippet_name'] = htmlspecialchars($snippet['snippet_name']);
$snippet['snippet_description'] = bb_code($snippet['snippet_description']);
$snippet['snippet_data'] = $this->geshilib->highlight($snippet['snippet_data'], $snippet['snippet_language'], array(
//'set_header_type' => array(GESHI_HEADER_PRE_VALID),
'set_overall_class' => array('snippet-data bb-geshi'),
'enable_line_numbers' => array(GESHI_NORMAL_LINE_NUMBERS),
'enable_classes' => array()
));
$snippet['snippet_language'] = $this->languages[$snippet['snippet_language']];
$snippet['user_url'] = site_url(array('forum', 'profile', $snippet['user_id'].'-'.url_title_ex($snippet['user_name'])));
$snippet['user_name'] = FormatUserTag($snippet['user_name'], $snippet['user_color']);
$data['snippet_comments'] = $this->snippet_m->GetCommentsForSnippet($snippetId);
if ($data['snippet_comments'] !== null)
{
foreach ($data['snippet_comments'] as &$comment)
{
$comment['comment_time'] = FormatTime($comment['comment_time']);
$comment['comment_text'] = bb_code($comment['comment_text']);
$comment['user_url'] = site_url(array('forum', 'profile', $comment['user_id'].'-'.url_title_ex($comment['user_name'])));
$comment['user_name'] = FormatUserTag($comment['user_name'], $comment['user_color']);
$comment['user_avatar'] = !empty($comment['user_avatar']) ? $comment['user_id'].$comment['user_avatar'] : 'noavatar.jpg';
}
}
$data['snippet_tags'] = $this->snippet_m->GetTagsForSnippet($snippetId);
if ($data['snippet_tags'] !== null)
{
foreach ($data['snippet_tags'] as &$tag)
{
$tag['tag_url'] = site_url(array('snippet', 'search', 'tag', urlencode($tag['tag_name'])));
}
}
$data['title'] = $snippet['snippet_language'].' - '.$snippet['snippet_name'];
$data['selected_header'] = 5;
$data['shoutbox_content'] = $this->FormatShoutboxMessages();
$data['notifications'] = $this->GetNotifications();
$data['user_online'] = $this->GetOnlineUser();
$data['snippet'] = $snippet;
if ($this->uri->IsMobile())
{
$this->load->view('mobile/shared/header', $data);
$this->load->view('mobile/downloads/file', $data);
$this->load->view('mobile/shared/footer', $data);
}
else
{
$this->load->view('desktop/shared/header', $data);
$this->load->view('desktop/shared/content_start');
$this->load->view('desktop/shared/sidebar', $data);
$this->load->view('desktop/snippet/content_start', $data);
$this->load->view('desktop/snippet/snippet', $data);
$this->load->view('desktop/snippet/content_end', $data);
$this->load->view('desktop/shared/content_end');
$this->load->view('desktop/shared/footer', $data);
}
}
// /snippet/search/tag/<tag>/<page>
public function ViewSnippetsByTag($tag, $page = 0)
{
$tag = urldecode($tag);
$data['snippets'] = $this->snippet_m->GetSnippetsByTag($tag, array('start' => (int)$page * (int)$this->config->item('snippet_per_page_count'), 'limit' => $this->config->item('snippet_per_page_count')));
if ($data['snippets'] !== null)
{
foreach ($data['snippets'] as &$snippet)
{
$snippet['snippet_url'] = site_url(array('snippet', 'view', $snippet['snippet_id'], url_title_ex($snippet['snippet_name'])));
$snippet['snippet_time'] = FormatTime($snippet['snippet_time']);
$snippet['snippet_name'] = htmlspecialchars($snippet['snippet_name']);
$snippet['snippet_language'] = $this->languages[$snippet['snippet_language']];
$snippet['user_url'] = site_url(array('forum', 'profile', $snippet['user_id'] . '-' . url_title_ex($snippet['user_name'])));
$snippet['user_name'] = FormatUserTag($snippet['user_name'], $snippet['user_color']);
}
}
$data['title'] = 'Snippets suchen';
$data['selected_header'] = 5;
$data['shoutbox_content'] = $this->FormatShoutboxMessages();
$data['notifications'] = $this->GetNotifications();
$data['user_online'] = $this->GetOnlineUser();
$data['search_query'] = htmlspecialchars($tag);
if ($this->uri->IsMobile())
{
$this->load->view('mobile/shared/header', $data);
$this->load->view('mobile/downloads/index', $data);
$this->load->view('mobile/shared/footer', $data);
}
else
{
$this->load->view('desktop/shared/header', $data);
$this->load->view('desktop/shared/content_start');
$this->load->view('desktop/shared/sidebar', $data);
$this->load->view('desktop/snippet/content_start', $data);
$this->load->view('desktop/snippet/search', $data);
$this->load->view('desktop/snippet/content_end', $data);
$this->load->view('desktop/shared/content_end');
$this->load->view('desktop/shared/footer', $data);
}
}
// /snippet/search
public function RouteToSearch()
{
redirect(site_url(array('snippet', 'search', $this->input->post('snippet_search'))), 'location');
}
// /snippet/search/<query>/<page>
public function ViewSnippetsByQuery($query, $page = 0)
{
if (strlen($query) < 3)
{
$this->ShowErrorPage('zu kurz');
return;
}
$data['snippets'] = $this->snippet_m->GetSnippetsByQuery($query, array('start' => (int)$page * (int)$this->config->item('snippet_per_page_count'), 'limit' => $this->config->item('snippet_per_page_count')));
if ($data['snippets'] !== null)
{
foreach ($data['snippets'] as &$snippet)
{
$snippet['snippet_url'] = site_url(array('snippet', 'view', $snippet['snippet_id'], url_title_ex($snippet['snippet_name'])));
$snippet['snippet_time'] = FormatTime($snippet['snippet_time']);
$snippet['snippet_name'] = htmlspecialchars($snippet['snippet_name']);
$snippet['snippet_language'] = $this->languages[$snippet['snippet_language']];
$snippet['user_url'] = site_url(array('forum', 'profile', $snippet['user_id'] . '-' . url_title_ex($snippet['user_name'])));
$snippet['user_name'] = FormatUserTag($snippet['user_name'], $snippet['user_color']);
}
}
$data['title'] = 'Snippets suchen';
$data['selected_header'] = 5;
$data['shoutbox_content'] = $this->FormatShoutboxMessages();
$data['notifications'] = $this->GetNotifications();
$data['user_online'] = $this->GetOnlineUser();
$data['search_query'] = htmlspecialchars($query);
if ($this->uri->IsMobile())
{
$this->load->view('mobile/shared/header', $data);
$this->load->view('mobile/downloads/index', $data);
$this->load->view('mobile/shared/footer', $data);
}
else
{
$this->load->view('desktop/shared/header', $data);
$this->load->view('desktop/shared/content_start');
$this->load->view('desktop/shared/sidebar', $data);
$this->load->view('desktop/snippet/content_start', $data);
$this->load->view('desktop/snippet/search', $data);
$this->load->view('desktop/snippet/content_end', $data);
$this->load->view('desktop/shared/content_end');
$this->load->view('desktop/shared/footer', $data);
}
}
// /snippet/create
public function ViewCreateSnippet()
{
$data['title'] = 'Snippet erstellen';
$data['selected_header'] = 5;
$data['shoutbox_content'] = $this->FormatShoutboxMessages();
$data['notifications'] = $this->GetNotifications();
$data['user_online'] = $this->GetOnlineUser();
$data['snippet_languages'] = $this->languages;
$data['snippet_tags'] = $this->snippet_m->GetAllTags();
if ($this->uri->IsMobile())
{
$this->load->view('mobile/shared/header', $data);
$this->load->view('mobile/downloads/index', $data);
$this->load->view('mobile/shared/footer', $data);
}
else
{
$this->load->view('desktop/shared/header', $data);
$this->load->view('desktop/shared/content_start');
$this->load->view('desktop/shared/sidebar', $data);
$this->load->view('desktop/snippet/content_start', $data);
$this->load->view('desktop/snippet/create', $data);
$this->load->view('desktop/snippet/content_end', $data);
$this->load->view('desktop/shared/content_end');
$this->load->view('desktop/shared/footer', $data);
}
}
// /snippet/create/snippet
public function DoCreateSnippet()
{
$this->load->library('form_validation');
$this->form_validation->set_error_delimiters('<div class="error">', '</div>');
$this->form_validation->set_rules('snippet_name', 'lang:snippet_name', 'trim|required|min_length[10]');
$this->form_validation->set_rules('snippet_description', 'lang:snippet_description', 'trim|required|min_length[20]');
$this->form_validation->set_rules('snippet_language', 'lang:snippet_language', 'trim|required|in_list['.implode(',', array_keys($this->languages)).']');
$this->form_validation->set_rules('snippet_data', 'lang:snippet_data', 'trim|required|min_length[20]');
$this->form_validation->set_rules('snippet_tags[]', 'lang:snippet_tags', 'trim|strtolower|callback_check_tag_name');
if ($this->form_validation->run())
{
$snippetId = $this->snippet_m->CreateSnippet(
$this->input->post('snippet_name'),
$this->user->id,
$this->input->post('snippet_description'),
$this->input->post('snippet_language'),
$this->input->post('snippet_data')
);
$counter = (int)$this->config->item('snippet_max_tags_count');
foreach ($this->input->post('snippet_tags') as $tag)
{
$tagData = $this->snippet_m->GetTagByName($tag);
if ($tagData === null)
{
$tagData = array('tag_id' => $this->snippet_m->CreateTag($tag));
}
$this->snippet_m->AssociateSnippetWithTag($snippetId, $tagData['tag_id']);
--$counter;
if ($counter == 0)
{
break;
}
}
$this->load->helper('forum_create');
$this->load->library('forum_m');
$forum = $this->forum_m->GetForumData();
$title = $this->languages[$this->input->post('snippet_language')].' - '.$this->input->post('snippet_name');
$text = '';
$topicData = CreateTopic(
$forum,
$this->user,
0,
$title,
$text,
true
);
redirect(site_url(array('snippet', 'view', $snippetId, url_title_ex($this->input->post('snippet_name')))), 'location');
}
else
{
$this->ViewCreateSnippet();
}
}
// /snippet/create/comment
public function DoCreateComment()
{
$isAjax = $this->input->post('post_ajax');
$snippet = $this->snippet_m->GetSnippetById($this->input->post('snippet_id'));
if ($snippet === null)
{
if ($isAjax)
{
$this->ShowJsonError($this->lang->line('snippet_not_found'));
return;
}
else
{
redirect(site_url('snippet'));
}
}
$this->load->library('form_validation');
$this->form_validation->set_error_delimiters('<div class="error">', '</div>');
$this->form_validation->set_rules('comment_text', 'lang:snippet_description', 'trim|required|min_length[10]');
$redirect = site_url(array('snippet', 'view', $snippet['snippet_id'], url_title_ex($snippet['snippet_name'])));
if ($this->form_validation->run())
{
$commentId = $this->snippet_m->CreateComment(
$snippet['snippet_id'],
$this->user->id,
$this->input->post('comment_text')
);
if ($isAjax)
{
$comment = $this->snippet_m->GetCommentById($commentId);
$ajax = array(
'comment_id' => $comment['comment_id'],
'comment_time' => FormatTime(time()),
'comment_text' => bb_code($comment['comment_text']),
'user_name' => htmlspecialchars($this->user->name),
'user_name_color' => FormatUserTag($this->user->name, $this->user->color),
'user_avatar' => !empty($this->user->avatar) ? $this->user->id.$this->user->avatar : 'noavatar.jpg',
'user_url' => site_url(array('forum', 'profile', $this->user->id.'-'.url_title_ex($this->user->name)))
);
$this->ShowJsonSuccess($ajax);
return;
}
else
{
$redirect .= '#C'.$commentId;
}
}
if ($isAjax)
{
$this->form_validation->set_error_delimiters('', '');
$this->ShowJsonError($this->form_validation->error('comment_text'));
}
else
{
redirect($redirect, 'location');
}
}
public function check_tag_name($val)
{
if (preg_match('/^[a-z0-9\\+-_#]+$/', $val) === 1)
{
return true;
}
$this->form_validation->set_message('check_tag_name', $this->lang->line('form_validation_snippet_tags_error'));
return false;
}
}