@@ -135,13 +135,14 @@
135 135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If this setting is defined and is not an empty string, then
136 136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** timeline events are posted to the chat as they arrive. The synthesized
137 137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** chat messages appear to come from the user identified by this setting,
138 138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** not the user on the timeline event.
139 139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** All chat messages that come from the chat-timeline-user are interpreted
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** as text/x-fossil-wiki instead of as text/markdown. For this reason,
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** the chat-timeline-user name should probably not be a real user.
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** All chat messages that come from the chat-timeline-user are
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** interpreted as text/x-fossil-wiki instead of as text/x-markdown.
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** For this reason, the chat-timeline-user name should probably not be
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** a real user.
143 144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
144 145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
145 146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** WEBPAGE: chat loadavg-exempt
146 147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
147 148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Start up a browser-based chat session.
@@ -419,14 +420,14 @@
419 420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
420 421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_commit_transaction();
421 422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
422 423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
423 424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** This routine receives raw (user-entered) message text and transforms
425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** it into HTML that is safe to insert using innerHTML. As of 2021-09-19,
426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** it does so by using markdown_to_html() to convert markdown-formatted
427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** zMsg to HTML.
425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This routine receives raw (user-entered) message text and
426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** transforms it into HTML that is safe to insert using innerHTML. As
427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of 2021-09-19, it does so by using wiki_convert() or
428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** markdown_to_html() to convert wiki/markdown-formatted zMsg to HTML.
428 429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
429 430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Space to hold the returned string is obtained from fossil_malloc()
430 431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** and must be freed by the caller.
431 432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
432 433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static char *chat_format_to_html(const char *zMsg, int isWiki){
@@ -438,11 +439,11 @@
438 439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Used for chat-timeline-user. The zMsg is text/x-fossil-wiki. */
439 440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob bIn;
440 441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_init(&bIn, zMsg, (int)strlen(zMsg));
441 442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
wiki_convert(&bIn, &out, WIKI_INLINE);
442 443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* The common case: zMsg is text/markdown */
444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The common case: zMsg is text/x-markdown */
444 445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob bIn;
445 446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_init(&bIn, zMsg, (int)strlen(zMsg));
446 447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
markdown_to_html(&bIn, NULL, &out);
447 448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
448 449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return blob_str(&out);
@@ -781,17 +782,34 @@
781 782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** WEBPAGE: chat-download hidden loadavg-exempt
782 783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
783 784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Download the CHAT.FILE attachment associated with a single chat
784 785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** entry. The "name" query parameter begins with an integer that
785 786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** identifies the particular chat message. The integer may be followed
786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** by a / and a filename, which will indicate to the browser to use
787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** the indicated name when saving the file.
787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** by a / and a filename, which will (A) indicate to the browser to
788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** use the indicated name when saving the file and (B) be used to
789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** guess the mimetype in some particular cases involving the "render"
790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** flag.
791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If the "render" URL parameter is provided, the blob has a size
793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** greater than zero, and blob meets one of the following conditions
794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** then the fossil-rendered form of that content is returned, rather
795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** than the original:
796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** - Mimetype is text/x-markdown or text/markdown: emit HTML.
798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** - Mimetype is text/x-fossil-wiki or P("name") ends with ".wiki":
800 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** emit HTML.
801 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** - Mimetype is text/x-pikchr or P("name") ends with ".pikchr": emit
803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** image/svg+xml if rendering succeeds or text/html if rendering
804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** fails.
788 805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
789 806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void chat_download_webpage(void){
790 807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int msgid;
791 808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob r;
792 809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zMime;
810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zName = PD("name","0");
793 811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
login_check_credentials();
794 812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !g.perm.Chat ){
795 813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
style_header("Chat Not Authorized");
796 814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <h1>Not Authorized</h1>
797 815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <p>You do not have permission to use the chatroom on this
@@ -798,15 +816,48 @@
798 816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ repository.</p>
799 817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
style_finish_page();
800 818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return;
801 819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
802 820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
chat_create_tables();
803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- msgid = atoi(PD("name","0"));
821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ msgid = atoi(zName);
804 822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_zero(&r);
805 823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zMime = db_text(0, "SELECT fmime FROM chat wHERE msgid=%d", msgid);
806 824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zMime==0 ) return;
807 825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_blob(&r, "SELECT file FROM chat WHERE msgid=%d", msgid);
826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( r.nUsed>0 && P("render")!=0 ){
827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Maybe return fossil-rendered form of the content. */
828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob r2 = BLOB_INITIALIZER; /* output target for rendering */
829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char * zMime2 = 0; /* adjusted response mimetype */
830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(fossil_strcmp(zMime, "text/x-markdown")==0
831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Firefox uploads md files with the mimetype text/markdown */
832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || fossil_strcmp(zMime, "text/markdown")==0){
833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ markdown_to_html(&r, 0, &r2);
834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ safe_html(&r2);
835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zMime2 = "text/html";
836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if(fossil_strcmp(zMime, "text/x-fossil-wiki")==0
837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || sqlite3_strglob("*.wiki", zName)==0){
838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* .wiki files get uploaded as application/octet-stream */
839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ wiki_convert(&r, &r2, 0);
840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zMime2 = "text/html";
841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if(fossil_strcmp(zMime, "text/x-pikchr")==0
842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || sqlite3_strglob("*.pikchr",zName)==0){
843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* .pikchr files get uploaded as application/octet-stream */
844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zPikchr = blob_str(&r);
845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int w = 0, h = 0;
846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zOut = pikchr(zPikchr, "pikchr", 0, &w, &h);
847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(zOut){
848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&r2, zOut, -1);
849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zMime2 = w>0 ? "image/svg+xml" : "text/html";
851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ free(zOut);
852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(r2.aData!=0){
854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_swap(&r, &r2);
855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&r2);
856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zMime = zMime2;
857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
808 859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cgi_set_content_type(zMime);
809 860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cgi_set_content(&r);
810 861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
811 862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
812 863 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
813 864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!