Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Add hyperlinks to the "user:" and "tags:" marks in timelines. |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA1: |
13165785e1deb2de3b1fb9014f5c7c7b |
| User & Date: | drh 2011-01-28 14:09:57.932 |
Context
|
2011-01-28
| ||
| 19:09 | Add end-tags to the anchors in the [/doc/trunk/src/makeheaders.html] document. ... (check-in: b6a4e8592d user: drh tags: trunk) | |
| 18:57 | Create new branch named "symlinks". [http://www.mail-archive.com/fossil-users@lists.fossil-scm.org/msg03402.html|Mailing list thread] ... (check-in: a7b7ff3ac2 user: dmitry tags: symlinks) | |
| 14:09 | Add hyperlinks to the "user:" and "tags:" marks in timelines. ... (check-in: 13165785e1 user: drh tags: trunk) | |
|
2011-01-26
| ||
| 20:46 | Ignore trailing / characters on the "name=" parameter to the dir URL. ... (check-in: 8854d6b615 user: drh tags: trunk) | |
Changes
Changes to src/branch.c.
| ︙ | ︙ | |||
355 356 357 358 359 360 361 |
@ <h2>The initial check-in for each branch:</h2>
db_prepare(&q,
"%s AND blob.rid IN (SELECT rid FROM tagxref"
" WHERE tagtype>0 AND tagid=%d AND srcid!=0)"
" ORDER BY event.mtime DESC",
timeline_query_for_www(), TAG_BRANCH
);
| | | 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 |
@ <h2>The initial check-in for each branch:</h2>
db_prepare(&q,
"%s AND blob.rid IN (SELECT rid FROM tagxref"
" WHERE tagtype>0 AND tagid=%d AND srcid!=0)"
" ORDER BY event.mtime DESC",
timeline_query_for_www(), TAG_BRANCH
);
www_print_timeline(&q, 0, 0, 0, brtimeline_extra);
db_finalize(&q);
@ <script type="text/JavaScript">
@ function xin(id){
@ }
@ function xout(id){
@ }
@ </script>
|
| ︙ | ︙ |
Changes to src/descendants.c.
| ︙ | ︙ | |||
340 341 342 343 344 345 346 |
}
db_prepare(&q,
"%s"
" AND blob.rid IN leaves"
" ORDER BY event.mtime DESC",
timeline_query_for_www()
);
| | | 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 |
}
db_prepare(&q,
"%s"
" AND blob.rid IN leaves"
" ORDER BY event.mtime DESC",
timeline_query_for_www()
);
www_print_timeline(&q, TIMELINE_LEAFONLY, 0, 0, leaves_extra);
db_finalize(&q);
@ <br />
@ <script type="text/JavaScript">
@ function xin(id){
@ }
@ function xout(id){
@ }
|
| ︙ | ︙ |
Changes to src/tag.c.
| ︙ | ︙ | |||
581 582 583 584 585 586 587 |
"%s AND blob.rid IN (SELECT rid FROM tagxref"
" WHERE tagtype=1 AND srcid>0"
" AND tagid IN (SELECT tagid FROM tag "
" WHERE tagname GLOB 'sym-*'))"
" ORDER BY event.mtime DESC",
timeline_query_for_www()
);
| | | 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 |
"%s AND blob.rid IN (SELECT rid FROM tagxref"
" WHERE tagtype=1 AND srcid>0"
" AND tagid IN (SELECT tagid FROM tag "
" WHERE tagname GLOB 'sym-*'))"
" ORDER BY event.mtime DESC",
timeline_query_for_www()
);
www_print_timeline(&q, 0, 0, 0, tagtimeline_extra);
db_finalize(&q);
@ <br />
@ <script type="text/JavaScript">
@ function xin(id){
@ }
@ function xout(id){
@ }
|
| ︙ | ︙ |
Changes to src/timeline.c.
| ︙ | ︙ | |||
147 148 149 150 151 152 153 154 155 156 157 158 159 160 |
** 8. list of symbolic tags.
** 9. tagid for ticket or wiki or event
** 10. Short comment to user for repeated tickets and wiki
*/
void www_print_timeline(
Stmt *pQuery, /* Query to implement the timeline */
int tmFlags, /* Flags controlling display behavior */
void (*xExtra)(int) /* Routine to call on each line of display */
){
int wikiFlags;
int mxWikiLen;
Blob comment;
int prevTagid = 0;
int suppressCnt = 0;
| > > | 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 |
** 8. list of symbolic tags.
** 9. tagid for ticket or wiki or event
** 10. Short comment to user for repeated tickets and wiki
*/
void www_print_timeline(
Stmt *pQuery, /* Query to implement the timeline */
int tmFlags, /* Flags controlling display behavior */
const char *zThisUser, /* Suppress links to this user */
const char *zThisTag, /* Suppress links to this tag */
void (*xExtra)(int) /* Routine to call on each line of display */
){
int wikiFlags;
int mxWikiLen;
Blob comment;
int prevTagid = 0;
int suppressCnt = 0;
|
| ︙ | ︙ | |||
288 289 290 291 292 293 294 |
blob_append(&truncated, "...", 3);
wiki_convert(&truncated, 0, wikiFlags);
blob_reset(&truncated);
}else{
wiki_convert(&comment, 0, wikiFlags);
}
blob_reset(&comment);
| > > > > | > > > | > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 |
blob_append(&truncated, "...", 3);
wiki_convert(&truncated, 0, wikiFlags);
blob_reset(&truncated);
}else{
wiki_convert(&comment, 0, wikiFlags);
}
blob_reset(&comment);
/* Generate the "user: USERNAME" at the end of the comment, together
** with a hyperlink to another timeline for that user.
*/
if( zTagList && zTagList[0]==0 ) zTagList = 0;
if( g.okHistory && fossil_strcmp(zUser, zThisUser)!=0 ){
char *zLink = mprintf("%s/timeline?u=%h&c=%t&nd",
g.zTop, zUser, zDate);
@ (user: <a href="%s(zLink)">%h(zUser)</a>%s(zTagList?",":"\051")
fossil_free(zLink);
}else{
@ (user: %h(zUser)%s(zTagList?",":"\051")
}
/* Generate the "tags: TAGLIST" at the end of the comment, together
** with hyperlinks to the tag list.
*/
if( zTagList ){
if( g.okHistory ){
int i;
const char *z = zTagList;
Blob links;
blob_zero(&links);
while( z && z[0] ){
for(i=0; z[i] && (z[i]!=',' || z[i+1]!=' '); i++){}
if( zThisTag==0 || memcmp(z, zThisTag, i)!=0 || zThisTag[i]!=0 ){
blob_appendf(&links,
"<a href=\"%s/timeline?r=%.*t&nd&c=%s\">%.*h</a>%.2s",
g.zTop, i, z, zDate, i, z, &z[i]
);
}else{
blob_appendf(&links, "%.*h", i+2, z);
}
if( z[i]==0 ) break;
z += i+2;
}
@ tags: %s(blob_str(&links)))
blob_reset(&links);
}else{
@ tags: %h(zTagList))
}
}
/* Generate extra hyperlinks at the end of the comment */
if( xExtra ){
xExtra(rid);
}
@ </td></tr>
}
if( suppressCnt ){
@ <tr><td /><td /><td>
|
| ︙ | ︙ | |||
706 707 708 709 710 711 712 |
const char *zAfter = P("a"); /* Events after this time */
const char *zBefore = P("b"); /* Events before this time */
const char *zCirca = P("c"); /* Events near this time */
const char *zTagName = P("t"); /* Show events with this tag */
const char *zBrName = P("r"); /* Show events related to this tag */
const char *zSearch = P("s"); /* Search string */
int useDividers = P("nd")==0; /* Show dividers if "nd" is missing */
| < > > > > > > > | 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 |
const char *zAfter = P("a"); /* Events after this time */
const char *zBefore = P("b"); /* Events before this time */
const char *zCirca = P("c"); /* Events near this time */
const char *zTagName = P("t"); /* Show events with this tag */
const char *zBrName = P("r"); /* Show events related to this tag */
const char *zSearch = P("s"); /* Search string */
int useDividers = P("nd")==0; /* Show dividers if "nd" is missing */
int tagid; /* Tag ID */
int tmFlags; /* Timeline flags */
const char *zThisTag = 0; /* Suppress links to this tag */
const char *zThisUser = 0; /* Suppress links to this user */
HQuery url; /* URL for various branch links */
/* To view the timeline, must have permission to read project data.
*/
login_check_credentials();
if( !g.okRead && !g.okRdTkt && !g.okRdWiki ){ login_needed(); return; }
if( zTagName && g.okRead ){
tagid = db_int(0, "SELECT tagid FROM tag WHERE tagname='sym-%q'", zTagName);
zThisTag = zTagName;
}else if( zBrName && g.okRead ){
tagid = db_int(0, "SELECT tagid FROM tag WHERE tagname='sym-%q'",zBrName);
zThisTag = zBrName;
}else{
tagid = 0;
}
if( zType[0]=='a' ){
tmFlags = TIMELINE_BRIEF | TIMELINE_GRAPH;
}else{
tmFlags = TIMELINE_GRAPH;
}
if( P("ng")!=0 || zSearch!=0 ){
tmFlags &= ~TIMELINE_GRAPH;
}
style_header("Timeline");
login_anonymous_available();
timeline_temp_table();
blob_zero(&sql);
blob_zero(&desc);
blob_append(&sql, "INSERT OR IGNORE INTO timeline ", -1);
blob_append(&sql, timeline_query_for_www(), -1);
url_initialize(&url, "timeline");
if( !useDividers ) url_add_parameter(&url, "nd", 0);
if( (p_rid || d_rid) && g.okRead ){
/* If p= or d= is present, ignore all other parameters other than n= */
char *zUuid;
int np, nd;
if( p_rid && d_rid ){
if( p_rid!=d_rid ) p_rid = d_rid;
|
| ︙ | ︙ | |||
805 806 807 808 809 810 811 |
blob_appendf(&desc, "[%.10s]", zUuid);
}
}else{
int n;
const char *zEType = "timeline item";
char *zDate;
char *zNEntry = mprintf("%d", nEntry);
| < | 852 853 854 855 856 857 858 859 860 861 862 863 864 865 |
blob_appendf(&desc, "[%.10s]", zUuid);
}
}else{
int n;
const char *zEType = "timeline item";
char *zDate;
char *zNEntry = mprintf("%d", nEntry);
url_add_parameter(&url, "n", zNEntry);
if( tagid>0 ){
blob_appendf(&sql,
"AND (EXISTS(SELECT 1 FROM tagxref"
" WHERE tagid=%d AND tagtype>0 AND rid=blob.rid)", tagid);
if( zBrName ){
|
| ︙ | ︙ | |||
872 873 874 875 876 877 878 879 880 881 882 883 884 885 |
}else if( zType[0]=='e' ){
zEType = "event";
}
}
if( zUser ){
blob_appendf(&sql, " AND event.user=%Q", zUser);
url_add_parameter(&url, "u", zUser);
}
if ( zSearch ){
blob_appendf(&sql,
" AND (event.comment LIKE '%%%q%%' OR event.brief LIKE '%%%q%%')",
zSearch, zSearch);
url_add_parameter(&url, "s", zSearch);
}
| > | 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 |
}else if( zType[0]=='e' ){
zEType = "event";
}
}
if( zUser ){
blob_appendf(&sql, " AND event.user=%Q", zUser);
url_add_parameter(&url, "u", zUser);
zThisUser = zUser;
}
if ( zSearch ){
blob_appendf(&sql,
" AND (event.comment LIKE '%%%q%%' OR event.brief LIKE '%%%q%%')",
zSearch, zSearch);
url_add_parameter(&url, "s", zSearch);
}
|
| ︙ | ︙ | |||
1000 1001 1002 1003 1004 1005 1006 |
if( P("showsql") ){
@ <blockquote>%h(blob_str(&sql))</blockquote>
}
blob_zero(&sql);
db_prepare(&q, "SELECT * FROM timeline ORDER BY sortby DESC /*scan*/");
@ <h2>%b(&desc)</h2>
blob_reset(&desc);
| | | 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 |
if( P("showsql") ){
@ <blockquote>%h(blob_str(&sql))</blockquote>
}
blob_zero(&sql);
db_prepare(&q, "SELECT * FROM timeline ORDER BY sortby DESC /*scan*/");
@ <h2>%b(&desc)</h2>
blob_reset(&desc);
www_print_timeline(&q, tmFlags, zThisUser, zThisTag, 0);
db_finalize(&q);
style_footer();
}
/*
** The input query q selects various records. Print a human-readable
** summary of those records.
|
| ︙ | ︙ |
Changes to src/tkt.c.
| ︙ | ︙ | |||
702 703 704 705 706 707 708 |
" WHERE target=%Q) "
"ORDER BY mtime DESC",
timeline_query_for_www(), tagid, zFullUuid, zFullUuid, zFullUuid
);
}
db_prepare(&q, zSQL);
free(zSQL);
| | > | 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 |
" WHERE target=%Q) "
"ORDER BY mtime DESC",
timeline_query_for_www(), tagid, zFullUuid, zFullUuid, zFullUuid
);
}
db_prepare(&q, zSQL);
free(zSQL);
www_print_timeline(&q, TIMELINE_ARTID|TIMELINE_DISJOINT|TIMELINE_GRAPH,
0, 0, 0);
db_finalize(&q);
style_footer();
}
/*
** WEBPAGE: tkthistory
** URL: /tkthistory?name=TICKETUUID
|
| ︙ | ︙ |
Changes to src/url.c.
| ︙ | ︙ | |||
296 297 298 299 300 301 302 |
/*
** An instance of this object is used to build a URL with query parameters.
*/
struct HQuery {
Blob url; /* The URL */
const char *zBase; /* The base URL */
int nParam; /* Number of parameters. Max 10 */
| | | | 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 |
/*
** An instance of this object is used to build a URL with query parameters.
*/
struct HQuery {
Blob url; /* The URL */
const char *zBase; /* The base URL */
int nParam; /* Number of parameters. Max 10 */
const char *azName[15]; /* Parameter names */
const char *azValue[15]; /* Parameter values */
};
#endif
/*
** Initialize the URL object.
*/
void url_initialize(HQuery *p, const char *zBase){
|
| ︙ | ︙ | |||
348 349 350 351 352 353 354 |
if( z==0 ) continue;
}
if( zName2 && strcmp(zName2,p->azName[i])==0 ){
zName2 = 0;
z = zValue2;
if( z==0 ) continue;
}
| | > | 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 |
if( z==0 ) continue;
}
if( zName2 && strcmp(zName2,p->azName[i])==0 ){
zName2 = 0;
z = zValue2;
if( z==0 ) continue;
}
blob_appendf(&p->url, "%s%s", zSep, p->azName[i]);
if( z && z[0] ) blob_appendf(&p->url, "=%T", z);
zSep = "&";
}
if( zName1 && zValue1 ){
blob_appendf(&p->url, "%s%s=%T", zSep, zName1, zValue1);
}
if( zName2 && zValue2 ){
blob_appendf(&p->url, "%s%s=%T", zSep, zName2, zValue2);
|
| ︙ | ︙ |
Changes to src/wiki.c.
| ︙ | ︙ | |||
575 576 577 578 579 580 581 |
" UNION SELECT attachid FROM attachment"
" WHERE target=%Q)"
"ORDER BY mtime DESC",
timeline_query_for_www(), zPageName, zPageName);
db_prepare(&q, zSQL);
free(zSQL);
zWikiPageName = zPageName;
| | | 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 |
" UNION SELECT attachid FROM attachment"
" WHERE target=%Q)"
"ORDER BY mtime DESC",
timeline_query_for_www(), zPageName, zPageName);
db_prepare(&q, zSQL);
free(zSQL);
zWikiPageName = zPageName;
www_print_timeline(&q, TIMELINE_ARTID, 0, 0, wiki_history_extra);
db_finalize(&q);
style_footer();
}
/*
** WEBPAGE: wdiff
** URL: /whistory?name=PAGENAME&a=RID1&b=RID2
|
| ︙ | ︙ |