Writing the blog in word posed some challenges. One I stumbled upon 2 minutes after I started was that code and xml I pasted in looked like shit.
Maybe there is an easily available workaround that I have not found, but then again, if I cannot find it you might not either.
I researched how to format code and xml in word to get it to look ok in blogger, more precise to keep the indentations in blogger in an earlier post.
So I took on the task to write a plugin that lets you paste in code and xml, select it and then press a button to format it by enclosing it in a table, that in turns hold tables to get the indentations correct.
Of course this has proven to take more time that I would have guessed. Anyone using word as a host for anything will know why… You just cannot trust the application to behave logical. It's more like a crazy horse, you think your friends but then you get kicked in the butt…
Even now as I write this I trying to figure out how to keep this crazy animal sane long enough so that I can do my thing.
| |
| | private Office.CommandBar AddToolBar() |
|
|
|
|
| | Office.CommandBar toolbar = this.Application.CommandBars.Add(TOOLBAR, MsoBarPosition.msoBarTop, missing, false); |
|
|
| | Office.CommandBarButton button = (Office.CommandBarButton) |
|
| | toolbar.Controls.Add(MsoControlType.msoControlButton, missing, |
|
| | missing, missing, false); |
|
|
| | // Set the button's style |
|
| | button.Style = Office.MsoButtonStyle.msoButtonCaption; |
|
|
| | // Set the button's caption |
|
| | button.Caption = "Code and XML Format for web publish"; |
|
| | button.Click += new
_CommandBarButtonEvents_ClickEventHandler(CodeAndXmlFormat); |
|
|
| | // Ensure the toolbar is visible, by default it won't be |
|
|
|
| | // Return the newly created toolbar |
|
|
|
The active part of the code comes here:
| |
| | void CodeAndXmlFormat(CommandBarButton Ctrl, ref
bool CancelDefault) |
|
|
| | if (this.Application.Selection.Tables.Count != 0) |
|
|
| | MessageBox.Show("There are a some tables in the selection, so I cannot do anything for you..."); |
|
|
|
|
| | Application.ScreenUpdating=false; |
|
|
|
| | List<Paragraph> ps = new
List<Paragraph>(); |
|
| | List<int> indents = new
List<int>(); |
|
|
| | int smallestwidth=int.MaxValue; |
|
| | // Run thru the selection |
|
| | foreach (Paragraph p in
this.Application.Selection.Paragraphs) |
|
|
| | if (started || p.Range.Text != "\r") // skip leading empties |
|
|
|
|
|
| | // count leading spaces and tabs |
|
| | for (int i = 1; i < p.Range.Characters.Count + 1; i++) |
|
|
| | string s = p.Range.Characters[i].Text; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| | // Now build the new table |
|
| | Range r3=Application.Selection.Range.Duplicate; |
|
|
|
| | object paramMissing2 = Type.Missing; |
|
| | Table t=r3.Tables.Add(r3,ps.Count+1,1,ref paramMissing2,ref paramMissing2); |
|
| | for (int i=ps.Count-1;i>=0;i--) |
|
|
|
| | DoOneRowAsSubTable(t.Rows[i + 2], p, indents[i] - smallestwidth/*detuct initial space*/ ); |
|
|
|
| | // The oldest and best trick in the book when doing word developement; record a macro of what you need to do, then steal the code: |
|
| | this.Application.Selection.SetRange(t.Range.Start,t.Range.End); |
|
| | this.Application.Selection.Font.Size = 8; |
|
|
|
|
| | for (int i = ps.Count - 1; i >= 0; i--) |
|
|
|
|
| | p.Range.Delete(ref paramMissing2, ref numtodel); |
|
|
|
|
|
| | Application.ScreenUpdating=true; |
|
|
|
|
This code depends on this method that wraps one row in a sub table with two cells that fix up the indentation:
| |
| | private
void DoOneRowAsSubTable(Row row, Paragraph p, int width) |
|
|
| | object paramMissing2 = Type.Missing; |
|
| | Table t=row.Cells[1].Range.Tables.Add(row.Cells[1].Range,1,2,ref paramMissing2, ref paramMissing2); |
|
| | Application.ActiveDocument.UndoClear(); |
|
| | //Application.ScreenRefresh(); |
|
| | float totwidth=t.Rows[1].Cells[1].Width+t.Rows[1].Cells[2].Width; |
|
| | t.Rows[1].Cells[1].Width=Math.Max(15,width*7); |
|
| | t.Rows[1].Cells[2].Width = Math.Min(row.Cells[1].Width, totwidth - t.Rows[1].Cells[1].Width); |
|
|
|
| | Range r=p.Range.Duplicate; |
|
|
| | while (r.Characters.Count > 1 && (r.Characters[1].Text == " " || r.Characters[1].Text == "\t")) |
|
|
|
|
| | while (r.End > r.Start && (r.Characters[r.Characters.Count].Text == "\r" || r.Characters[r.Characters.Count].Text == "\a")) |
|
|
|
|
|
|
|
| | t.Rows[1].Cells[2].Range.Paste(); |
|
| | //t.Rows[1].Cells[2].Range.InsertXML(r.WordOpenXML,ref paramMissing2); |
|
|
|
|
And that's it. Now I can use Word2007 to post code and xaml. I still need to mark the snippets and push an add in button to wrap in a table. And Yes, the table thing is not optimal in anyway, but it is good enough for me.
To be honest I also made some small changes to the css part of the blogger style sheet. I made the main area wider and also added a style to make table rows 9 pixels high.
| |
|
|
| | background-color:#eeeeee; |
|
|
|
|
|
|
| | word-wrap: break-word; /* fix for long text breaking sidebar float in IE */ |
|
| | overflow: hidden; /* fix for long non-text content breaking IE sidebar float */ |
|
|
0 Comments:
Post a Comment
Subscribe to Post Comments [Atom]
<< Home