@@ -32,16 +32,41 @@ use crate::html::highlight;
32
32
use crate :: html:: layout:: Page ;
33
33
use crate :: html:: markdown:: { HeadingOffset , MarkdownSummaryLine } ;
34
34
35
+ use serde:: Serialize ;
36
+
35
37
const ITEM_TABLE_OPEN : & ' static str = "<div class=\" item-table\" >" ;
36
38
const ITEM_TABLE_CLOSE : & ' static str = "</div>" ;
37
39
const ITEM_TABLE_ROW_OPEN : & ' static str = "<div class=\" item-row\" >" ;
38
40
const ITEM_TABLE_ROW_CLOSE : & ' static str = "</div>" ;
39
41
40
- pub ( super ) fn print_item ( cx : & Context < ' _ > , item : & clean:: Item , buf : & mut Buffer , page : & Page < ' _ > ) {
42
+ // A component in a `use` path, like `string` in std::string::ToString
43
+ #[ derive( Serialize ) ]
44
+ struct PathComponent < ' a > {
45
+ path : String ,
46
+ name : & ' a str ,
47
+ }
48
+
49
+ #[ derive( Serialize ) ]
50
+ struct ItemVars < ' a > {
51
+ page : & ' a Page < ' a > ,
52
+ static_root_path : & ' a str ,
53
+ typ : & ' a str ,
54
+ name : & ' a str ,
55
+ item_type : & ' a str ,
56
+ path_components : Vec < PathComponent < ' a > > ,
57
+ stability_since_raw : & ' a str ,
58
+ src_href : Option < & ' a str > ,
59
+ }
60
+
61
+ pub ( super ) fn print_item (
62
+ cx : & Context < ' _ > ,
63
+ templates : & tera:: Tera ,
64
+ item : & clean:: Item ,
65
+ buf : & mut Buffer ,
66
+ page : & Page < ' _ > ,
67
+ ) {
41
68
debug_assert ! ( !item. is_stripped( ) ) ;
42
- // Write the breadcrumb trail header for the top
43
- buf. write_str ( "<h1 class=\" fqn\" ><span class=\" in-band\" >" ) ;
44
- let name = match * item. kind {
69
+ let typ = match * item. kind {
45
70
clean:: ModuleItem ( _) => {
46
71
if item. is_crate ( ) {
47
72
"Crate "
@@ -73,60 +98,54 @@ pub(super) fn print_item(cx: &Context<'_>, item: &clean::Item, buf: &mut Buffer,
73
98
unreachable ! ( ) ;
74
99
}
75
100
} ;
76
- buf. write_str ( name) ;
77
- if !item. is_primitive ( ) && !item. is_keyword ( ) {
78
- let cur = & cx. current ;
79
- let amt = if item. is_mod ( ) { cur. len ( ) - 1 } else { cur. len ( ) } ;
80
- for ( i, component) in cur. iter ( ) . enumerate ( ) . take ( amt) {
81
- write ! (
82
- buf,
83
- "<a href=\" {}index.html\" >{}</a>::<wbr>" ,
84
- "../" . repeat( cur. len( ) - i - 1 ) ,
85
- component
86
- ) ;
87
- }
88
- }
89
- write ! ( buf, "<a class=\" {}\" href=\" #\" >{}</a>" , item. type_( ) , item. name. as_ref( ) . unwrap( ) ) ;
90
- write ! (
91
- buf,
92
- "<button id=\" copy-path\" onclick=\" copy_path(this)\" title=\" Copy item path to clipboard\" >\
93
- <img src=\" {static_root_path}clipboard{suffix}.svg\" \
94
- width=\" 19\" height=\" 18\" \
95
- alt=\" Copy item path\" >\
96
- </button>",
97
- static_root_path = page. get_static_root_path( ) ,
98
- suffix = page. resource_suffix,
99
- ) ;
100
-
101
- buf. write_str ( "</span>" ) ; // in-band
102
- buf. write_str ( "<span class=\" out-of-band\" >" ) ;
101
+ let mut stability_since_raw = Buffer :: new ( ) ;
103
102
render_stability_since_raw (
104
- buf ,
103
+ & mut stability_since_raw ,
105
104
item. stable_since ( cx. tcx ( ) ) . as_deref ( ) ,
106
105
item. const_stability ( cx. tcx ( ) ) ,
107
106
None ,
108
107
None ,
109
108
) ;
110
- buf. write_str (
111
- "<span id=\" render-detail\" >\
112
- <a id=\" toggle-all-docs\" href=\" javascript:void(0)\" \
113
- title=\" collapse all docs\" >\
114
- [<span class=\" inner\" >−</span>]\
115
- </a>\
116
- </span>",
117
- ) ;
109
+ let stability_since_raw: String = stability_since_raw. into_inner ( ) ;
118
110
119
111
// Write `src` tag
120
112
//
121
113
// When this item is part of a `crate use` in a downstream crate, the
122
114
// [src] link in the downstream documentation will actually come back to
123
115
// this page, and this link will be auto-clicked. The `id` attribute is
124
116
// used to find the link to auto-click.
125
- if cx. include_sources && !item. is_primitive ( ) {
126
- write_srclink ( cx, item, buf) ;
127
- }
117
+ let src_href =
118
+ if cx. include_sources && !item. is_primitive ( ) { cx. src_href ( item) } else { None } ;
119
+
120
+ let path_components = if item. is_primitive ( ) || item. is_keyword ( ) {
121
+ vec ! [ ]
122
+ } else {
123
+ let cur = & cx. current ;
124
+ let amt = if item. is_mod ( ) { cur. len ( ) - 1 } else { cur. len ( ) } ;
125
+ cur. iter ( )
126
+ . enumerate ( )
127
+ . take ( amt)
128
+ . map ( |( i, component) | PathComponent {
129
+ path : "../" . repeat ( cur. len ( ) - i - 1 ) ,
130
+ name : component,
131
+ } )
132
+ . collect ( )
133
+ } ;
134
+
135
+ let item_vars = ItemVars {
136
+ page : page,
137
+ static_root_path : page. get_static_root_path ( ) ,
138
+ typ : typ,
139
+ name : & item. name . as_ref ( ) . unwrap ( ) . as_str ( ) ,
140
+ item_type : & item. type_ ( ) . to_string ( ) ,
141
+ path_components : path_components,
142
+ stability_since_raw : & stability_since_raw,
143
+ src_href : src_href. as_deref ( ) ,
144
+ } ;
128
145
129
- buf. write_str ( "</span></h1>" ) ; // out-of-band
146
+ let teractx = tera:: Context :: from_serialize ( item_vars) . unwrap ( ) ;
147
+ let heading = templates. render ( "print_item.html" , & teractx) . unwrap ( ) ;
148
+ buf. write_str ( & heading) ;
130
149
131
150
match * item. kind {
132
151
clean:: ModuleItem ( ref m) => item_module ( buf, cx, item, & m. items ) ,
0 commit comments