1
1
export writeinstr;
2
2
export writer;
3
+ export writer_factory;
3
4
export writer_util;
4
- export make_writer ;
5
- export future_writer ;
5
+ export make_writer_factory ;
6
+ export future_writer_factory ;
6
7
7
8
enum writeinstr {
8
9
write( str ) ,
9
10
done
10
11
}
11
12
12
13
type writer = fn ~( +writeinstr ) ;
14
+ type writer_factory = fn ~( page : doc:: page ) -> writer ;
13
15
14
16
impl writer_util for writer {
15
17
fn write_str ( str : str ) {
@@ -25,28 +27,46 @@ impl writer_util for writer {
25
27
}
26
28
}
27
29
28
- fn make_writer ( config : config:: config ) -> writer {
30
+ fn make_writer_factory ( config : config:: config ) -> writer_factory {
29
31
alt config. output_format {
30
32
config:: markdown {
31
- markdown_writer ( config)
33
+ markdown_writer_factory ( config)
32
34
}
33
35
config:: pandoc_html {
34
- pandoc_writer ( config)
36
+ pandoc_writer_factory ( config)
35
37
}
36
38
}
37
39
}
38
40
39
- fn markdown_writer ( config : config:: config ) -> writer {
40
- let filename = make_filename ( config, "md" ) ;
41
+ fn markdown_writer_factory ( config : config:: config ) -> writer_factory {
42
+ fn ~( page: doc:: page) -> writer {
43
+ markdown_writer( config , page )
44
+ }
45
+ }
46
+
47
+ fn pandoc_writer_factory ( config : config:: config ) -> writer_factory {
48
+ fn ~( page: doc:: page) -> writer {
49
+ pandoc_writer( config , page )
50
+ }
51
+ }
52
+
53
+ fn markdown_writer (
54
+ config : config:: config ,
55
+ page : doc:: page
56
+ ) -> writer {
57
+ let filename = make_filename ( config, "md" , page) ;
41
58
generic_writer { |markdown|
42
59
write_file ( filename, markdown) ;
43
60
}
44
61
}
45
62
46
- fn pandoc_writer ( config : config:: config ) -> writer {
63
+ fn pandoc_writer (
64
+ config : config:: config ,
65
+ page : doc:: page
66
+ ) -> writer {
47
67
assert option:: is_some ( config. pandoc_cmd ) ;
48
68
let pandoc_cmd = option:: get ( config. pandoc_cmd ) ;
49
- let filename = make_filename ( config, "html" ) ;
69
+ let filename = make_filename ( config, "html" , page ) ;
50
70
51
71
let pandoc_args = [
52
72
"--standalone" ,
@@ -109,7 +129,11 @@ fn generic_writer(process: fn~(markdown: str)) -> writer {
109
129
}
110
130
}
111
131
112
- fn make_filename ( config : config:: config , ext : str ) -> str {
132
+ fn make_filename (
133
+ config : config:: config ,
134
+ ext : str ,
135
+ _page : doc:: page
136
+ ) -> str {
113
137
import std:: fs;
114
138
let cratefile = fs:: basename ( config. input_crate ) ;
115
139
let cratename = tuple:: first ( fs:: splitext ( cratefile) ) ;
@@ -134,7 +158,37 @@ fn should_use_markdown_file_name_based_off_crate() {
134
158
output_dir: "output/dir"
135
159
with config:: default_config ( "input/test.rc" )
136
160
} ;
137
- assert make_filename ( config, "md" ) == "output/dir/test.md" ;
161
+ let doc = test:: mk_doc ( "" ) ;
162
+ let page = doc:: cratepage ( doc. cratedoc ( ) ) ;
163
+ assert make_filename ( config, "md" , page) == "output/dir/test.md" ;
164
+ }
165
+
166
+ #[ cfg( test) ]
167
+ mod test {
168
+ fn mk_doc ( source : str ) -> doc:: doc {
169
+ astsrv:: from_str ( source) { |srv|
170
+ extract:: from_srv ( srv, "" )
171
+ }
172
+ }
173
+ }
174
+
175
+ fn future_writer_factory (
176
+ ) -> ( writer_factory , comm:: port < ( doc:: page , str ) > ) {
177
+ let markdown_po = comm:: port ( ) ;
178
+ let markdown_ch = comm:: chan ( markdown_po) ;
179
+ let writer_factory = fn ~( page: doc:: page) -> writer {
180
+ let writer_po = comm:: port ( ) ;
181
+ let writer_ch = comm:: chan ( writer_po) ;
182
+ task:: spawn { ||
183
+ let ( writer, future) = future_writer ( ) ;
184
+ comm:: send ( writer_ch, writer) ;
185
+ let s = future:: get ( future) ;
186
+ comm:: send ( markdown_ch, ( page, s) ) ;
187
+ }
188
+ comm:: recv ( writer_po)
189
+ } ;
190
+
191
+ ( writer_factory, markdown_po)
138
192
}
139
193
140
194
fn future_writer ( ) -> ( writer , future:: future < str > ) {
0 commit comments