@@ -74,8 +74,32 @@ pub fn convert_to_jats(
7474 format : MarkupFormat ,
7575 conversion_limit : ConversionLimit ,
7676) -> ThothResult < String > {
77+ if format == MarkupFormat :: JatsXml {
78+ let content_looks_like_jats = content. contains ( '<' ) && content. contains ( "</" ) ;
79+ let ast = if content_looks_like_jats {
80+ jats_to_ast ( & content)
81+ } else {
82+ plain_text_to_ast ( & content)
83+ } ;
84+
85+ let processed_ast = if conversion_limit == ConversionLimit :: Title {
86+ strip_structural_elements_from_ast_for_conversion ( & ast)
87+ } else {
88+ ast
89+ } ;
90+
91+ validate_ast_content ( & processed_ast, conversion_limit) ?;
92+
93+ return Ok (
94+ if content_looks_like_jats || conversion_limit == ConversionLimit :: Title {
95+ ast_to_jats ( & processed_ast)
96+ } else {
97+ plain_text_ast_to_jats ( & processed_ast)
98+ } ,
99+ ) ;
100+ }
101+
77102 validate_format ( & content, & format) ?;
78- let mut output = content. clone ( ) ;
79103
80104 match format {
81105 MarkupFormat :: Html => {
@@ -90,7 +114,7 @@ pub fn convert_to_jats(
90114 } ;
91115
92116 validate_ast_content ( & processed_ast, conversion_limit) ?;
93- output = ast_to_jats ( & processed_ast) ;
117+ Ok ( ast_to_jats ( & processed_ast) )
94118 }
95119
96120 MarkupFormat :: Markdown => {
@@ -105,7 +129,7 @@ pub fn convert_to_jats(
105129 } ;
106130
107131 validate_ast_content ( & processed_ast, conversion_limit) ?;
108- output = ast_to_jats ( & processed_ast) ;
132+ Ok ( ast_to_jats ( & processed_ast) )
109133 }
110134
111135 MarkupFormat :: PlainText => {
@@ -120,18 +144,16 @@ pub fn convert_to_jats(
120144 } ;
121145
122146 validate_ast_content ( & processed_ast, conversion_limit) ?;
123- output = if conversion_limit == ConversionLimit :: Title {
147+ Ok ( if conversion_limit == ConversionLimit :: Title {
124148 // Title JATS should remain inline (no paragraph wrapper)
125149 ast_to_jats ( & processed_ast)
126150 } else {
127151 plain_text_ast_to_jats ( & processed_ast)
128- } ;
152+ } )
129153 }
130154
131- MarkupFormat :: JatsXml => { }
155+ MarkupFormat :: JatsXml => unreachable ! ( "handled above" ) ,
132156 }
133-
134- Ok ( output)
135157}
136158
137159/// Convert from JATS XML to specified format using a specific tag name
@@ -347,6 +369,30 @@ mod tests {
347369 . unwrap ( ) ;
348370 assert_eq ! ( output, "Just plain text." ) ;
349371 }
372+
373+ #[ test]
374+ fn test_jatsxml_plain_text_title_is_accepted ( ) {
375+ let input = "Second Expanded Edition" ;
376+ let output = convert_to_jats (
377+ input. to_string ( ) ,
378+ MarkupFormat :: JatsXml ,
379+ ConversionLimit :: Title ,
380+ )
381+ . unwrap ( ) ;
382+ assert_eq ! ( output, input) ;
383+ }
384+
385+ #[ test]
386+ fn test_jatsxml_plain_text_abstract_is_wrapped ( ) {
387+ let input = "Plain abstract content." ;
388+ let output = convert_to_jats (
389+ input. to_string ( ) ,
390+ MarkupFormat :: JatsXml ,
391+ ConversionLimit :: Abstract ,
392+ )
393+ . unwrap ( ) ;
394+ assert_eq ! ( output, "<p>Plain abstract content.</p>" ) ;
395+ }
350396 // --- convert_to_jats tests end ---
351397
352398 // --- convert_from_jats tests start ---
0 commit comments