let measure_container = null;
+ // 1. DOM Measurement Utilities
function get_el_height(el){
const was_in_DOM = el.parentNode !== null;
if(!was_in_DOM) document.body.appendChild(el);
return h;
}
+ // Splitting Logic
function is_splittable(el){
if(!el || el.nodeType !== Node.ELEMENT_NODE) return null;
const component_id = el.getAttribute('data-rt-component');
if(component_id && window.RT.Component && window.RT.Component[component_id] && window.RT.Component[component_id].split){
- return (remaining ,force) => window.RT.Component[component_id].split(el ,remaining ,measure_fragment ,force);
+ return (remaining) => window.RT.Component[component_id].split(el ,remaining ,measure_fragment);
}
if(el.hasAttribute('splitable') && window.RT.Splitter && window.RT.Splitter[(el.tagName || '').toLowerCase()]){
- return (remaining ,force) => window.RT.Splitter[(el.tagName || '').toLowerCase()](el ,remaining ,measure_fragment ,is_splittable ,force);
+ return (remaining) => window.RT.Splitter[(el.tagName || '').toLowerCase()](el ,remaining ,measure_fragment ,is_splittable);
}
const tag = (el.tagName || '').toUpperCase();
}
function make_list_splitter(el ,info){
- return (remaining ,force) => {
+ return (remaining) => {
const children = Array.from(el.children).filter(c => (c.tagName || '').toUpperCase() === 'LI');
const start = info.offset;
}
}
- if(best_count === 0){
- if(force && children.length > 0){
- best_count = 1;
- best_height = measure_fragment(children[0].cloneNode(true));
- }else{
- return { first: null ,rest: el ,firstHeight: 0 };
- }
- }
-
- if(best_count === children.length){
- return { first: el ,rest: null ,firstHeight: best_height };
- }
+ if(best_count === 0) return { first: null ,rest: el ,firstHeight: 0 };
const first = el.cloneNode(false);
for(let i = 0; i < best_count; i++){
return shell;
};
- return (remaining ,force) => {
+ return (remaining) => {
const tbody = el.querySelector('tbody');
const rows = tbody ? Array.from(tbody.rows) : Array.from(el.rows);
const start = info.offset;
}
}
- if(best_count === 0){
- if(force && rows.length > 0){
- best_count = 1;
- best_height = measure_fragment(rows[0].cloneNode(true));
- }else{
- return { first: null ,rest: el ,firstHeight: 0 };
- }
- }
-
- if(best_count === rows.length){
- return { first: el ,rest: null ,firstHeight: best_height };
- }
+ if(best_count === 0) return { first: null ,rest: el ,firstHeight: 0 };
const first = create_shell();
const first_body = first.querySelector('tbody');
};
}
+ // RT ELEMENT SPLITTERS
window.RT.Splitter = window.RT.Splitter || {};
- window.RT.Splitter['rt·counter·step'] = function(el ,remaining ,measure_fn ,is_splittable_fn ,force){
+ window.RT.Splitter['rt·counter·step'] = function(el ,remaining ,measure_fn ,is_splittable_fn){
const children = Array.from(el.childNodes);
let best_count = 0;
let best_height = 0;
temp_container.removeChild(temp_container.lastChild);
const child_splitter = child.nodeType === Node.ELEMENT_NODE ? is_splittable_fn(child) : null;
if(child_splitter){
- const child_split = child_splitter(remaining - best_height ,false);
+ const child_split = child_splitter(remaining - best_height);
if(child_split && child_split.first){
split_child_result = child_split;
best_height += child_split.firstHeight;
}
}
- if(best_count === children.length && !split_child_result && !forced_break){
- return { first: el ,rest: null ,firstHeight: best_height };
- }
-
if(best_count === 0 && !split_child_result && !forced_break){
- if(force && children.length > 0){
- best_count = 1;
- best_height = measure_fn(children[0].cloneNode(true));
- }else{
- return { first: null ,rest: el ,firstHeight: 0 };
- }
+ return { first: null ,rest: el ,firstHeight: 0 };
}
const first = el.cloneNode(false);
return { first: first ,rest: rest ,firstHeight: best_height };
};
+ // PAGINATE 0: CHUNKING & INJECTING STRUCTURE
function paginate_0(){
if(debug.log) debug.log('paginate_0' ,'Running initial document chunking');
if(splitter){
const remaining = page_height_limit - current_h;
- let split_res = splitter(remaining ,false);
-
- if(!split_res.first && current_h === 0){
- split_res = splitter(remaining ,true);
- }
-
- const { first ,rest ,firstHeight } = split_res;
+ const { first ,rest ,firstHeight } = splitter(remaining);
if(first){
current_batch_seq.push(first);
continue;
}
}else{
- let backtrack_seq = [];
- let backtrack_h = 0;
-
- while(current_batch_seq.length > 0){
- const last = current_batch_seq[current_batch_seq.length - 1];
- if(!last.tagName || !/^H[1-6]$/i.test(last.tagName)) break;
- const popped = current_batch_seq.pop();
- backtrack_seq.unshift(popped);
- backtrack_h += get_el_height(popped);
- }
-
- if(current_h - backtrack_h > 0){
- page_seq.push(current_batch_seq);
- current_batch_seq = backtrack_seq;
- current_h = backtrack_h;
+ if(current_h === 0){
+ const frame = document.createElement('RT·scroll-frame');
+ frame.style.display = 'block';
+ frame.style.overflowY = 'auto';
+ frame.style.maxHeight = page_height_limit + 'px';
+ frame.appendChild(el);
+ current_batch_seq.push(frame);
+ i++;
}else{
- current_batch_seq.push(...backtrack_seq);
- current_h += backtrack_h;
+ let backtrack_seq = [];
+ let backtrack_h = 0;
+
+ while(current_batch_seq.length > 0){
+ const last = current_batch_seq[current_batch_seq.length - 1];
+ if(!last.tagName || !/^H[1-6]$/i.test(last.tagName)) break;
+ const popped = current_batch_seq.pop();
+ backtrack_seq.unshift(popped);
+ backtrack_h += get_el_height(popped);
+ }
+
+ if(current_h - backtrack_h > 0){
+ page_seq.push(current_batch_seq);
+ current_batch_seq = backtrack_seq;
+ current_h = backtrack_h;
+ }else{
+ current_batch_seq.push(...backtrack_seq);
+ current_h += backtrack_h;
+
+ const frame = document.createElement('RT·scroll-frame');
+ frame.style.display = 'block';
+ frame.style.overflowY = 'auto';
+ frame.style.maxHeight = page_height_limit + 'px';
+ frame.appendChild(el);
+ current_batch_seq.push(frame);
+ i++;
+ }
}
}
continue;