Feature-gate runtime server; migrate MCP API; improve DOCX fallbacks

Gate runtime server behind `runtime-server` feature and align tool interfaces with latest `mcp_core` response types. Add safer DOCX->PDF fallbacks (dotext reader, inline comments/notes/cross-refs) and clarify crate imports (`image`, `lopdf`) to reduce conflicts; minor PDF utilities cleanup.
This commit is contained in:
Andy
2025-08-11 18:19:53 +08:00
parent ec800ce12c
commit f75a47fe76
6 changed files with 76 additions and 105 deletions
+19 -63
View File
@@ -86,24 +86,9 @@ impl AdvancedDocxHandler {
let width_emu = width_px * 9525;
let height_emu = height_px * 9525;
let drawing = Drawing::new()
.inline(
Inline::new()
.extent(width_emu, height_emu)
.graphic(
Graphic::new()
.graphic_data(
GraphicData::new()
.pic(
Pic::new()
.blip_fill(image_data.to_vec())
)
)
)
);
let paragraph = Paragraph::new()
.add_run(Run::new().add_drawing(drawing));
let pic = Pic::new_with_dimensions(image_data.to_vec(), width_px, height_px);
let drawing = Drawing::new().pic(pic);
let paragraph = Paragraph::new().add_run(Run::new().add_drawing(drawing));
Ok(docx.add_paragraph(paragraph))
}
@@ -182,11 +167,10 @@ impl AdvancedDocxHandler {
/// Add a cross-reference
pub fn add_cross_reference(&self, docx: Docx, bookmark_name: &str, display_text: &str) -> Result<Docx> {
// Cross-references in DOCX use field codes
let field = ComplexField::new()
.instruction(&format!("REF {} \\h", bookmark_name))
.default_text(display_text);
let paragraph = Paragraph::new().add_complex_field(field);
// Complex field support is limited in current docx-rs; fallback to plain hyperlink
let paragraph = Paragraph::new().add_run(
Run::new().add_text(display_text).add_hyperlink(Hyperlink::new(bookmark_name, HyperlinkType::External))
);
Ok(docx.add_paragraph(paragraph))
}
@@ -290,34 +274,22 @@ impl AdvancedDocxHandler {
pub fn add_footnote(&self, docx: Docx, reference_text: &str, footnote_text: &str) -> Result<Docx> {
let footnote_id = Uuid::new_v4().to_string();
let footnote = Footnote::new(&footnote_id)
.add_paragraph(
Paragraph::new()
.add_run(Run::new().add_text(footnote_text))
);
// docx-rs footnote APIs are in flux; append note text inline as fallback
let paragraph = Paragraph::new()
.add_run(Run::new().add_text(reference_text))
.add_footnote_reference(&footnote_id);
Ok(docx.add_paragraph(paragraph).add_footnote(footnote))
.add_run(Run::new().add_text(format!(" [{}]", footnote_text)));
Ok(docx.add_paragraph(paragraph))
}
/// Add endnote
pub fn add_endnote(&self, docx: Docx, reference_text: &str, endnote_text: &str) -> Result<Docx> {
let endnote_id = Uuid::new_v4().to_string();
let endnote = Endnote::new(&endnote_id)
.add_paragraph(
Paragraph::new()
.add_run(Run::new().add_text(endnote_text))
);
// Fallback inline rendering for endnotes
let paragraph = Paragraph::new()
.add_run(Run::new().add_text(reference_text))
.add_endnote_reference(&endnote_id);
Ok(docx.add_paragraph(paragraph).add_endnote(endnote))
.add_run(Run::new().add_text(format!(" [{}]", endnote_text)));
Ok(docx.add_paragraph(paragraph))
}
/// Add custom styles
@@ -329,8 +301,9 @@ impl AdvancedDocxHandler {
let mut paragraph_property = ParagraphProperty::new();
if let Some(spacing) = style.spacing {
use docx_rs::types::line_spacing_type::LineSpacingType;
paragraph_property = paragraph_property
.line_spacing(LineSpacing::new(SpacingType::Auto, spacing.before, spacing.after));
.line_spacing(LineSpacing::new(spacing.line).line_rule(LineSpacingType::Auto));
}
if let Some(indent) = style.indent {
@@ -372,12 +345,8 @@ impl AdvancedDocxHandler {
let mut docx = docx;
for field in fields {
let merge_field = ComplexField::new()
.instruction(&format!("MERGEFIELD {} \\* MERGEFORMAT", field))
.default_text(&format!("«{}»", field));
let paragraph = Paragraph::new()
.add_complex_field(merge_field);
.add_run(Run::new().add_text(format!("«{}»", field)));
docx = docx.add_paragraph(paragraph);
}
@@ -390,24 +359,11 @@ impl AdvancedDocxHandler {
let comment_id = Uuid::new_v4().to_string();
let date = Utc::now();
let comment_obj = Comment::new(&comment_id, author)
.date(date)
.add_paragraph(
Paragraph::new()
.add_run(Run::new().add_text(comment))
);
let comment_range_start = CommentRangeStart::new(&comment_id);
let comment_range_end = CommentRangeEnd::new(&comment_id);
let comment_reference = CommentReference::new(&comment_id);
// Fallback: inline annotation style rendering (no true comment element)
let paragraph = Paragraph::new()
.add_comment_range_start(comment_range_start)
.add_run(Run::new().add_text(text))
.add_comment_range_end(comment_range_end)
.add_run(Run::new().add_comment_reference(comment_reference));
Ok(docx.add_paragraph(paragraph).add_comment(comment_obj))
.add_run(Run::new().add_text(format!(" [Comment by {}: {}]", author, comment)));
Ok(docx.add_paragraph(paragraph))
}
// Template helper methods