void bridge_ornamented_rep::notify_remove (path p, int nr) { // cout << "Remove " << p << ", " << nr << " in " << st << "\n"; ASSERT (!is_nil (p), "nil path"); if (is_atom (p) || (p->item != 0)) bridge_rep::notify_remove (p, nr); else { bool mp_flag= is_multi_paragraph (st); body->notify_remove (p->next, nr); st= substitute (st, 0, body->st); if (mp_flag != is_multi_paragraph (st)) initialize (); } status= CORRUPTED; }
bool edit_select_rep::selection_active_small () { if (!selection_active_normal ()) return false; path p1, p2; selection_get (p1, p2); if (p2 == p1) return false; if (is_multi_paragraph (subtree (et, common (p1, p2)))) return false; return true; }
tree edit_env_rep::rewrite_inactive_var_active ( tree t, tree var, bool block, bool flush) { (void) block; tree r= tree (WITH, MODE, copy (env [MODE]), subvar (var, 0)); if (flush && (src_compact != COMPACT_ALL) && (is_multi_paragraph (t[0]) || (src_compact == COMPACT_NONE))) r= tree (SURROUND, "", compound ("right-flush"), r); return tree (MARK, var, r); }
void bridge_ornamented_rep::notify_assign (path p, tree u) { // cout << "Assign " << p << ", " << u << " in " << st << "\n"; if (is_nil (p)) { st= u; initialize (); } else { bool mp_flag= is_multi_paragraph (st); if (p->item == 0) { if (is_atom (p)) body= make_bridge (ttt, u, descend (ip, 0)); else body->notify_assign (p->next, u); st= substitute (st, p->item, body->st); } else { st= substitute (st, p, u); body->notify_change (); } if (mp_flag != is_multi_paragraph (st)) initialize (); } status= CORRUPTED; }
static bool stop_enlarge_environmental (tree t) { if (is_func (t, WITH, 3) && (t[0] == MODE) && (t[1] == "math")) return true; if (!is_extension (t)) return false; if (is_multi_paragraph (t)) return true; string s= as_string (L(t)); return (s == "part") || (s == "chapter") || (s == "section") || (s == "subsection") || (s == "subsubsection") || (s == "paragraph") || (s == "subparagraph"); }
tree edit_env_rep::rewrite_inactive (tree t, tree var) { // cout << "Rewrite inactive " << t << ", " << var << "\n"; recover_env= tuple (); bool block= (inactive_mode >= INACTIVE_BLOCK_RECURSE); tree r= rewrite_inactive (t, var, block, block); if (is_multi_paragraph (r)) { r= tree (WITH, PAR_PAR_SEP, "0fn", r); r= tree (SURROUND, "", tree (VSPACE, "0.5fn"), r); } if ((inactive_mode == INACTIVE_INLINE_RECURSE) || (inactive_mode == INACTIVE_BLOCK_RECURSE)) r= tree (WITH, MODE, "src", r); // cout << "---> " << r << "\n\n"; return r; }
tree edit_env_rep::rewrite_inactive_active ( tree t, tree var, bool block, bool flush) { tree st= t[0]; tree svar= subvar (var, 0); int i, n= N(st); tree r (st, n); bool mp= is_multi_paragraph (st); for (i=0; i<n; i++) { bool smp= mp && is_long_arg (st, i); if (is_func (st, WITH) && (i<n-1)) r[i]= subvar (svar, i); else r[i]= rewrite_inactive_arg (st, svar, i, block && smp, flush && smp); } return tree (MARK, var, r); }
static tree coqdoc_to_tree (string s) { bool newline= true; int i=0, n= N(s); tree coqdoc (DOCUMENT), line (CONCAT); if (starts (s, "(**")) { line << "(**"; i+= 3; } while (i < n) { if (test (s, i, "[[\n")) { add_line (line, coqdoc); tree vernac= vernac_to_tree (parse_delimited (s, i, "[[\n", "\n]]", false)); coqdoc << compound ("coqdoc-vernac", vernac); newline= true; } else if (s[i] == '[') line << compound ("coqdoc-coq", from_verbatim (parse_delimited (s, i, "[", "]", false))); else if (newline && (test (s, i, "**** ") || test (s, i, "*** ") || test (s, i, "** ") || test (s, i, "* "))) { string header= "section"; if (test (s, i, "** ")) header= "subsection"; if (test (s, i, "*** ")) header= "subsubsection"; if (test (s, i, "**** ")) header= "paragraph"; while (i<n && s[i] == '*') i++; while (i<n && is_spacing (s[i])) i++; int start= i; while (i<n && (s[i] != '\n' && !test (s, i, "*)"))) i++; line << compound (header, coqdoc_to_tree (s (start, i))); } else if (newline && is_defining_pretty_printing (s, i)) { string str= parse_delimited (s, i, "(*", "*)", false); parse_pretty_printing_definition (str); } else if (newline && is_removing_pretty_printing (s, i)) { string str= parse_delimited (s, i, "(*", "*)", false); parse_pretty_printing_removal (str); } else if (test (s, i, "%%")) { line << "%"; newline= false; i+= 2; } else if (test (s, i, "$$")) { line << "$"; newline= false; i+= 2; } else if (test (s, i, "##")) { line << "#"; newline= false; i+= 2; } else if (s[i] == '#' || s[i] == '%' || s[i] == '$') { newline= false; char delim= s[i]; string ext= unescape_coqdoc (parse_delimited (s, i, delim)); tree tm; if (delim == '#') tm= compound ("coqdoc-html", generic_to_tree (ext, "html-snippet")); else if (delim == '$') tm= compound ("coqdoc-latex", generic_to_tree ("$"*ext*"$", "latex-snippet")); else if (delim == '%') tm= compound ("coqdoc-latex", generic_to_tree (ext, "latex-snippet")); if (is_multi_paragraph (tm)) { add_line (line, coqdoc); coqdoc << tm; } else line << tm; } else if (is_list_begining (s, i)) { tree list= parse_list (s, i); add_line (line, coqdoc); coqdoc << list; newline= true; } else if (test (s, i, "\n<<")) { add_line (line, coqdoc); string parsed= parse_delimited (s, i, "\n<<", "\n>>", false); if (N(parsed) > 0 && parsed[0] == '\n') parsed= parsed(1, N(parsed)); tree verb= verbatim_to_tree (parsed, false, "SourceCode"); if (is_atomic (verb)) verb= document (verb); coqdoc << compound ("coqdoc-verbatim", verb); newline= true; } else if (test (s, i, "<<")) { string parsed= parse_delimited (s, i, "<<", ">>", false); tree verb= verbatim_to_tree (parsed, true, "SourceCode"); line << compound ("coqdoc-verbatim", verb); } else if (s[i] == '_' && (i == 0 || !start_ident(s[i-1]))) { line << coqdoc_parse_emphasis (s, i); newline= false; } else if (test (s, i, "----")) { i+= 4; add_line (line, coqdoc); coqdoc << compound ("hrule"); while (i<n && s[i] == '-') i++; newline= true; } else if (s[i] == '\n') { add_line (line, coqdoc); i++; if (is_whiteline (s, i)) { coqdoc << ""; do skip_whiteline (s, i); while (is_whiteline (s, i)); i--; } newline= true; } else if (s[i] == '<') { line << "<less>"; i++; newline= false; } else if (s[i] == '>') { line << "<gtr>"; i++; newline= false; } else { if (!is_spacing (s[i])) newline= false; int start= i; decode_from_utf8 (s, i); line << from_verbatim (s(start, i)); } } if (N(line) > 0) add_line (line, coqdoc); if (N(coqdoc) == 0) return ""; else if (N(coqdoc) == 1) return coqdoc[0]; else return coqdoc; }
bool is_long_arg (tree t, int i) { // FIXME: should go into the DRD int n= N(t); switch (L(t)) { case DOCUMENT: case VAR_INCLUDE: case TFORMAT: case TABLE: return true; case CONCAT: return false; case SURROUND: if (i == 2) return true; break; case ROW: return is_long (t[i]); case ASSIGN: case DATOMS: case DLINES: case DPAGES: case WITH: case MARK: case MACRO: case XMACRO: case CELL: case EVAL: case QUOTE: case QUASI: case QUASIQUOTE: case UNQUOTE: case VAR_UNQUOTE: if (i == n-1) return is_long (t[i]); break; case STYLE_WITH: case VAR_STYLE_WITH: if (i == n-1) { for (i=0; i<n-1; i+=2) if (t[i] == SRC_COMPACT) { if (t[i+1] == "none") return true; if (t[i+1] == "all") return false; } return is_long (t[i]); } break; case STYLE_ONLY: case VAR_STYLE_ONLY: case ACTIVE: case VAR_ACTIVE: return is_multi_paragraph (t[i]); case LOCUS: case CANVAS: case ORNAMENT: if (i == n-1) return is_long (t[i]); break; default: break; } tree u= t[i]; switch (L(u)) { case TWITH: case CWITH: case ROW: return true; default: if (L(t) < START_EXTENSIONS) return false; return is_long (u); } }