1
import("etherpad.log");
2
import("dispatch.{Dispatcher,PrefixMatcher,forward}");
3
import("plugins.twitterStyleTags.models.tagQuery");
4
import("sqlbase.sqlobj");
5
import("etherpad.collab.server_utils");
6
import("etherpad.utils");
7
import("etherpad.pad.padutils");
10
function padModelWriteToDB(args) {
11
/* Update tags for the pad */
13
var new_tags = args.pad.text().match(new RegExp("#[^,#=!\\s][^,#=!\\s]*", "g"));
14
if (new_tags == null) new_tags = new Array();
15
for (i = 0; i < new_tags.length; i++)
16
new_tags[i] = new_tags[i].substring(1);
17
var new_tags_str = new_tags.join('#')
19
var old_tags_row = sqlobj.selectSingle("PAD_TAG_CACHE", { PAD_ID: args.padId });
21
if (old_tags_row !== null)
22
old_tags_str = old_tags_row['TAGS'];
26
// var old_tags = old_tags_str != '' ? old_tags_str.split('#') : new Array();
28
if (new_tags_str != old_tags_str) {
29
// log.info({message: 'Updating tags', new_tags:new_tags, old_tags:old_tags});
32
sqlobj.update("PAD_TAG_CACHE", {PAD_ID: args.padId }, {TAGS: new_tags.join('#')});
34
sqlobj.insert("PAD_TAG_CACHE", {PAD_ID: args.padId, TAGS: new_tags.join('#')});
36
sqlobj.deleteRows("PAD_TAG", {PAD_ID: args.padId});
38
for (i = 0; i < new_tags.length; i++) {
39
var tag_row = sqlobj.selectSingle("TAG", { NAME: new_tags[i] });
40
if (tag_row === null) {
41
sqlobj.insert("TAG", {NAME: new_tags[i]});
42
tag_row = sqlobj.selectSingle("TAG", { NAME: new_tags[i] });
44
sqlobj.insert("PAD_TAG", {PAD_ID: args.padId, TAG_ID: tag_row['ID']});
49
function queryAccessSql(args) {
50
return [function (querySql) {
51
return tagQuery.getQueryToSql(['public'], [], querySql);
55
function queryToSql(args) {
56
return [function (querySql) {
57
if (request.params.query == undefined || request.params.query == '') {
60
var tags = tagQuery.queryToTags(request.params.query);
62
return tagQuery.getQueryToSql(tags.tags, tags.antiTags, querySql);
67
function queryExtra() {
68
return [function (querySql, info, clientVars) {
69
var tags = tagQuery.queryToTags(request.params.query);
71
var queryNewTagsSql = tagQuery.newTagsSql(querySql);
72
var newTags = sqlobj.executeRaw(queryNewTagsSql.sql, queryNewTagsSql.params);
74
info.tagQuery = tagQuery;
75
info.tags = tags.tags;
76
info.antiTags = tags.antiTags;
77
info.newTags = newTags;
78
info.padIdToReadonly = server_utils.padIdToReadonly;
82
function queryFormat() {
83
function createFormat(format) {
84
return function (querySql, info, clientVars) {
85
var tags = tagQuery.queryToTags(request.params.query);
88
if (format == 'sitemap')
91
padSql = tagQuery.padInfoSql(querySql, limit);
92
var matchingPads = sqlobj.executeRaw(padSql.sql, padSql.params);
94
for (i = 0; i < matchingPads.length; i++) {
95
matchingPads[i].TAGS = matchingPads[i].TAGS.split('#');
98
info.matchingPads = matchingPads;
100
if (format == "html") {
101
utils.renderHtml("tagBrowser.ejs", info, ['twitterStyleTags', 'search']);
102
} else if (format == "rss") {
103
response.setContentType("application/xml; charset=utf-8");
104
response.write(utils.renderTemplateAsString("tagRss.ejs", info, ['twitterStyleTags', 'search']));
105
if (request.acceptsGzip) {
106
response.setGzip(true);
108
} else if (format == "sitemap") {
109
response.setContentType("application/xml; charset=utf-8");
110
response.write(utils.renderTemplateAsString("tagSitemap.ejs", info, ['twitterStyleTags', 'search']));
111
if (request.acceptsGzip) {
112
response.setGzip(true);
114
} else if (format == "json") {
115
response.setContentType("application/json; charset=utf-8");
116
response.write(fastJSON.stringify(info));
117
if (request.acceptsGzip) {
118
response.setGzip(true);
121
throw new Error("Unknown format " + format);
127
return [{'pads.html': createFormat('html'),
128
'pads.rss': createFormat('rss'),
129
'pads.sitemap': createFormat('sitemap'),
130
'pads.json': createFormat('json')
134
function querySummary(args) {
135
var res = args.template.include("twitterStyleTagsQuerySummary.ejs", {}, ['twitterStyleTags']);
136
if (res.replace(new RegExp("^[ \n]*"), "").replace(new RegExp("[ \n]*$"), "") == '')
141
function queryRefiner(args) {
142
return [args.template.include("twitterStyleTagsQueryRefiner.ejs", {}, ['twitterStyleTags'])];
145
function docbarItemsSearch() {
146
return ["<td class='docbarbutton'><a href='/ep/search?type=pads'>Pads</a></td>"];
149
function editBarItemsLeftPad(arg) {
150
return [arg.template.include('twitterStyleTagsEditbarButtons.ejs', undefined, ['twitterStyleTags'])];