bool gs_image_size_sub (string buf, int& w_pt, int& h_pt) { int pos= search_forwards ("\n%%BoundingBox: ", buf); if (pos < 0) pos = search_forwards ("%%BoundingBox: ", buf); if (pos < 0) return false; if (buf[pos] == '\n') pos++; bool ok= read (buf, pos, "%%BoundingBox: "); double X1, Y1, X2, Y2; int x1, y1, x2, y2; skip_spaces (buf, pos); ok= read_double (buf, pos, X1) && ok; x1= (int) floor (X1); skip_spaces (buf, pos); ok= read_double (buf, pos, Y1) && ok; y1= (int) floor (Y1); skip_spaces (buf, pos); ok= read_double (buf, pos, X2) && ok; x2= (int) ceil (X2); skip_spaces (buf, pos); ok= read_double (buf, pos, Y2) && ok; y2= (int) ceil (Y2); if (!ok) return false; w_pt= x2-x1; h_pt= y2-y1; return true; }
bool edit_interface_rep::try_shortcut (string comb) { int status; command cmd; string shorth; string help; sv->get_keycomb (comb, status, cmd, shorth, help); //cout << "Try " << comb << " -> " << shorth << ", " << help //<< "; " << sh_mark << ", " << status << "\n"; if (status != 0) { if (status >= 3) { interrupt_shortcut (); status -= 3; if (status == 0) return false; } else { if (sh_mark != 0 && !mark_cancel (sh_mark)) { sh_mark= 0; return false; } } sh_s= comb; sh_mark= new_marker (); mark_start (sh_mark); archive_state (); string rew_s= sv->kbd_post_rewrite (sh_s); tree rew= sv->kbd_system_rewrite (rew_s); if (N(help)>0) set_message (help, rew); tree rhs= (shorth == rew_s? tree (""): sv->kbd_system_rewrite (shorth)); //cout << "Shortcut: " << sh_s << " -> " << rew << "\n"; if ((search_forwards (" ", comb) >= 0 && comb != " ") || (search_forwards ("-", comb) >= 0 && comb != "-")) { tree t= rhs; if (is_compound (t, "render-key", 1)) t= t[0]; if (is_func (t, WITH)) t= t[N(t)-1]; string r= as_string (t); if (starts (r, "<") && !starts (r, "<#")) if (cork_to_utf8 (r) != r) rhs= tree (CONCAT, rhs, " (" * r(1, N(r)-1) * ")"); call ("set-temporary-message", tree (CONCAT, "keyboard shortcut: ", rew), rhs, shorth == ""? 1: 3000); } if ((status & 1) == 1) cmd (); else if (N(shorth) > 0) call ("kbd-insert", shorth); //cout << "Mark= " << sh_mark << "\n"; return true; } return false; }
static string merge_declarations (string olds, string news) { hashmap<string,path> oldd= latex_get_declarations (olds); hashmap<string,path> newd= latex_get_declarations (news); //cout << "oldd= " << oldd << "\n"; //cout << "newd= " << newd << "\n"; // Substitute redefinitions into old preamble hashmap<int,string> oldw, oldb; iterator<string> it= iterate (oldd); while (it->busy ()) { string cmd= it->next (); if (newd->contains (cmd)) { path oldp= oldd[cmd]; path newp= newd[cmd]; oldw (oldp[0])= olds (oldp[0], oldp[1]); oldb (oldp[0])= news (newp[0], newp[1]); } } olds= replace (olds, oldw, oldb); // Extract new definitions from new preamble hashmap<int,string> back; it= iterate (newd); while (it->busy ()) { string cmd= it->next (); if (!oldd->contains (cmd)) { path p= newd [cmd]; back (p[0])= news (p[0], p[1]); } } string accum; for (int i=0; i<N(news); i++) if (test (news, i, "\\begin{document}")) break; else if (back->contains (i)) accum << back[i] << "\n"; // Insert new definitions into old preamble int oldi= search_forwards ("\\begin{document}", olds); int newi= search_forwards ("\\begin{document}", news); if (oldi < 0) { if (ends (olds, "\n") || olds == "" || accum == "") return olds * accum; else return olds * "\n" * accum; } int i= oldi, cnt= 0; while (i>0 && (olds[i-1] == ' ' || olds[i-1] == '\t' || olds[i-1] == '\n')) { i--; if (olds[i] == '\n') cnt++; } if (cnt < 2 && N(accum) != 0) accum= "\n" * accum; if (N(accum) != 0) accum << "\n"; return olds (0, oldi) * accum * news (newi, N(news)); }
void gs_fix_bbox (url eps, int x1, int y1, int x2, int y2) { // used to restore appropriate bounding box of an eps file in case epswrite // spuriously changes it (see gs_to_eps) string outbuf, buf; int inx1, iny1, inx2, iny2; bool err = load_string (eps, buf, false); if (!err) { if (DEBUG_CONVERT) debug_convert<< "fix_bbox input bbox : "; if ( !ps_read_bbox (buf, inx1, iny1, inx2, iny2 ) ) return; //bbox not found... should not occur if (inx1!=x1 || iny1!=y1 || inx2!=x2 || iny2!=y2) { int pos= search_forwards ("%%BoundingBox:", buf); pos += 14; outbuf << buf(0, pos) << " " << as_string(x1) << " " << as_string(y1) << " " << as_string(x2) << " " << as_string(y2) << "\n"; skip_line (buf, pos); if (read (buf, pos, "%%HiResBoundingBox:")) skip_line (buf, pos); outbuf << buf(pos, N(buf)); save_string (eps, outbuf, true); if (DEBUG_CONVERT) debug_convert<< "restored bbox : " << ps_read_bbox (outbuf, x1, y1, x2, y2 )<<LF; } set_imgbox_cache(eps->t, x2-x1, y2-y1, x1, y1); } }
static string merge_packages (string olds, string news) { // Extract usepackage commands from news hashmap<string,path> oldp= latex_get_packages (olds); hashmap<string,path> newp= latex_get_packages (news); hashmap<int,string> packs; iterator<string> it= iterate (newp); while (it->busy ()) { string name= it->next (); if (!oldp->contains (name)) { path p= newp [name]; packs (p[0])= news (p[0], p[1]); } } string accum; for (int i=0; i<N(news); i++) if (test (news, i, "\\begin{document}")) break; else if (packs->contains (i)) accum << packs[i] << "\n"; // Insert result into olds, just after last \usepackage{...} int docpos= search_forwards ("\\begin{document}", olds); if (docpos < 0) return olds; int start= search_backwards ("\\usepackage", docpos, olds); if (start < 0) start= search_backwards ("\\documentclass", docpos, olds); if (start < 0) start= search_backwards ("\\documentstyle", docpos, olds); if (start < 0) return olds; skip_line (olds, start); if (start > docpos) return olds; return olds (0, start) * accum * olds (start, N(olds)); }
tree translate_replace (tree t, string from, string to, int n=1) { if (N(t) < 2) return t[0]; string s= t[0]->label; string arg= "%" * as_string (n); if (is_atomic (t[1])) { s= replace (s, arg, translate (t[1]->label, from, to)); return translate_replace (concat (s) * t(2, N(t)), from, to, n+1); } else { int l= search_forwards (arg, s); if (l < 0) return t; int r= l + N(arg); tree r1= tree_translate (t[1], from, to); tree r2= translate_replace (tuple (s (r, N(s))) * t(2, N(t)), from, to, n+1); s= s(0, l); if (is_atomic (r1)) { if (is_atomic (r2)) return s * r1->label * r2->label; else return concat (s * r1->label, r2); } return concat (s, r1, r2); } }
SI text_box_rep::get_leaf_offset (string search) { int pos= search_forwards (search, 0, str); if (pos == -1) return w(); metric ex; fn->get_extents (str (0, pos), ex); return ex->x2- ex->x1; }
static void init_deprecated () { #ifndef OS_WIN32 // Check for Macaulay 2 if (get_env ("M2HOME") == "") if (exists_in_path ("M2")) { string where= concretize (resolve_in_path ("M2")); string s = var_eval_system ("grep 'M2HOME=' " * where); string dir = s (search_forwards ("=", s) + 1, N(s)); if (dir != "") set_env ("M2HOME", dir); } #endif }
string edit_interface_rep::session_complete_command (tree tt) { path p= reverse (obtain_ip (tt)); tree st= subtree (et, p); if ((N(tp) <= N(p)) || (tp[N(p)] != 1)) return ""; tree t= put_cursor (st[1], tail (tp, N(p)+1)); // cout << t << LF; (void) eval ("(use-modules (utils plugins plugin-cmd))"); string lan= get_env_string (PROG_LANGUAGE); string ses= get_env_string (PROG_SESSION); string s = as_string (call ("verbatim-serialize", lan, tree_to_stree (t))); s= s (0, N(s)-1); int pos= search_forwards (cursor_symbol, s); if (pos == -1) return ""; s= s (0, pos) * s (pos + N(cursor_symbol), N(s)); // cout << s << ", " << pos << LF; return "(complete " * scm_quote (s) * " " * as_string (pos) * ")"; }
bool gs_PDFimage_size (url image, int& w_pt, int& h_pt) { if (DEBUG_CONVERT) debug_convert << "gs PDF image size :"<<LF; string buf; string cmd= gs_prefix (); cmd << "-dNODISPLAY -q -sFile="; cmd << sys_concretize (image); cmd <<" "<<sys_concretize ("$TEXMACS_PATH/misc/convert/pdf_info.ps"); buf= eval_system (cmd); if (DEBUG_CONVERT) debug_convert << "gs cmd :"<<cmd<<LF <<"answer :"<< buf ; //if CropBox is defined, then use it, else Mediabox string type="CropBox"; int pos= search_forwards ("CropBox: [", buf); if (pos < 0) { type="MediaBox"; pos= search_forwards ("MediaBox: [", buf); if (pos < 0) { if (DEBUG_CONVERT) debug_convert << "CropBox|MediaBox not found"<<LF; return false; } } bool ok= read (buf, pos, type*": ["); double X1, Y1, X2, Y2; int x1, y1, x2, y2; skip_spaces (buf, pos); ok= read_double (buf, pos, X1) && ok; x1= (int) floor (X1); skip_spaces (buf, pos); ok= read_double (buf, pos, Y1) && ok; y1= (int) floor (Y1); skip_spaces (buf, pos); ok= read_double (buf, pos, X2) && ok; x2= (int) ceil (X2); skip_spaces (buf, pos); ok= read_double (buf, pos, Y2) && ok; y2= (int) ceil (Y2); if (!ok) { if (DEBUG_CONVERT) debug_convert << "box dims not found"<<LF; return false; } w_pt= x2-x1; h_pt= y2-y1; pos= search_forwards ("Rotate =", buf); ok= read (buf, pos, "Rotate ="); int rot; if (ok) { skip_spaces (buf, pos); ok = read_int (buf, pos, rot) ; if (ok) { rot = rot%360; if (rot < 0) rot +=360; if ((rot % 180) == 90 ) {//the image is rotated : swap axes lengths if (DEBUG_CONVERT) debug_convert << "Rotate ="<<rot<<LF; h_pt= x2-x1; w_pt= y2-y1; } } else { if (DEBUG_CONVERT) debug_convert << "Rotate not found"<<LF; return false; } } if (DEBUG_CONVERT) debug_convert << type<< " size ="<<w_pt<<" x "<< h_pt <<LF; return true; }