@@ -56,11 +56,11 @@
56 56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
0, 0, 0, 0, 0, 0);
57 57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_finalize(&q);
58 58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
59 59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
60 60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** WEBPAGE: test-backlinks
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WEBPAGE: test-backlink-timeline
62 62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
63 63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Show a timeline of all check-ins and other events that have entries
64 64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** in the backlink table. This is used for testing the rendering
65 65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** of the "References" section of the /info page.
66 66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -88,5 +88,244 @@
88 88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
www_print_timeline(&q, TIMELINE_DISJOINT|TIMELINE_GRAPH|TIMELINE_NOSCROLL,
89 89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
0, 0, 0, 0, 0, 0);
90 90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_finalize(&q);
91 91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
style_footer();
92 92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WEBPAGE: test-backlinks
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Show a table of all backlinks. Admin access only.
98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void backlink_table_page(void){
100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Stmt q;
101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int n;
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ login_check_credentials();
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !g.perm.Admin ){
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ login_needed(g.anon.Admin);
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ style_header("Backlink Table (Internal Testing Use)");
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ n = db_int(0, "SELECT count(*) FROM backlink");
109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <p>%d(n) backlink table entries:</p>
110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_prepare(&q,
111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "SELECT target, srctype, srcid, datetime(mtime) FROM backlink"
112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ style_table_sorter();
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <table border="1" cellpadding="2" cellspacing="0" \
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ class='sortable' data-column-types='ttt' data-init-sort='0'>
116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <thead><tr><th> Source <th> Target <th> mtime </tr></thead>
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <tbody>
118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( db_step(&q)==SQLITE_ROW ){
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zTarget = db_column_text(&q, 0);
120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int srctype = db_column_int(&q, 1);
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int srcid = db_column_int(&q, 2);
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zMtime = db_column_text(&q, 3);
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const char *azSrcType[] = { "comment", "ticket", "wiki", "unknown" };
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <tr><td><a href="%R/info/%h(zTarget)">%h(zTarget)</a>
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ switch( srctype ){
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case BKLNK_COMMENT: {
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <td><a href="%R/info?name=rid:%d(srcid)">comment-%d(srcid)</a>
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case BKLNK_TICKET: {
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <td><a href="%R/info?name=rid:%d(srcid)">ticket-%d(srcid)</a>
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case BKLNK_WIKI: {
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <td><a href="%R/info?name=rid:%d(srcid)">wiki-%d(srcid)</a>
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ default: {
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <td>unknown(%d(srctype)) - %d(srcid)
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <td>%h(zMtime)</tr>
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ </tbody>
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ </table>
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_finalize(&q);
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ style_footer();
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Structure used to pass down state information through the
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** markup formatters into the BACKLINK generator.
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if INTERFACE
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct Backlink {
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int srcid; /* srcid for the source document */
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int srctype; /* One of BKLNK_*. 0=comment 1=ticket 2=wiki */
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ double mtime; /* mtime field for new BACKLINK table entries */
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** zTarget is a hyperlink target in some markup format. If this
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** target is a self-reference to some other object in the repository,
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** then create an appropriate backlink.
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void backlink_create(Backlink *p, const char *zTarget, int nTarget){
172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char zLink[HNAME_MAX+4];
173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zTarget==0 ) return;
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nTarget<4 ) return;
175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nTarget>=10 && strncmp(zTarget,"/info/",6)==0 ){
176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zTarget += 6;
177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nTarget -= 6;
178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nTarget>HNAME_MAX ) return;
180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !validate16(zTarget, nTarget) ) return;
181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memcpy(zLink, zTarget, nTarget);
182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zLink[nTarget] = 0;
183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ canonical16(zLink, nTarget);
184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec(
185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "REPLACE INTO backlink(target,srctype,srcid,mtime)"
186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "VALUES(%Q,%d,%d,%.17g)", zLink, p->srctype, p->srcid, p->mtime
187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This routine is called by the markdown formatter for each hyperlink.
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If the hyperlink is a backlink, add it to the BACKLINK table.
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int backlink_md_link(
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob *ob, /* Write output text here (not used in this case) */
196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob *target, /* The hyperlink target */
197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob *title, /* Hyperlink title */
198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob *content, /* Content of the link */
199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void *opaque
200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Backlink *p = (Backlink*)opaque;
202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zTarget = blob_buffer(target);
203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nTarget = blob_size(target);
204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ backlink_create(p, zTarget, nTarget);
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 1;
207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Scan markdown text and add self-hyperlinks to the BACKLINK table.
211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void markdown_extract_links(
213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zInputText,
214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Backlink *p
215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct mkd_renderer html_renderer = {
217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* prolog */
218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* epilog */
219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* blockcode */
220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* blockquote */
221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* raw_block */
222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* header */
223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* hrule */
224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* list */
225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* list_item */
226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* paragraph */
227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* table */
228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* table_cell */
229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* table_row */
230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* autolink */
231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* code_span */
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* double-emphasis */
233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* emphasis */
234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* image */
235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* line_break */
236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ backlink_md_link, /* link */
237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* raw_span */
238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* triple_emphasis */
239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* entity */
240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* normal_text */
241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "*_", /* emphasis characters */
242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0 /* client data */
243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob out, in;
245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ html_renderer.opaque = (void*)p;
246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_init(&out, 0, 0);
247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_init(&in, zInputText, -1);
248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ markdown(&out, &in, &html_renderer);
249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&out);
250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&in);
251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Parse text looking for hyperlinks. Insert references into the
255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** BACKLINK table.
256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void backlink_extract(
258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zSrc, /* Input text from which links are extracted */
259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zMimetype, /* Mimetype of input. NULL means fossil-wiki */
260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int srcid, /* srcid for the source document */
261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int srctype, /* One of BKLNK_*. 0=comment 1=ticket 2=wiki */
262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ double mtime, /* mtime field for new BACKLINK table entries */
263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int replaceFlag /* True to overwrite prior BACKLINK entries */
264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Backlink bklnk;
266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( replaceFlag ){
267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec("DELETE FROM backlink WHERE srctype=%d AND srcid=%d",
268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ srctype, srcid);
269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bklnk.srcid = srcid;
271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( srctype>=BKLNK_COMMENT && srctype<=BKLNK_WIKI );
272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bklnk.srctype = srctype;
273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bklnk.mtime = mtime;
274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zMimetype==0 || strstr(zMimetype,"wiki")!=0 ){
275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ wiki_extract_links(zSrc, &bklnk, srctype==BKLNK_COMMENT ? WIKI_INLINE : 0);
276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( strstr(zMimetype,"markdown")!=0 ){
277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ markdown_extract_links(zSrc, &bklnk);
278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** COMMAND: test-backlinks
283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Usage: %fossil test-backlinks SRCID SRCTYPE ?OPTIONS? INPUT-FILE
285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Read the content of INPUT-FILE and pass it into the backlink_extract()
287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** routine. But instead of adding backlinks to the backlink table,
288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** just print them on stdout. SRCID and SRCTYPE are integers.
289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Options:
291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** --mtime DATETIME Use an alternative date/time. Defaults to the
292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** current date/time.
293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** --mimetype TYPE Use an alternative mimetype.
294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void test_backlinks_cmd(void){
296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zMTime = find_option("mtime",0,1);
297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zMimetype = find_option("mimetype",0,1);
298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob in;
299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int srcid;
300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int srctype;
301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ double mtime;
302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ verify_all_options();
304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.argc!=5 ){
305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ usage("SRCTYPE SRCID INPUTFILE");
306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ srctype = atoi(g.argv[2]);
308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( srctype<0 || srctype>2 ){
309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("SRCTYPE should be a integer 0, 1, or 2");
310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ srcid = atoi(g.argv[3]);
312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_read_from_file(&in, g.argv[4], ExtFILE);
313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_open(":memory:",&g.db);
314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zMTime==0 ) zMTime = "now";
315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mtime = db_double(1721059.5,"SELECT julianday(%Q)",zMTime);
316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.fSqlPrint = 1;
317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_create_function(g.db, "print", -1, SQLITE_UTF8, 0,db_sql_print,0,0);
318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec(
319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "CREATE TEMP TABLE backlink(target,srctype,srcid,mtime);\n"
320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "CREATE TRIGGER backlink_insert BEFORE INSERT ON backlink BEGIN\n"
321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " SELECT print("
322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " 'target='||quote(new.target)||"
323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " ' srctype='||quote(new.srctype)||"
324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " ' srcid='||quote(new.srcid)||"
325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " ' mtime='||datetime(new.mtime));\n"
326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " SELECT raise(ignore);\n"
327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "END;"
328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ backlink_extract(blob_str(&in),zMimetype,srcid,srctype,mtime,0);
330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&in);
331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
93 332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!