80 fun parse_files cmd = |
80 fun parse_files cmd = |
81 Scan.ahead Parse.not_eof -- Parse.path >> (fn (tok, name) => fn thy => |
81 Scan.ahead Parse.not_eof -- Parse.path >> (fn (tok, name) => fn thy => |
82 (case Token.get_files tok of |
82 (case Token.get_files tok of |
83 [] => |
83 [] => |
84 let |
84 let |
85 val keywords = Keyword.get_keywords (); |
85 val keywords = Thy_Header.get_keywords thy; |
86 val master_dir = master_directory thy; |
86 val master_dir = master_directory thy; |
87 val pos = Token.pos_of tok; |
87 val pos = Token.pos_of tok; |
88 val src_paths = Keyword.command_files keywords cmd (Path.explode name); |
88 val src_paths = Keyword.command_files keywords cmd (Path.explode name); |
89 in map (Command.read_file master_dir pos) src_paths end |
89 in map (Command.read_file master_dir pos) src_paths end |
90 | files => map Exn.release files)); |
90 | files => map Exn.release files)); |
120 (* load theory *) |
120 (* load theory *) |
121 |
121 |
122 fun begin_theory master_dir {name, imports, keywords} parents = |
122 fun begin_theory master_dir {name, imports, keywords} parents = |
123 Theory.begin_theory name parents |
123 Theory.begin_theory name parents |
124 |> put_deps master_dir imports |
124 |> put_deps master_dir imports |
125 |> fold Thy_Header.declare_keyword keywords; |
125 |> Thy_Header.add_keywords keywords; |
126 |
126 |
127 fun excursion keywords master_dir last_timing init elements = |
127 fun excursion keywords master_dir last_timing init elements = |
128 let |
128 let |
129 fun prepare_span span = |
129 fun prepare_span st span = |
130 Command_Span.content span |
130 Command_Span.content span |
131 |> Command.read keywords master_dir init [] |
131 |> Command.read (Command.read_thy st) master_dir init [] |
132 |> (fn tr => Toplevel.put_timing (last_timing tr) tr); |
132 |> (fn tr => Toplevel.put_timing (last_timing tr) tr); |
133 |
133 |
134 fun element_result span_elem (st, _) = |
134 fun element_result span_elem (st, _) = |
135 let |
135 let |
136 val elem = Thy_Syntax.map_element prepare_span span_elem; |
136 val elem = Thy_Syntax.map_element (prepare_span st) span_elem; |
137 val (results, st') = Toplevel.element_result keywords elem st; |
137 val (results, st') = Toplevel.element_result keywords elem st; |
138 val pos' = Toplevel.pos_of (Thy_Syntax.last_element elem); |
138 val pos' = Toplevel.pos_of (Thy_Syntax.last_element elem); |
139 in (results, (st', pos')) end; |
139 in (results, (st', pos')) end; |
140 |
140 |
141 val (results, (end_state, end_pos)) = |
141 val (results, (end_state, end_pos)) = |
145 in (results, thy) end; |
145 in (results, thy) end; |
146 |
146 |
147 fun load_thy document last_timing update_time master_dir header text_pos text parents = |
147 fun load_thy document last_timing update_time master_dir header text_pos text parents = |
148 let |
148 let |
149 val (name, _) = #name header; |
149 val (name, _) = #name header; |
150 val _ = Thy_Header.define_keywords (#keywords header); |
150 val keywords = |
151 val keywords = Keyword.get_keywords (); |
151 fold (curry Keyword.merge_keywords o Thy_Header.get_keywords) parents |
|
152 (Keyword.add_keywords (#keywords header) Keyword.empty_keywords); |
152 |
153 |
153 val toks = Outer_Syntax.scan keywords text_pos text; |
154 val toks = Outer_Syntax.scan keywords text_pos text; |
154 val spans = Outer_Syntax.parse_spans toks; |
155 val spans = Outer_Syntax.parse_spans toks; |
155 val elements = Thy_Syntax.parse_elements keywords spans; |
156 val elements = Thy_Syntax.parse_elements keywords spans; |
156 |
157 |
164 (fn () => excursion keywords master_dir last_timing init elements); |
165 (fn () => excursion keywords master_dir last_timing init elements); |
165 |
166 |
166 fun present () = |
167 fun present () = |
167 let |
168 let |
168 val res = filter_out (Toplevel.is_ignored o #1) (maps Toplevel.join_results results); |
169 val res = filter_out (Toplevel.is_ignored o #1) (maps Toplevel.join_results results); |
169 val (keywords, syntax) = Outer_Syntax.get_syntax (); |
|
170 in |
170 in |
171 if exists (Toplevel.is_skipped_proof o #2) res then |
171 if exists (Toplevel.is_skipped_proof o #2) res then |
172 warning ("Cannot present theory with skipped proofs: " ^ quote name) |
172 warning ("Cannot present theory with skipped proofs: " ^ quote name) |
173 else |
173 else |
174 let val tex_source = |
174 let val tex_source = Thy_Output.present_thy thy res toks |> Buffer.content; |
175 Thy_Output.present_thy keywords (Outer_Syntax.is_markup syntax) res toks |
|
176 |> Buffer.content; |
|
177 in if document then Present.theory_output name tex_source else () end |
175 in if document then Present.theory_output name tex_source else () end |
178 end; |
176 end; |
179 |
177 |
180 in (thy, present, size text) end; |
178 in (thy, present, size text) end; |
181 |
179 |