Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Fix the /file page so that it is able to play sound files that are checked into the repository. Example: [/file/src/sounds/plunk.wav] |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA3-256: |
6643d4a0c1aabb8562fc1ab1803d13fa |
| User & Date: | drh 2021-01-03 15:30:19.833 |
References
|
2021-01-04
| ||
| 15:18 | Fix rendering on the /file page that causes text files to be reported as binary. Caused by check-in [6643d4a0c1aabb85]. ... (check-in: e5d30a7c34 user: drh tags: trunk) | |
Context
|
2021-01-03
| ||
| 16:40 | Use the "plunk" sound for audiable alert in chat. Back out the "ping" processing logic. ... (check-in: f2fcdbc505 user: drh tags: trunk) | |
| 15:30 | Fix the /file page so that it is able to play sound files that are checked into the repository. Example: [/file/src/sounds/plunk.wav] ... (check-in: 6643d4a0c1 user: drh tags: trunk) | |
| 12:59 | Downsampled plunk.wav to 8k, shrinking it to 6kb. ... (check-in: 327a82f769 user: stephan tags: trunk) | |
Changes
Changes to src/doc.c.
| ︙ | ︙ | |||
36 37 38 39 40 41 42 |
int i;
int n;
const unsigned char *x;
/* A table of mimetypes based on file content prefixes
*/
static const struct {
| | | > > > | | | | | > > | | > > > > | 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
int i;
int n;
const unsigned char *x;
/* A table of mimetypes based on file content prefixes
*/
static const struct {
const char *z; /* Identifying file text */
const unsigned char sz1; /* Length of the prefix */
const unsigned char of2; /* Offset to the second segment */
const unsigned char sz2; /* Size of the second segment */
const unsigned char mn; /* Minimum size of input */
const char *zMimetype; /* The corresponding mimetype */
} aMime[] = {
{ "GIF87a", 6, 0, 0, 6, "image/gif" },
{ "GIF89a", 6, 0, 0, 6, "image/gif" },
{ "\211PNG\r\n\032\n", 8, 0, 0, 8, "image/png" },
{ "\377\332\377", 3, 0, 0, 3, "image/jpeg" },
{ "\377\330\377", 3, 0, 0, 3, "image/jpeg" },
{ "RIFFWAVEfmt", 4, 8, 7, 15, "sound/wav" },
};
if( !looks_like_binary(pBlob) ) {
return 0; /* Plain text */
}
x = (const unsigned char*)blob_buffer(pBlob);
n = blob_size(pBlob);
for(i=0; i<count(aMime); i++){
if( n<aMime[i].mn ) continue;
if( memcmp(x, aMime[i].z, aMime[i].sz1)!=0 ) continue;
if( aMime[i].sz2
&& memcmp(x+aMime[i].of2, aMime[i].z+aMime[i].sz1, aMime[i].sz2)!=0
){
continue;
}
return aMime[i].zMimetype;
}
return "unknown/unknown";
}
/* A table of mimetypes based on file suffixes.
** Suffixes must be in sorted order so that we can do a binary
** search to find the mime-type
|
| ︙ | ︙ |
Changes to src/info.c.
| ︙ | ︙ | |||
2364 2365 2366 2367 2368 2369 2370 |
@ part of check-in %z(href("%R/info/%!S",zCIUuid))%s(zCI)</a></h2>
}else{
@ part of check-in %z(href("%R/info/%!S",zCIUuid))%S(zCIUuid)</a></h2>
}
blob_reset(&path);
}
style_submenu_element("Artifact", "%R/artifact/%S", zUuid);
| > > | | | | > > | 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 |
@ part of check-in %z(href("%R/info/%!S",zCIUuid))%s(zCI)</a></h2>
}else{
@ part of check-in %z(href("%R/info/%!S",zCIUuid))%S(zCIUuid)</a></h2>
}
blob_reset(&path);
}
style_submenu_element("Artifact", "%R/artifact/%S", zUuid);
zMime = mimetype_from_name(zName);
if( zMime && strncmp(zMime, "text/", 5)==0 ){
style_submenu_element("Annotate", "%R/annotate?filename=%T&checkin=%T",
zName, zCI);
style_submenu_element("Blame", "%R/blame?filename=%T&checkin=%T",
zName, zCI);
}
blob_init(&downloadName, zName, -1);
objType = OBJTYPE_CONTENT;
}else{
@ <h2>Artifact
style_copy_button(1, "hash-ar", 0, 2, "%s", zUuid);
if( g.perm.Setup ){
@ (%d(rid)):</h2>
}else{
@ :</h2>
}
blob_zero(&downloadName);
if( asText ) objdescFlags &= ~OBJDESC_BASE;
objType = object_description(rid, objdescFlags,
(isFile?zName:0), &downloadName);
zMime = mimetype_from_name(blob_str(&downloadName));
}
if( !descOnly && P("download")!=0 ){
cgi_redirectf("%R/raw/%s?at=%T",
db_text("x", "SELECT uuid FROM blob WHERE rid=%d", rid),
file_tail(blob_str(&downloadName)));
/*NOTREACHED*/
}
|
| ︙ | ︙ | |||
2437 2438 2439 2440 2441 2442 2443 |
}
db_finalize(&q);
}
style_submenu_element("Download", "%R/raw/%s?at=%T", zUuid, file_tail(zName));
if( db_exists("SELECT 1 FROM mlink WHERE fid=%d", rid) ){
style_submenu_element("Check-ins Using", "%R/timeline?uf=%s", zUuid);
}
| < | 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 |
}
db_finalize(&q);
}
style_submenu_element("Download", "%R/raw/%s?at=%T", zUuid, file_tail(zName));
if( db_exists("SELECT 1 FROM mlink WHERE fid=%d", rid) ){
style_submenu_element("Check-ins Using", "%R/timeline?uf=%s", zUuid);
}
if( zMime ){
if( fossil_strcmp(zMime, "text/html")==0 ){
if( asText ){
style_submenu_element("Html", "%s", url_render(&url, "txt", 0, 0, 0));
}else{
renderAsHtml = 1;
style_submenu_element("Text", "%s", url_render(&url, "txt", "1", 0, 0));
|
| ︙ | ︙ | |||
2502 2503 2504 2505 2506 2507 2508 |
@ <object type="image/svg+xml" data="%R/raw/%s(zUuid)"></object>
}else{
style_submenu_element("Hex", "%R/hexdump?name=%s", zUuid);
if( zLn==0 || atoi(zLn)==0 ){
style_submenu_checkbox("ln", "Line Numbers", 0, 0);
}
blob_to_utf8_no_bom(&content, 0);
| | | 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 |
@ <object type="image/svg+xml" data="%R/raw/%s(zUuid)"></object>
}else{
style_submenu_element("Hex", "%R/hexdump?name=%s", zUuid);
if( zLn==0 || atoi(zLn)==0 ){
style_submenu_checkbox("ln", "Line Numbers", 0, 0);
}
blob_to_utf8_no_bom(&content, 0);
if( zMime==0 ) zMime = mimetype_from_content(&content);
@ <blockquote class="file-content">
if( zMime==0 ){
const char *z, *zFileName, *zExt;
z = blob_str(&content);
zFileName = db_text(0,
"SELECT name FROM mlink, filename"
" WHERE filename.fnid=mlink.fnid"
|
| ︙ | ︙ | |||
2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 |
@ %h(z)
@ </pre>
}
}else if( strncmp(zMime, "image/", 6)==0 ){
@ <p>(file is %d(blob_size(&content)) bytes of image data)</i></p>
@ <p><img src="%R/raw/%s(zUuid)?m=%s(zMime)"></p>
style_submenu_element("Image", "%R/raw/%s?m=%s", zUuid, zMime);
}else{
@ <i>(file is %d(blob_size(&content)) bytes of binary data)</i>
}
@ </blockquote>
}
}
style_finish_page();
| > > > > | 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 |
@ %h(z)
@ </pre>
}
}else if( strncmp(zMime, "image/", 6)==0 ){
@ <p>(file is %d(blob_size(&content)) bytes of image data)</i></p>
@ <p><img src="%R/raw/%s(zUuid)?m=%s(zMime)"></p>
style_submenu_element("Image", "%R/raw/%s?m=%s", zUuid, zMime);
}else if( strncmp(zMime, "audio/", 6)==0 ){
@ <audio controls src="%R/raw/%s(zUuid)?m=%s(zMime)">
@ (Not supported by this browser)
@ </audio>
}else{
@ <i>(file is %d(blob_size(&content)) bytes of binary data)</i>
}
@ </blockquote>
}
}
style_finish_page();
|
| ︙ | ︙ |