static void adjust_right_script (tree t, path& o1) { while (is_concat (t) && o1->item > 0 && o1->next == path (0)) { tree st= t[o1->item]; if (is_func (st, RSUB) || is_func (st, RSUP) || is_func (st, RPRIME)) { tree pt= t[o1->item-1]; if (!is_atomic (pt)) o1= path (o1->item-1, start (pt)); else { string s= pt->label; int pos= N(s); while (pos > 0) { int prev= pos; tm_char_backwards (s, prev); if (pos == N(s)); else if (is_numeric (s (prev, N(s)))); else if (is_iso_alpha (s (prev, N(s)))); else break; pos= prev; } o1= path (o1->item-1, pos); } } else break; } }
cursor text_box_rep::find_cursor (path bp) { metric ex; cursor cu (0, 0); int l= min (bp->item, N(str)); fn->get_extents (str (0, l), ex); cu->ox= ex->x2; if (!is_nil (xk) && N(str) != 0) { STACK_NEW_ARRAY (xpos, SI, N(str)+1); fn->get_xpositions (str, xpos, xk->padding); SI d= xk->padding - xk->left; cu->ox= xpos[l] - d; if (l == 0) cu->ox += d; if (l == N(str)) cu->ox += xk->right; STACK_DELETE_ARRAY (xpos); } if (l != 0) { int k= l; tm_char_backwards (str, k); fn->get_extents (str (k, l), ex); } cu->y1= min (ex->y1, 0); cu->y2= max (ex->y2, fn->yx); cu->slope= fn->get_right_slope (str); return cu; }
void edit_select_rep::select_enlarge_text () { path p= common (start_p, end_p); if (start_p == end_p) p= path_up (p); tree st= subtree (et, p); ASSERT (is_atomic (st), "non textual tree"); string s= st->label; string mode= get_env_string (MODE); int i1= last_item (start_p), j1= i1; int i2= last_item (end_p), j2= i2; path q= path_up (p); if (mode == "text" || mode == "src") { int i, f= 4; if (i1 > 0) { i= i1; tm_char_backwards (s, i); f= min (f, breaking_force (s[i])); } if (i2 < N(s)) f= min (f, breaking_force (s[i2])); while (i1 > 0) { i= i1; tm_char_backwards (s, i); if (breaking_force (s[i]) > f) break; i1= i; } while (i2 < N(s)) { if (breaking_force (s[i2]) > f) break; tm_char_forwards (s, i2); } if (i1 < i2 && (i1 != j1 || i2 != j2)) { if (is_concat (subtree (et, q)) && i1 == 0 && i2 == N(s)) select (q * 0, q * 1); else select (p * i1, p * i2); return; } } if (is_concat (subtree (et, q)) || (i1 == 0 && i2 == N(s))) select (q * 0, q * 1); else select (p * 0, p * N(s)); }
tree edit_interface_rep::compute_text_footer (tree st) { string r; language lan= get_env_language (); int end = last_item (tp); int start= end; tm_char_backwards (st->label, start); r= st->label (start, end); if (r == "") r= "start"; if (r == " ") r= "space"; if (r == "space" && get_env_string (MODE) == "math") r= "apply"; if (starts (r, "<") && !starts (r, "<#")) if (cork_to_utf8 (r) != r) r= r * " (" * r(1, N(r)-1) * ")"; return r; }
static tree move_brackets_sub (tree t, bool in) { //cout << t << INDENT << LF; if (is_compound (t)) { int i, n= N(t); tree r= tree (t, n); for (i=0; i<n; i++) r[i]= move_brackets_sub (t[i], in); t= r; } while (true) { tree r= t; bool search= true; if (is_concat (t)) for (int i=0; i<N(t) && search; i++) if (is_compound (t[i], "math")) { array<tree> a= concat_tokenize (t[i][0]); for (int j=0; j<N(a) && search; j++) if (is_atomic (a[j]) && is_simple_opening (a[j]->label)) for (int k= i+1; k<N(t) && search; k++) if (is_atomic (t[k])) { string s= t[k]->label; for (int l=0; l<N(s) && search; tm_char_forwards (s, l)) if (is_simple_matching (a[j]->label, s (l, l+1))) { if (k == i+1 && l == 0 && in) { array<tree> c= concat_decompose (t); a << tree (s (0, 1)); c[i]= compound ("math", concat_recompose (a)); c[i]= upgrade_brackets (c[i]); c[i+1]= s (1, N(s)); r= move_brackets_sub (concat_recompose (c), in); search= false; } else if (j == 0 && !in) { tree x= a[0]; array<tree> c= concat_decompose (t); a= range (a, 1, N(a)); c[i]= compound ("math", concat_recompose (a)); c= append (range (c, 0, i), append (x, range (c, i, N(c)))); r= move_brackets_sub (concat_recompose (c), in); search= false; } } } for (int j=N(a)-1; j>=0 && search; j--) if (is_atomic (a[j]) && is_simple_closing (a[j]->label)) for (int k= i-1; k>=0 && search; k--) if (is_atomic (t[k])) { string s= t[k]->label; for (int l=N(s); l>0 && search; tm_char_backwards (s, l)) if (is_simple_matching (s (l-1, l), a[j]->label)) { if (k == i-1 && l == N(s) && in) { array<tree> c= concat_decompose (t); a= append (tree (s (l-1, l)), a); c[i]= compound ("math", concat_recompose (a)); c[i]= upgrade_brackets (c[i]); c[i-1]= s (0, l-1); r= move_brackets_sub (concat_recompose (c), in); search= false; } else if (j == N(a)-1 && !in) { tree x= a[j]; array<tree> c= concat_decompose (t); a= range (a, 0, j); c[i]= compound ("math", concat_recompose (a)); c= append (range (c, 0, i+1), append (x, range (c, i+1, N(c)))); r= move_brackets_sub (concat_recompose (c), in); search= false; } } } } if (search) break; else { //cout << "< " << t << LF; //cout << "> " << r << LF; t= r; } } //cout << UNINDENT << "Done" << LF; return t; }