Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Initial go at using CSS grid layout for side-by-side diffs, rather than using JS to dynamically fit the columns. See discussion at [forum:93398561d3986c41|forum post 93398561d3986c41]. |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | sbs-diff-css |
| Files: | files | file ages | folders |
| SHA3-256: |
375f2af4841c17ee76b9e064f44635bd |
| User & Date: | stephan 2024-07-30 12:03:38.265 |
Context
|
2024-07-31
| ||
| 10:57 | Correct the placement of the right-side line number column in sbs diffs. ... (check-in: 15139fa821 user: stephan tags: sbs-diff-css) | |
|
2024-07-30
| ||
| 12:03 | Initial go at using CSS grid layout for side-by-side diffs, rather than using JS to dynamically fit the columns. See discussion at [forum:93398561d3986c41|forum post 93398561d3986c41]. ... (check-in: 375f2af484 user: stephan tags: sbs-diff-css) | |
| 10:56 | Spell out "setting" in loadmgmt.md. [forum:/forumpost/7485b4bf89|Forum post 7485b4bf89]. ... (check-in: d90990701d user: drh tags: trunk) | |
Changes
Changes to src/default.css.
| ︙ | ︙ | |||
661 662 663 664 665 666 667 |
}
tr.diffskip > td.chunkctrl .jcbutton.down > span::before {
content: '⇣';
}
tr.diffskip > td.chunkctrl .jcbutton.up.down > span::before {
content: '⇡⇣';
}
| < > > > > > > > > > > > > > > > > | > | > | 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 |
}
tr.diffskip > td.chunkctrl .jcbutton.down > span::before {
content: '⇣';
}
tr.diffskip > td.chunkctrl .jcbutton.up.down > span::before {
content: '⇡⇣';
}
tr.diffskip > td.chunkctrl .jcbutton:hover {
cursor: pointer;
opacity: 1;
filter: contrast(1);
}
table.splitdiff tr.diffchunk {
display: grid;
gap: 0px 0px;
grid-template-rows: 1fr;
grid-template-columns: auto 1fr auto auto 1fr;
grid-template-areas: "difflnl difftxtl diffsep difflnr difftxtr";
}
table.udiff tr.diffchunk {
grid-template-columns: auto auto auto 1fr;
grid-template-areas: "difflnl difflnr diffsep difftxtu";
}
td.difflnr { grid-area: difflnr; }
td.difftxtu { grid-area: difftxtu; }
td.difftxtl { grid-area: difftxtl; }
td.difftxtr { grid-area: difftxtr; }
td.diffln {
width: fit-content;
text-align: right;
padding: 0 1em 0 0;
grid-area: difflnl;
}
td.difflne {
padding-bottom: 0.4em;
}
td.diffsep {
width: fit-content;
padding: 0 0.3em 0 0.5em;
grid-area: diffsep;
}
td.difftxt pre {
overflow-x: auto;
}
td.diffln ins {
background-color: #a0e4b2;
text-decoration: none;
|
| ︙ | ︙ |
Changes to src/diff.c.
| ︙ | ︙ | |||
1284 1285 1286 1287 1288 1289 1290 |
blob_append_xfer(p->pOut, &p->aCol[1]);
blob_append(p->pOut, "</pre></td><td class=\"difftxt difftxtu\"><pre>\n",-1);
blob_append_xfer(p->pOut, &p->aCol[2]);
blob_append(p->pOut, "</pre></td></tr>\n", -1);
}
static void dfunifiedStartRow(DiffBuilder *p){
if( blob_size(&p->aCol[0])>0 ) return;
| | | 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 |
blob_append_xfer(p->pOut, &p->aCol[1]);
blob_append(p->pOut, "</pre></td><td class=\"difftxt difftxtu\"><pre>\n",-1);
blob_append_xfer(p->pOut, &p->aCol[2]);
blob_append(p->pOut, "</pre></td></tr>\n", -1);
}
static void dfunifiedStartRow(DiffBuilder *p){
if( blob_size(&p->aCol[0])>0 ) return;
blob_appendf(p->pOut,"<tr id=\"chunk%d\" class=\"diffchunk\">"
"<td class=\"diffln difflnl\"><pre>\n", ++nChunk);
}
static void dfunifiedSkip(DiffBuilder *p, unsigned int n, int isFinal){
dfunifiedFinishRow(p);
if( p->pCfg && p->pCfg->zLeftHash ){
blob_appendf(p->pOut,
"<tr class=\"diffskip\" data-startln=\"%d\" data-endln=\"%d\""
|
| ︙ | ︙ | |||
1510 1511 1512 1513 1514 1515 1516 |
blob_append_xfer(p->pOut, &p->aCol[2]);
blob_append(p->pOut, "</pre></td><td class=\"difftxt difftxtr\"><pre>\n",-1);
blob_append_xfer(p->pOut, &p->aCol[3]);
blob_append(p->pOut, "</pre></td></tr>\n", -1);
}
static void dfsplitStartRow(DiffBuilder *p){
if( blob_size(&p->aCol[0])>0 ) return;
| | | 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 |
blob_append_xfer(p->pOut, &p->aCol[2]);
blob_append(p->pOut, "</pre></td><td class=\"difftxt difftxtr\"><pre>\n",-1);
blob_append_xfer(p->pOut, &p->aCol[3]);
blob_append(p->pOut, "</pre></td></tr>\n", -1);
}
static void dfsplitStartRow(DiffBuilder *p){
if( blob_size(&p->aCol[0])>0 ) return;
blob_appendf(p->pOut,"<tr id=\"chunk%d\" class=\"diffchunk\">"
"<td class=\"diffln difflnl\"><pre>\n", ++nChunk);
p->eState = 0;
}
static void dfsplitSkip(DiffBuilder *p, unsigned int n, int isFinal){
dfsplitFinishRow(p);
if( p->pCfg && p->pCfg->zLeftHash ){
blob_appendf(p->pOut,
|
| ︙ | ︙ |
Changes to src/fossil.diff.js.
| ︙ | ︙ | |||
104 105 106 107 108 109 110 |
const td = tr.querySelector('td:nth-child('+(
/* TD element with the line numbers */
getLHS ? 1 : (isSplit ? 4 : 2)
)+')');
const m = f.rx[getStart ? 'start' : 'end'].exec(td.innerText);
return m ? +m[1] : undefined/*"shouldn't happen"*/;
};
| | | 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
const td = tr.querySelector('td:nth-child('+(
/* TD element with the line numbers */
getLHS ? 1 : (isSplit ? 4 : 2)
)+')');
const m = f.rx[getStart ? 'start' : 'end'].exec(td.innerText);
return m ? +m[1] : undefined/*"shouldn't happen"*/;
};
/**
Installs chunk-loading controls into TR.diffskip element tr.
Each instance corresponds to a single TR.diffskip element.
The goal is to base these controls roughly on github's, a good
example of which, for use as a model, is:
|
| ︙ | ︙ | |||
636 637 638 639 640 641 642 643 644 645 646 647 648 649 |
** both sides scroll together. Left and right arrows also scroll.
*/
window.fossil.onPageLoad(function(){
const SCROLL_LEN = 25;
const F = window.fossil, D = F.dom, Diff = F.diff;
var lastWidth;
Diff.checkTableWidth = function f(force){
if(undefined === f.contentNode){
f.contentNode = document.querySelector('div.content');
}
force = true;
const parentCS = window.getComputedStyle(f.contentNode);
const parentWidth = (
//document.body.clientWidth;
| > > > > > > > > | 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 |
** both sides scroll together. Left and right arrows also scroll.
*/
window.fossil.onPageLoad(function(){
const SCROLL_LEN = 25;
const F = window.fossil, D = F.dom, Diff = F.diff;
var lastWidth;
Diff.checkTableWidth = function f(force){
if(1){
return this;
/**
What follows is largely obsolete but we will want parts of it
if we decide to retain the synchronous-scroll feature of
SBS diffs (which we otherwise lose in the CSS-based reimplementation).
*/
}
if(undefined === f.contentNode){
f.contentNode = document.querySelector('div.content');
}
force = true;
const parentCS = window.getComputedStyle(f.contentNode);
const parentWidth = (
//document.body.clientWidth;
|
| ︙ | ︙ | |||
748 749 750 751 752 753 754 |
Checkin a7fbefee38a1c522 file diff.c */
return false;
}, false);
}
}
return this;
}
| > | | | | | | > > > > > > > > > | 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 |
Checkin a7fbefee38a1c522 file diff.c */
return false;
}, false);
}
}
return this;
}
if(0){
window.fossil.page.tweakSbsDiffs = function(){
document.querySelectorAll('table.splitdiff').forEach((e)=>Diff.initTableDiff(e));
Diff.checkTableWidth();
};
Diff.initTableDiff().checkTableWidth();
window.addEventListener('resize', F.debounce(()=>Diff.checkTableWidth()));
}else{
/* tweakSbsDiffs() is called by /fileedit and /wikieedit when it
runs an SBS diff. We _might_ want to retain this function to
re-enable synchronized sbs diff scrolling. If we decided to not
retain that feature with the CSS-based SBS diff, we can remove
this block and the corresponding calls to this function in
fossil.page.{wikiedit,fileedit}.js. */
window.fossil.page.tweakSbsDiffs = function(){};
}
}, false);
|