import
[web.mtrack] / web / snippet.php
1 <?php # vim:ts=2:sw=2:et:
2 /* For licensing and copyright terms, see the file named LICENSE */
3
4 include '../inc/common.php';
5
6 MTrackACL::requireAllRights('Snippets', 'read');
7
8 if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['submit'])) {
9   MTrackACL::requireAllRights('Snippets', 'create');
10
11   $snip = new MTrackSnippet;
12   $snip->snippet = $_POST['code'];
13   $snip->description = $_POST['description'];
14   $snip->lang = $_POST['lang'];
15   $cs = MTrackChangeset::begin("snippet:?", $snip->description);
16   $snip->save($cs);
17   $cs->setObject("snippet:$snip->snid");
18   $cs->commit();
19   header("Location: {$ABSWEB}snippet.php/$snip->snid");
20   exit;
21 }
22
23 $pi = mtrack_get_pathinfo();
24
25 if ($_SERVER['REQUEST_METHOD'] == 'POST') {
26   $snip = new MTrackSnippet;
27   $snip->description = $_POST['description'];
28   $snip->lang = $_POST['lang'];
29   $snip->snippet = $_POST['code'];
30 } elseif (strlen($pi)) {
31   $snip = MTrackSnippet::loadById($pi);
32   if (!$snip) {
33     throw new Exception("Invalid snippet ID");
34   }
35 } else {
36   $snip = null;
37 }
38
39 if ($snip) {
40   $lang = $snip->lang;
41   $code = $snip->snippet;
42   $desc = $snip->description;
43   mtrack_head("Snippet $pi");
44 } else {
45   $lang = '';
46   $code = 'Enter your snippet here';
47   $desc = 'Enter a descriptive message here; you may use wiki syntax';
48   mtrack_head("New Snippet");
49 }
50
51 echo "<table><tr>";
52
53
54 /* collect recent snippets */
55 $recent = MTrackDB::q('select snid, description, who, changedate
56 from snippets
57   left join changes on snippets.updated = changes.cid
58   order by changes.changedate desc
59   limit 10')->fetchAll(PDO::FETCH_OBJ);
60
61 echo <<<HTML
62 <td id='recentsnippets'>
63 <em>Snippets are a way to share text or code fragments</em><br><br>
64 HTML;
65
66 if (MTrackACL::hasAllRights('Snippets', 'create')) {
67   echo <<<HTML
68   <button id='newsnippet'>New Snippet</button><br>
69 <script>
70 \$(document).ready(function () {
71   \$('#newsnippet').click(function () {
72     document.location.href = "{$ABSWEB}snippet.php";
73   });
74 });
75 </script>
76 HTML;
77 }
78
79 echo <<<HTML
80   <b>Recent Snippets</b>
81 HTML;
82
83 foreach ($recent as $s) {
84   $url = "{$ABSWEB}snippet.php/$s->snid";
85   $sum = MTrackWiki::format_to_oneliner($s->description);
86   $who = mtrack_username($s->who, array('no_image' => true));
87   $when = mtrack_date($s->changedate);
88   echo <<<HTML
89   <div class='snippetsummary'>
90     $sum<br>
91     $when by $who<br>
92     <a href='$url'>view snippet</a>
93   </div>
94 HTML;
95 }
96 echo "</td><td>";
97
98 if (MTrackACL::hasAllRights('Snippets', 'create') &&
99     (!$snip || $_SERVER['REQUEST_METHOD'] == 'POST')) {
100   echo "<form method='post' class='snippetform' action='{$ABSWEB}snippet.php'>";
101   echo "<textarea name='description' class='wiki shortwiki'>$desc</textarea>\n";
102   echo MTrackSyntaxHighlight::getLangSelect('lang', $lang);
103   echo "<br><textarea name='code' class='code' rows='20' cols='78'>";
104   echo htmlentities($code, ENT_QUOTES, 'utf-8');
105   echo "</textarea><br>";
106   echo "<button type='submit' name='preview'>Preview</button>\n";
107   echo "<button type='submit' name='submit'>Submit</button>\n";
108   echo "</form>";
109 }
110
111 if ($snip) {
112   echo "<div class='snippetview'>";
113   echo "<h1>Snippet</h1>";
114   if ($snip->created) {
115     $created = MTrackChangeset::get($snip->created);
116   } else {
117     $created = new stdclass;
118   }
119
120   echo "<span id='snippetmug'>",
121     mtrack_username($created->who, array('no_name' => true, 'size' => 48)),
122     "</span>";
123   echo "<b>Created</b>: ",
124        mtrack_date($created->when),
125        " by ",
126        mtrack_username($created->who, array('no_image' => true)),
127        "<br>\n";
128   echo "<a href='{$ABSWEB}snippet.php/$snip->snid'>Link to this snippet</a><br>";
129
130   echo MTrackWiki::format_to_html($snip->description);
131   echo "<br><br>";
132   echo MTrackSyntaxHighlight::getSchemeSelect();
133   echo MTrackSyntaxHighlight::highlightSource($code, $lang, null, true);
134   echo "</div>";
135 } else if (!MTrackACL::hasAllRights('Snippets', 'create')) {
136   echo "<p>You do not have rights to create snippets</p>";
137 }
138
139 echo "</td></tr></table>";
140
141 mtrack_foot();