1 2 /****************************************************************************** 3 * MODULE : env.hpp 4 * DESCRIPTION: edit environment for typesetting 5 * COPYRIGHT : (C) 1999 Joris van der Hoeven 6 ******************************************************************************* 7 * This software falls under the GNU general public license version 3 or later. 8 * It comes WITHOUT ANY WARRANTY WHATSOEVER. For details, see the file LICENSE 9 * in the root directory or <http://www.gnu.org/licenses/gpl-3.0.html>. 10 ******************************************************************************/ 11 12 #ifndef ENV_H 13 #define ENV_H 14 #include "vars.hpp" 15 #include "drd_info.hpp" 16 #include "gui.hpp" 17 #include "font.hpp" 18 #include "language.hpp" 19 #include "path.hpp" 20 #include "hashmap.hpp" 21 #include "boxes.hpp" 22 #include "url.hpp" 23 #include "frame.hpp" 24 #include "link.hpp" 25 26 #define DECORATION (-1) 27 28 /****************************************************************************** 29 * The different types of system environment variables 30 ******************************************************************************/ 31 32 #define Env_User 0 33 #define Env_Fixed 1 34 #define Env_Zoom 2 35 #define Env_Magnification 3 36 #define Env_Magnify 4 37 #define Env_Language 5 38 #define Env_Mode 6 39 #define Env_Info_Level 7 40 #define Env_Font 8 41 #define Env_Font_Size 9 42 #define Env_Index_Level 10 43 #define Env_Display_Style 11 44 #define Env_Math_Condensed 12 45 #define Env_Vertical_Pos 13 46 #define Env_Color 14 47 #define Env_Pattern_Mode 15 48 #define Env_Paragraph 16 49 #define Env_Page 17 50 #define Env_Page_Extents 18 51 #define Env_Preamble 19 52 #define Env_Geometry 20 53 #define Env_Frame 21 54 #define Env_Line_Width 22 55 #define Env_Grid 23 56 #define Env_Grid_Aspect 24 57 #define Env_Src_Style 25 58 #define Env_Src_Special 26 59 #define Env_Src_Compact 27 60 #define Env_Src_Close 28 61 #define Env_Point_Style 29 62 #define Env_Dash_Style 30 63 #define Env_Dash_Style_Unit 31 64 #define Env_Fill_Color 32 65 #define Env_Line_Arrows 33 66 #define Env_Text_At_Halign 34 67 #define Env_Text_At_Valign 35 68 69 /****************************************************************************** 70 * For style file editing 71 ******************************************************************************/ 72 73 #define STYLE_ANGULAR 0 74 #define STYLE_SCHEME 1 75 #define STYLE_LATEX 2 76 #define STYLE_FUNCTIONAL 3 77 78 #define SPECIAL_RAW 0 79 #define SPECIAL_FORMAT 1 80 #define SPECIAL_NORMAL 2 81 #define SPECIAL_MAXIMAL 3 82 83 #define COMPACT_ALL 0 84 #define COMPACT_INLINE_ARGS 1 85 #define COMPACT_INLINE_START 2 86 #define COMPACT_INLINE 3 87 #define COMPACT_NONE 4 88 89 #define CLOSE_MINIMAL 0 90 #define CLOSE_COMPACT 1 91 #define CLOSE_LONG 2 92 #define CLOSE_REPEAT 3 93 94 #define INACTIVE_INLINE_RECURSE 0 95 #define INACTIVE_INLINE_ONCE 1 96 #define INACTIVE_INLINE_ERROR 2 97 #define INACTIVE_BLOCK_RECURSE 3 98 #define INACTIVE_BLOCK_ONCE 4 99 #define INACTIVE_BLOCK_ERROR 5 100 101 /****************************************************************************** 102 * Other enumerated values 103 ******************************************************************************/ 104 105 #define INFO_NONE 0 106 #define INFO_MINIMAL 1 107 #define INFO_SHORT 2 108 #define INFO_DETAILED 3 109 #define INFO_PAPER 4 110 #define INFO_SHORT_PAPER 5 111 112 /****************************************************************************** 113 * The edit environment 114 ******************************************************************************/ 115 116 class edit_env; 117 class ornament_parameters; 118 class edit_env_rep: public concrete_struct { 119 public: 120 drd_info& drd; 121 private: 122 hashmap<string,tree> env; 123 hashmap<string,tree> back; 124 public: 125 hashmap<string,path> src; 126 list<hashmap<string,tree> > macro_arg; 127 list<hashmap<string,path> > macro_src; 128 array<box> decorated_boxes; 129 130 hashmap<string,int>& var_type; 131 url base_file_name; 132 url cur_file_name; 133 bool secure; 134 hashmap<string,tree>& local_ref; 135 hashmap<string,tree>& global_ref; 136 hashmap<string,tree>& local_aux; 137 hashmap<string,tree>& global_aux; 138 hashmap<string,tree>& local_att; 139 hashmap<string,tree>& global_att; 140 bool complete; // typeset complete document ? 141 bool read_only; // write-protected ? 142 hashmap<string,tree> missing; // missing refs 143 array<tree> redefined; // redefined labels 144 link_repository link_env; 145 146 int dpi; 147 double inch; 148 double zoomf; 149 SI pixel; 150 double magn; 151 double mgfy; 152 double flexibility; 153 int first_page; 154 int mode; 155 int mode_op; 156 language lan; 157 int hl_lan; 158 font fn; 159 int fn_size; 160 int index_level; 161 bool display_style; 162 bool math_condensed; 163 int vert_pos; 164 int alpha; 165 pencil pen; 166 bool no_patterns; 167 string point_style; 168 bool preamble; 169 int info_level; 170 SI gw; 171 SI gh; 172 string gvalign; 173 frame fr; 174 point clip_lim1; 175 point clip_lim2; 176 int src_style; 177 int src_special; 178 int src_compact; 179 int src_close; 180 array<bool> dash_style; 181 SI dash_style_unit; 182 brush fill_brush; 183 array<tree> line_arrows; 184 string text_at_halign; 185 string text_at_valign; 186 187 int inactive_mode; 188 tree recover_env; 189 190 string page_type; 191 bool page_landscape; 192 bool page_automatic; 193 int page_margin_mode; 194 SI page_width; 195 SI page_height; 196 SI page_user_width; 197 SI page_user_height; 198 SI page_odd_margin; 199 SI page_even_margin; 200 SI page_right_margin; 201 SI page_top_margin; 202 SI page_bottom_margin; 203 204 private: 205 tree exec_formatting (tree t, string v); 206 void exec_until_formatting (tree t, path p, string v); 207 bool exec_until_formatting (tree t, path p, string var, int l, string v); 208 tree exec_table (tree t); 209 void exec_until_table (tree t, path p); 210 bool exec_until_table (tree t, path p, string var, int level); 211 tree exec_assign (tree t); 212 tree exec_with (tree t); 213 void exec_until_with (tree t, path p); 214 bool exec_until_with (tree t, path p, string var, int level); 215 tree exec_drd_props (tree t); 216 tree exec_compound (tree t); 217 void exec_until_compound (tree t, path p); 218 bool exec_until_compound (tree t, path p, string var, int level); 219 tree exec_provides (tree t); 220 tree exec_value (tree t); 221 tree exec_quote_value (tree t); 222 tree exec_arg (tree t); 223 bool exec_until_arg (tree t, path p, string var, int level); 224 tree exec_quote_arg (tree t); 225 tree exec_get_label (tree t); 226 tree exec_get_arity (tree t); 227 tree exec_eval_args (tree t); 228 bool exec_until_mark (tree t, path p, string var, int level); 229 bool exec_until_quasi (tree t, path p, string var, int level); 230 tree exec_quasiquoted (tree t); 231 tree exec_copy (tree t); 232 tree exec_if (tree t); 233 bool exec_until_if (tree t, path p, string var, int level); 234 tree exec_case (tree t); 235 bool exec_until_case (tree t, path p, string var, int level); 236 tree exec_while (tree t); 237 bool exec_until_while (tree t, path p, string var, int level); 238 tree exec_for_each (tree t); 239 tree exec_use_package (tree t); 240 tree exec_use_module (tree t); 241 242 tree exec_or (tree t); 243 tree exec_xor (tree t); 244 tree exec_and (tree t); 245 tree exec_not (tree t); 246 tree exec_plus_minus (tree t); 247 tree exec_min_max (tree t); 248 tree exec_times_over (tree t); 249 tree exec_divide (tree t); 250 tree exec_modulo (tree t); 251 tree exec_math_sqrt (tree t); 252 tree exec_exp (tree t); 253 tree exec_log (tree t); 254 tree exec_pow (tree t); 255 tree exec_cos (tree t); 256 tree exec_sin (tree t); 257 tree exec_tan (tree t); 258 tree exec_merge (tree t); 259 tree exec_length (tree t); 260 tree exec_range (tree t); 261 tree exec_number (tree t); 262 tree exec_date (tree t); 263 tree exec_translate (tree t); 264 tree exec_change_case (tree t, tree nc, bool exec_flag, bool first); 265 tree exec_change_case (tree t); 266 tree exec_find_file (tree t); 267 tree exec_find_file_upwards (tree t); 268 tree exec_is_tuple (tree t); 269 tree exec_lookup (tree t); 270 tree exec_equal (tree t); 271 tree exec_unequal (tree t); 272 tree exec_less (tree t); 273 tree exec_lesseq (tree t); 274 tree exec_greater (tree t); 275 tree exec_greatereq (tree t); 276 tree exec_blend (tree t); 277 278 tree exec_cm_length (); 279 tree exec_mm_length (); 280 tree exec_in_length (); 281 tree exec_pt_length (); 282 tree exec_bp_length (); 283 tree exec_dd_length (); 284 tree exec_pc_length (); 285 tree exec_cc_length (); 286 tree exec_fs_length (); 287 tree exec_fbs_length (); 288 tree exec_em_length (); 289 tree exec_ln_length (); 290 tree exec_sep_length (); 291 tree exec_yfrac_length (); 292 tree exec_ex_length (); 293 tree exec_fn_length (); 294 tree exec_fns_length (); 295 tree exec_bls_length (); 296 tree exec_fnbot_length (); 297 tree exec_fntop_length (); 298 tree exec_spc_length (); 299 tree exec_xspc_length (); 300 tree exec_par_length (); 301 tree exec_pag_length (); 302 tree exec_tmpt_length (); 303 tree exec_px_length (); 304 tree exec_gw_length (); 305 tree exec_gh_length (); 306 tree exec_gu_length (); 307 tree exec_msec_length (); 308 tree exec_sec_length (); 309 tree exec_min_length (); 310 tree exec_hr_length (); 311 312 tree exec_hard_id (tree t); 313 tree exec_script (tree t); 314 tree exec_find_accessible (tree t); 315 tree exec_set_binding (tree t); 316 tree exec_get_binding (tree t); 317 tree exec_get_attachment (tree t); 318 319 tree exec_pattern (tree t); 320 321 tree exec_point (tree t); 322 323 tree exec_eff_move (tree t); 324 tree exec_eff_bubble (tree t); 325 tree exec_eff_gaussian (tree t); 326 tree exec_eff_oval (tree t); 327 tree exec_eff_rectangular (tree t); 328 tree exec_eff_motion (tree t); 329 330 tree exec_box_info (tree t); 331 tree exec_frame_direct (tree t); 332 tree exec_frame_inverse (tree t); 333 334 tree exec_rewrite (tree t); 335 bool exec_until_rewrite (tree t, path p, string var, int level); 336 tree rewrite_inactive_arg (tree t, tree var, int i, bool bl, bool fl); 337 tree rewrite_inactive_raw_data (tree t, tree var, bool block, bool flush); 338 tree rewrite_inactive_document (tree t, tree var, bool block, bool flush); 339 tree rewrite_inactive_concat (tree t, tree var, bool block, bool flush); 340 tree rewrite_inactive_value (tree t, tree var, bool block, bool flush); 341 tree rewrite_inactive_arg (tree t, tree var, bool block, bool flush); 342 tree rewrite_inactive_style_with (tree t, tree var, bool b, bool f, bool o); 343 tree rewrite_inactive_active (tree t, tree var, bool block, bool flush); 344 tree rewrite_inactive_var_active (tree t, tree var, bool block, bool flush); 345 tree rewrite_inactive_symbol (tree t, tree var, bool block, bool flush); 346 tree rewrite_inactive_hybrid (tree t, tree var, bool block, bool flush); 347 tree rewrite_inactive_default (tree t, tree var, bool block, bool flush); 348 tree rewrite_inactive (tree t, tree var, bool block, bool flush); 349 tree rewrite_inactive (tree t, tree var); 350 351 public: 352 edit_env_rep (drd_info& drd, 353 url base_file_name, 354 hashmap<string,tree>& local_ref, 355 hashmap<string,tree>& global_ref, 356 hashmap<string,tree>& local_aux, 357 hashmap<string,tree>& global_aux, 358 hashmap<string,tree>& local_att, 359 hashmap<string,tree>& global_att); 360 void style_init_env (); 361 362 /* execution of trees and setting environment variables */ 363 tree exec (tree t); 364 void exec_until (tree t, path p); 365 bool exec_until (tree t, path p, string var, int level); 366 string exec_string (tree t); /* should be inline */ 367 tree expand (tree t, bool search_accessible= false); 368 bool depends (tree t, string s, int level); 369 tree rewrite (tree t); 370 monitored_write(string s,tree t)371 inline void monitored_write (string s, tree t) { 372 back->write_back (s, env); env (s)= t; } monitored_write_update(string s,tree t)373 inline void monitored_write_update (string s, tree t) { 374 back->write_back (s, env); env (s)= t; update (s); } write(string s,tree t)375 inline void write (string s, tree t) { env (s)= t; } write_update(string s,tree t)376 inline void write_update (string s, tree t) { env (s)= t; update (s); } local_begin(string s,tree t)377 inline tree local_begin (string s, tree t) { 378 // tree r (env [s]); monitored_write_update (s, t); return r; 379 tree& val= env (s); tree r (val); val= t; update (s); return r; } local_end(string s,tree t)380 inline void local_end (string s, tree t) { 381 env (s)= t; update (s); } local_begin_script()382 inline tree local_begin_script () { 383 return local_begin (MATH_LEVEL, as_string (index_level+1)); } local_end_script(tree t)384 inline void local_end_script (tree t) { 385 local_end (MATH_LEVEL, t); } assign(string s,tree t)386 inline void assign (string s, tree t) { 387 tree& val= env (s); t= exec(t); if (val != t) { 388 back->write_back (s, env); val= t; update (s); } } provides(string s)389 inline bool provides (string s) { return env->contains (s); } read(string s)390 inline tree read (string s) { return env [s]; } 391 tree local_begin_extents (box b); 392 void local_end_extents (tree t); 393 394 void write_default_env (); 395 void write_env (hashmap<string,tree> user_env); 396 void monitored_patch_env (hashmap<string,tree> patch); 397 void patch_env (hashmap<string,tree> patch); 398 void read_env (hashmap<string,tree>& ret); 399 void local_start (hashmap<string,tree>& prev_back); 400 void local_update (hashmap<string,tree>& oldpat, hashmap<string,tree>& chg); 401 void local_end (hashmap<string,tree>& prev_back); 402 403 /* updating environment variables */ 404 ornament_parameters get_ornament_parameters (); 405 void update_page_pars (); 406 void get_page_pars (SI& w, SI& h, SI& ww, SI& hh, 407 SI& odd, SI& even, SI& top, SI& bottom); 408 tree decode_arrow (tree t, string l, string h); 409 void update_font (); 410 void update_color (); 411 void update_pattern_mode (); 412 void update_mode (); 413 void update_info_level (); 414 void update_language (); 415 void update_geometry (); 416 void update_frame (); 417 void update_src_style (); 418 void update_src_special (); 419 void update_src_compact (); 420 void update_src_close (); 421 void update_dash_style (); 422 void update_line_arrows (); 423 void update (); 424 void update (string env_var); 425 426 /* lengths */ 427 bool is_length (string s); 428 bool is_anylen (tree t); 429 tree tmlen_plus (tree t1, tree t2); 430 tree tmlen_min (tree t1, tree t2); 431 tree tmlen_max (tree t1, tree t2); 432 tree tmlen_times (double sc, tree t); 433 tree tmlen_over (tree t1, tree t2); 434 double tmlen_div (tree t1, tree t2); 435 tree tmlen_mod (tree t1, tree t2); 436 437 void get_length_unit (string l, SI& un, string& un_str); 438 string add_lengths (string l1, string l2); 439 string multiply_length (double x, string l); 440 double divide_lengths (string l1, string l2); 441 442 tree as_tmlen (tree t); 443 SI as_length (tree t); 444 SI as_length (tree t, string perc); 445 space as_hspace (tree t); 446 space as_vspace (tree t); 447 point as_point (tree t); 448 449 /* retrieving environment variables */ get_bool(string var)450 inline bool get_bool (string var) { 451 tree t= env [var]; 452 if (is_compound (t)) return false; 453 return as_bool (t->label); } get_int(string var)454 inline int get_int (string var) { 455 tree t= env [var]; 456 if (is_compound (t)) return 0; 457 return as_int (t->label); } get_double(string var)458 inline double get_double (string var) { 459 tree t= env [var]; 460 if (is_compound (t)) return 0.0; 461 return as_double (t->label); } get_string(string var)462 inline string get_string (string var) { 463 tree t= env [var]; 464 if (is_compound (t)) return ""; 465 return t->label; } get_length(string var)466 inline SI get_length (string var) { 467 tree t= env [var]; 468 return as_length (t); } get_vspace(string var)469 inline space get_vspace (string var) { 470 tree t= env [var]; 471 return as_vspace (t); } get_color(string var)472 inline color get_color (string var) { 473 tree t= env [var]; 474 return named_color (as_string (t), alpha); } 475 476 friend class edit_env; 477 friend tm_ostream& operator << (tm_ostream& out, edit_env env); 478 }; 479 480 class edit_env { 481 CONCRETE_NULL(edit_env); edit_env(edit_env_rep * rep2)482 inline edit_env (edit_env_rep* rep2): 483 rep(rep2) { INC_COUNT_NULL (this->rep); } 484 edit_env (drd_info& drd, 485 url base_file_name, 486 hashmap<string,tree>& local_ref, 487 hashmap<string,tree>& global_ref, 488 hashmap<string,tree>& local_aux, 489 hashmap<string,tree>& global_aux, 490 hashmap<string,tree>& local_att, 491 hashmap<string,tree>& global_att); 492 }; 493 CONCRETE_NULL_CODE(edit_env); 494 495 tm_ostream& operator << (tm_ostream& out, edit_env env); 496 tree texmacs_exec (edit_env env, tree cmd); 497 void extract_format (tree fm, tree* r, int n); 498 tree load_inclusion (url u); // implemented in tm_file.cpp 499 tree tree_extents (tree t); 500 bool is_percentage (tree t, string s); 501 bool is_percentage (tree t); 502 double as_percentage (tree t); 503 bool is_magnification (string s); 504 double get_magnification (string s); 505 int decode_alpha (string s); 506 507 void set_graphical_value (tree var, tree val); 508 bool has_graphical_value (tree var); 509 tree get_graphical_value (tree var); 510 bool graphics_needs_update (); 511 void graphics_require_update (tree var); 512 void graphics_notify_update (tree var); 513 514 #endif // defined ENV_H 515