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:
+19
-63
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user