{"id":161,"date":"2008-03-18T17:00:00","date_gmt":"2008-03-18T22:00:00","guid":{"rendered":"http:\/\/2d823b65bb.nxcli.io\/2008\/03\/how-many-defects-remain-in-ooxml.html"},"modified":"2008-03-18T17:00:00","modified_gmt":"2008-03-18T22:00:00","slug":"how-many-defects-remain-in-ooxml","status":"publish","type":"post","link":"https:\/\/www.robweir.com\/blog\/2008\/03\/how-many-defects-remain-in-ooxml.html","title":{"rendered":"How many defects remain in OOXML?"},"content":{"rendered":"<p>DIS 29500, Office Open XML, was submitted for Fast Track review by Ecma as 6,045 page specification.  (After the BRM, it is now longer, maybe 7,500 pages or so.  We don&#8217;t know for sure, since the post-BRM text is not yet available for inspection.)  Based on the original 6,045 page length, a 5-month review by JTC1 NB&#8217;s lead to 48 defect reports by NB&#8217;s, reporting a total of 3,522 defects.   Ecma responded to these defect reports with 1,027 proposals, which the recent BRM, mainly through the actions of one big overnight ballot, approved.<\/p>\n<p>So what was the initial quality of OOXML, coming into JTC1?   One measure is the defect density, which we can say is at least one defect for every 6045\/1027 = 5.8 pages.  I say &#8220;at least&#8221; because this is the lower bounds.  If we believed that the 5-month review represented a complete review of the text of DIS 29500, by those with relevant subject matter expertise, then we would have some confidence that all, or at least most, defects were detected, reported and repaired.  But I don&#8217;t know anyone who really thinks the 5-month review was sufficient for a technical review of 6,045 pages.   Further, we know that Microsoft worked actively to suppress the reporting of defects by NB&#8217;s.  So the actual defect density is potentially quite a bit higher than the reported defect density.<\/p>\n<p>But how much higher?   This is the important question.  It doesn&#8217;t matter how many defects were fixed.  What matters is how many remain.<\/p>\n<p>There are several approaches to answering this question.  One approach is to look at defect &#8220;find rates&#8221;, the number of defects found per unit of time spent reviewing, and fit that to a model, typical an S-curve (sigmoid) and use that model to predict the number of defects remaining.  However, we have no time\/effort data for the DIS 29500 review, so we don&#8217;t have enough data to create that model.   Another approach is to randomly sample the post-BRM text and statistically estimate the defect density by this sample.<\/p>\n<p>Are there any other good approaches?<\/p>\n<p>Here is the plan.  I will use the second approach.  Since I do not actually have the post-BRM text, I need to make some adjustments.  I&#8217;ll start with the original text, in particular Part 4, the XML reference section, at 5,220 pages, where the meat of the standard is.  I&#8217;ll then create a spreadsheet and generate 200 random page numbers between 1 and 5,220.     For each random page I will review the clause associated with that page and note the technical and editorial errors I find.  I will then check these errors to see if any of them were addressed by BRM resolutions.<\/p>\n<p>Based on the above, I will be able to estimate two numbers:<\/p>\n<ul>\n<li>The defect density of the text, both pre and post BRM<\/li>\n<li>The fraction of defects which were detected by the Fast Track review.<\/li>\n<\/ul>\n<p>So if I find N defects, and 0.9N of those issues were already found during the Fast Track review and were addressed by the BRM, then we can say that the Fast Track procedure was 90% effective in finding and removing errors.  Some practitioners would call that the defect removal &#8220;yield&#8221; of the process.  But if we find that only 0.1N of the errors were reported and addressed by the BRM, then we&#8217;ll have a different opinion on the sufficiency of the Fast Track review.<\/p>\n<p>Clear enough? Microsoft is claiming something like 99% of all issues were resolved at the BRM.  So let&#8217;s see if we get anything close.<\/p>\n<p>I&#8217;m not done with this study yet.  I&#8217;m finding so many defects that recording them is taking more time than finding them.  But since this is topical, I will report what I have found so far, based on the first 25 random pages, or 1\/8th completion of my target 200.  I&#8217;ve found 64 technical flaws.  None of the 64 flaws were addressed by the BRM.  Among the defects are some rather serious ones such as:<\/p>\n<ul>\n<li>storage of plain text passwords in database connection strings<\/li>\n<li>Undefined mappings between CSS and DrawingML<\/li>\n<li>Errors in XML Schema definitions<\/li>\n<li>Dependencies of proprietary Microsoft Internet Explorer features<\/li>\n<li>Spreadsheet functions that break with non-Latin characters<\/li>\n<li>Dependencies on Microsoft OLE method calls<\/li>\n<li>Numerous undefined terms and features<\/li>\n<\/ul>\n<p>As I said, this study is still underway.  I&#8217;ll list the defects I&#8217;ve found so far, and add to it as I complete the task over the next few days.<\/p>\n<ol>\n<li>Page 692, Section  2.7.3.13 \u2014 no errors found<\/li>\n<li>Page 1457, Section 2.15.3.45    \u2014 This is a compatibility setting which creates needless complexity for implementers who now must deal with two  different ways of handling a page break, one in which a page break ends the current paragraph, and another where it does not.  This is not a general need and expresses only a single vendor\u2019s legacy setting.<\/li>\n<li>Page 490, Section 2.4.72    \u2014 This defines the ST_TblWidth type, used to express the width of a table column, cell spacing, margins, etc.  The allowed values of this type express the measurement units to be used:  Auto, Twentieths of a point, Nil (no width), Fiftieths of a percent.   I find these choices to be capricious and not based on any sound engineering principle.  It also mixes units with width values (Nil) and modes (auto).  This should be changed to allow measurements in natural units, such as allowed in XSL-FO or CSS2, such as mm, inches, points, pica.  Also, do not mix units, values and modes in the same attribute.  Nil is best represented by the value 0 and Auto should be its own Boolean attribute.<\/li>\n<li>Page 328, Section 2.4.17    \u2014 The frame attribute description says it \u201cSpecifies whether the specified border should be modified to create a frame effect by reversing the border&#8217;s appearance from the edge nearest the text to the edge furthest from the text.\u201d  This is not clear.  What does it mean to reverse a border\u2019s appearance?  Are we doing color inversions?  Flipping along the Y-axis?  What exactly?   Also a typographical error:  \u201cFor the right and top borders, this is accomplished by moving the order down and to the right of its original location.\u201d  Should be \u201cmoving the border down\u2026\u201d  Also, it is not stated how far the border should be moved.<\/li>\n<li>Page 1073, Section 2.14.8    \u2014 This feature is described as:  \u201cThis element specifies the connection string used to reconnect to an external data source. The string within this element&#8217;s val attribute shall contain the connection string that the hosting application shall pass to a external data source access application to enable the WordprocessingML document to be reconnected to the specified external data source.\u201d   Since connection to external data typically requires a user ID and a password, the lack of any security mechanism on this feature is alarming.  The example given in the text itself hardcodes a plain-text password in it the connection string.<\/li>\n<li>Page 4387, Section 6.1.2.3 \u2014 For the \u201cclass\u201d attribute it says \u201cSpecifies a reference to the definition of a CSS style.\u201d  The example implies that some sort of mapping will occur between CSS attributes and DrawingML.  But no such mapping is defined in OOXML.   The &#8220;doubleclicknotify&#8221; attribute implies some sort of event model that us undefined in OOXML.  How do you send a message for doubleclicknotify?  Why do we describe organization chart layouts here when it is not applicable to a bezier curve?  What happens if this shape is declared to be a horizontal rule or bullet or ole object? The text allows you label it as one of these, but assigns no meaning or behavior to this.   Why do we have an spid as well as an id attribute? The &#8220;target&#8221; attribute refers to Microsoft-specific I.E. features such as &#8220;_media&#8221;.   Although the text says that control points have default values, the schema fragment does not show this.<\/li>\n<li>Page 3164, Section 4.6.88    \u2014 This and the following two elements are all called &#8220;To&#8221; but this seems to be a naming error.   4.6.89 is essentially undefined.    What does &#8220;The element specifies the certain attribute of a time node after an animation effect&#8221; mean?  It doesn&#8217;t seem to really signify anything.  Ditto for 4.6.90.<\/li>\n<li>Page 5098, Section 7.1.2.124        \u2014 The example does not illustrate what the text claims it does.   The example doesn&#8217;t even use the element defined by this clause.<\/li>\n<li>Page 4492, Section 6.1.2.11    \u2014 The &#8220;althref&#8221; attribute is described as &#8220;Defines an alternate reference for an image in Macintosh PICT format&#8221;.  Why is this necessary for only Mac PICT files?  Why would &#8220;bilevel&#8221; necessarily lead to 8 colors? We&#8217;re well beyond 8-bit color these days.  &#8220;blacklevel&#8221; attribute is defined as &#8220;Specifies the image brightness. Default is 0.&#8221;  What is the scale here?  This needs to be defined.  Is it 0-1.0, 0-255 or what?  And what is &#8220;image brightness&#8221; in terms of the art?  Is this luminosity?  Opacity?  Is this setting the level of the black point?  For &#8220;cropleft&#8221;, etc. &#8212; what units are allowed? (implies %)   How does &#8220;detectmouseclick&#8221; work when no event model is defined?   &#8220;emboss effect&#8221; is not defined.    &#8220;gain&#8221; has the same problem as &#8220;blacklevel&#8221; &#8212; no scale is defined.  This element has two different id attributes in two different namespaces, with two different types.  &#8220;movie&#8221; attribute is described as &#8220;Specifies a pointer to a movie image. This is a data block that contains a pointer to a pointer to movie data&#8221;.   Excuse me?  &#8220;A pointer to a pointer to movie data&#8221;?  This is useless.  The &#8220;recolortarget&#8221; example appears to contradict the description.  It shows shows blue recolored to red, not black.  The &#8220;src&#8221; attribute is said to be a URL, yet is typed to xsd:string.  This should be xsd:anyURI.<\/li>\n<li>Page 1431, Section 2.15.3.30 \u2014  no errors noted<\/li>\n<li>Page 3405, Section 5.1.5.2.7    \u2014 The conflict resolution algorithm should be normative, not merely in a note.<\/li>\n<li>Page 875, Section 2.11.21    \u2014 Instead of saying that the footnote &#8220;pos&#8221; element should be ignored if present at the section level, the schema should be defined so as to not allow it at the section level.  In other words, this should be expressed as a syntax constraint.<\/li>\n<li>Page 1955, Section 3.3.1.20    \u2014 This facility for adding &#8220;arbitrary&#8221; binary data to spreadsheets is said to be for &#8220;legacy third-party document components&#8221;.  No documentation or mapping for such legacy components has been provided, so interoperability with this legacy data cannot be achieved.  Why isn&#8217;t this expressed using the extension mechanisms of Part 5 of the DIS?<\/li>\n<li>Page 4526, Section 6.1.2.13    \u2014 The &#8220;allowoverlap&#8221; attribute is not sufficiently defined.  In particular, what determines whether the object shifts to right or left? ST_BWMode is not adequately defined.  For example, one option is &#8220;Use light shades of gray only&#8221;.  How light?  And what is the difference between &#8220;hide&#8221; and &#8220;undrawn&#8221;?   Also, concept of &#8220;wrapping polygon&#8221; is not sufficiently defined.  For example, what is the wrapping polygon for an oval?  The purpose of &#8220;dgmlayoutmru&#8221; is obscure.  Wouldn&#8217;t the most-recently-used layout option be the one which is actually in use, &#8220;dgmlayout&#8221;?   The &#8220;dgmnodekind&#8221; attribute is undefined, said to be &#8220;application-specific&#8221;.  Is interoperabilty not allowed?  The text seems to imply that applications must use application-specific values.   The &#8220;href&#8221; attribute is give a string schema type. Shouldn&#8217;t this be xsd:anyURI.  The &#8220;id&#8221; attribute is said to be a &#8220;unique identifier&#8221;.  Unique in what domain?  Among shapes of this type?  Among all shapes?  All shapes on this page? Among all ID&#8217;s in the document? The &#8220;preferrelative&#8221; attribute is not sufficiently defined.  Where is the original size stored?  After what reformatting?  This appears to be a specification for runtime behavior, not a storage artifact.  But it is not clear what is required.  For the &#8220;regroupid&#8221;, where is the list of these possible id&#8217;s?    The Hyperlink targets _media and _search are Internet Explorer proprietary features.<\/li>\n<li>Page 1193, Section 2.15.1.39 \u2014  no errors noted<\/li>\n<li>Page 1459, Section 2.15.3.46 \u2014  no errors noted<\/li>\n<li>Page 2671, Section 3.17.7.150 \u2014  no errors noted<\/li>\n<li>Page 2347, Section 3.10.1.69    \u2014 An &#8220;AutoShow&#8221; filter is not defined in this standard, though it is called for in several places of this section.  &#8220;Average&#8221; aggregation function is not defined.  In fact, none of these aggregation functions are defined.  Although some have common mathematical definitions, in a spreadsheet context it is critical to make an explicit statement on treatment of strings, blanks, empty cells, etc.  For dataSourceSort, what type of sort is required?  Lexical or locale-sensitive?  This element seems to mix field-specific settings, like dragToCol with pivotTable-wide settings like  hiddenLevel.  This will result in large data redundancy as settings like hiddenLevel are stored multiple times, once for each pivotField.  &#8220;Inclusive Mode&#8221; is not defined.  &#8220;Measure based filter&#8221; is not defined. &#8220;AutoSort&#8221; mode is not defined.  The resolution of pivot table versus cell styles is ambiguous.  &#8220;If the two formats differ, the cell-level formatting takes precedence.&#8221;  Is this negotiation done at the level of the entire text style?  Style ID?  Or at the attribute level? &#8220;Outline form&#8221; is not defined.  &#8220;server-based page field&#8221; is not defined.  (what is a page field?) &#8220;member caption&#8221; is undefined.<\/li>\n<li>Page 2885, Section 3.18.51    \u2014 The values of the given type (ST_OleUpdate) are explicitly tied to the Microsoft Windows OLE2 technology via the two method calls IOleObject::Update or IOleLink::Update<\/li>\n<li>Page 3951, Section 5.5.3.4    \u2014 The base values &#8220;margin&#8221; and  &#8220;edge&#8221; are ambiguous.  Is it specifying positioning from the left or right page edge?<\/li>\n<li>Page 2710, Section 3.17.7.200    \u2014 The description of &#8220;lookup-vector&#8221; is insufficient.  It seems to be saying that the range should be sorted.  Is this really correct? Spreadsheet functions typically do not have side effects.  Also, the sorting procedure is explicitly defined only defined for the Latin alphabet.  What about the rest of allowed Unicode characters, including the C0 control characters which are allowed in SpreadsheetML cell contents?  Where are they sorted?<\/li>\n<li>Page 934, Section 2.13.5.5 \u2014 The &#8220;id&#8221; attribute is required to be unique, but it is not specified over what domain it must be unique.<\/li>\n<li>Page 607, Section 2.6.2 \u2014 What does &#8220;reversing the borders&#8217;s appearance mean&#8221;?  How much offset is required for a shadow? <\/li>\n<li>Page 201, Section 2.3.2.19 \u2014 This feature allows the suppressing of both spell and grammar checking for a text run.  These should be two different settings, one for spelling and one for grammar proofing.  There are many cases where it is important to check one, but not the other, just as in content comprised of sentence fragments, which are not grammatically complete, but where correct spelling is desired.<\/li>\n<li>Page 1240, Section 2.15.1.74 \u2014 This setting specifies that the document should be saved into an undefined invalid XML format.  But it is not stated how an XSLT transfor can be applied to an OOXML document, since OOXML is a Zip file containing many XML documents.  So what exactly is the specified XSLT applied to?<\/li>\n<\/ol>\n<p>That&#8217;s as far as I&#8217;ve gone.  But this doesn&#8217;t look good, does it?  Not only am I finding numerous errors, these errors appear to be new ones, ones not detected by the NB 5-month review, and as such were not addressed in Geneva.  Since I have not come across any error that actually was fixed at the BRM,  the current estimate of the defect removal effectiveness of the Fast Track process is &lt; 1\/64 or 1.5%. That is the upper bounds. (Confidence interval?  I&#8217;ll need to check on this, but I&#8217;m thinking this would be based on standard error of a proportion, where SE=sqrt((p*(1-p))\/N)), making our confidence interval  1.5%  \u00b1 3%)   Of course, this value will need to be adjusted as my study continues. However, it is starting to look like the Fast Track review was very shallow and that detected only a small percentage of the errors in the DIS.<\/p>\n<p>[20 March Update]<\/p>\n<p>As one commenter noted, the page numbers I&#8217;m using above are PDF page numbers, not the page numbers on bottom of each page.  If I used the printed pages then I would need to deal with all the Roman numeral front matter pages as an exception.  Simpler to just use the one large domain of PDF page numbers.<\/p>\n<p>PDF Page Number  = Printed Page Number + 7<\/p>\n<p>I will continue to report new defects, according to the original random number list I generated.  I&#8217;ll update the statistics every 25.<\/p>\n<p>Here&#8217;s some more for today:<\/p>\n<ol start=\"26\">\n<li>Page 4192, Section 5.8.2.20 \u2014 &#8220;fPublished&#8221; attribute is defined as &#8220;Specifies whether the shape shall be published with the worksheet when sent to the spreadsheet server. This is for use when interfacing with a document server.&#8221;  What worksheet?  This section is in the DrawingML reference material.  Charts could appear in presentations as well.  This should not be limited to worksheets.  Also what is a &#8220;spreadsheet server&#8221;?  No such technology has been defined in this standard.  Also no protocol has been defined for publishing to a spreadsheet server.  Is this some proprietary hook for SharePoint?  The &#8220;macro&#8221; attribute allows the storage of application-defined scripts.  We are told that the macro &#8220;should be ignored if not understood.&#8221;  However there is no mechanism for determining what language the script is in.  How do we know if we understand the macro?  Content sniffing?  Attempt to execute it and see if we get a runtime error?  But by that time, once we find out that we do not understand it, it is too late to ignore the macro.  We may have already triggered runtime side effects.  What we really need here is some way to declare what scripting language is being used, via a namespace or an additional attribute like &#8220;lang&#8221;.<\/li>\n<li>Page 3526, Section 5.1.5.4.21 \u2014 The &#8220;algn&#8221; attribute specifies the text alignment.  Allowed values include left, right, center, justified, etc.  However, what is lacking is &#8220;start&#8221; and &#8220;end&#8221; alignment, which are sensitive to writing direction and are part of internationalization bets practices, for example, XSL-FO.  When translating a document between RTL and LTR systems, the approach used by OOXML will harder to deal with and be more expensive to translate, since the translator will need to manually play with styles on not just perform an semi-automated translation.\n<\/li>\n<\/ol>\n<p>[End Update]<\/p>\n<p>I&#8217;ll continue to review the remaining 173 pages of my random sample and update the numbers and the defect list as I go. If you want to play along at home, the upcoming random page numbers will be:<\/p>\n<ul>\n<li>1039                <\/li>\n<li>4933                <\/li>\n<li>3334                <\/li>\n<li>1993                <\/li>\n<li>1632                <\/li>\n<li>4787                <\/li>\n<li>460                <\/li>\n<li>481                <\/li>\n<li>4497                <\/li>\n<li>310                <\/li>\n<li>282                <\/li>\n<li>2383                <\/li>\n<li>1793                <\/li>\n<li>2451                <\/li>\n<li>3310                <\/li>\n<li>3716                <\/li>\n<li>1261                <\/li>\n<li>1077                <\/li>\n<li>2219                <\/li>\n<li>4236                <\/li>\n<li>285                <\/li>\n<li>3090                <\/li>\n<li>737                <\/li>\n<li>2370                <\/li>\n<li>741                <\/li>\n<li>164                <\/li>\n<li>5044                <\/li>\n<li>364                <\/li>\n<li>2272                <\/li>\n<li>1377                <\/li>\n<li>4512                <\/li>\n<li>1410                <\/li>\n<li>964                <\/li>\n<li>5079                <\/li>\n<li>5030                <\/li>\n<li>4110                <\/li>\n<li>3620                <\/li>\n<li>3588                <\/li>\n<li>2301                <\/li>\n<li>3222                <\/li>\n<li>4485                <\/li>\n<li>5082                <\/li>\n<li>193                <\/li>\n<li>3632                <\/li>\n<li>985                <\/li>\n<li>1593                <\/li>\n<li>5155                <\/li>\n<li>1054                <\/li>\n<li>3371                <\/li>\n<li>3717                <\/li>\n<li>5015                <\/li>\n<li>1071                <\/li>\n<li>2965                <\/li>\n<li>2294                <\/li>\n<li>1809                <\/li>\n<li>161                <\/li>\n<li>4922                <\/li>\n<li>5219                <\/li>\n<li>1719                <\/li>\n<li>1040                <\/li>\n<li>4259                <\/li>\n<li>3134                <\/li>\n<li>1195                <\/li>\n<li>4232                <\/li>\n<li>4444                <\/li>\n<li>3931                <\/li>\n<li>2302                <\/li>\n<li>2788                <\/li>\n<li>3584                <\/li>\n<li>8                <\/li>\n<li>5092                <\/li>\n<li>2580                <\/li>\n<li>1080                <\/li>\n<li>1239                <\/li>\n<li>1415                <\/li>\n<li>1170                <\/li>\n<li>1501                <\/li>\n<li>151                <\/li>\n<li>148                <\/li>\n<li>4754                <\/li>\n<li>1350                <\/li>\n<li>3714                <\/li>\n<li>1895                <\/li>\n<li>3926                <\/li>\n<li>4833                <\/li>\n<li>2886                <\/li>\n<li>2983                <\/li>\n<li>1439                <\/li>\n<li>3622                <\/li>\n<li>4960                <\/li>\n<li>2000                <\/li>\n<li>2555                <\/li>\n<li>671                <\/li>\n<li>2388                <\/li>\n<li>352                <\/li>\n<li>222                <\/li>\n<li>1630                <\/li>\n<li>3033                <\/li>\n<li>4994                <\/li>\n<li>3346                <\/li>\n<li>531                <\/li>\n<li>2393                <\/li>\n<li>482                <\/li>\n<li>207                <\/li>\n<li>2252                <\/li>\n<li>4074                <\/li>\n<li>3302                <\/li>\n<li>2459                <\/li>\n<li>751                <\/li>\n<li>1891                <\/li>\n<li>1635                <\/li>\n<li>3120                <\/li>\n<li>2226                <\/li>\n<li>1119                <\/li>\n<li>810                <\/li>\n<li>1728                <\/li>\n<li>837                <\/li>\n<li>4570                <\/li>\n<li>4474                <\/li>\n<li>1072                <\/li>\n<li>3901                <\/li>\n<li>300                <\/li>\n<li>4895                <\/li>\n<li>1764                <\/li>\n<li>2332                <\/li>\n<li>619                <\/li>\n<li>4392                <\/li>\n<li>2112                <\/li>\n<li>1653                <\/li>\n<li>4339                <\/li>\n<li>2384                <\/li>\n<li>4566                <\/li>\n<li>4085                <\/li>\n<li>1171                <\/li>\n<li>2238                <\/li>\n<li>5144                <\/li>\n<li>1399                <\/li>\n<li>4157                <\/li>\n<li>1352                <\/li>\n<li>27                <\/li>\n<li>4118                <\/li>\n<li>4167                <\/li>\n<li>5046                <\/li>\n<li>4460                <\/li>\n<li>4053                <\/li>\n<li>1258                <\/li>\n<li>4252                <\/li>\n<li>922                <\/li>\n<li>3748                <\/li>\n<li>1742                <\/li>\n<li>458                <\/li>\n<li>4448                <\/li>\n<li>963                <\/li>\n<li>2227                <\/li>\n<li>1404                <\/li>\n<li>593                <\/li>\n<li>4140                <\/li>\n<li>1739                <\/li>\n<li>1102                <\/li>\n<li>1611                <\/li>\n<li>3016                <\/li>\n<li>2646                <\/li>\n<li>3083                <\/li>\n<li>5105                <\/li>\n<li>747                <\/li>\n<li>1142                <\/li>\n<li>2596                <\/li>\n<li>845                <\/li>\n<li>626                <\/li>\n<li>4047                <\/li>\n<li>1415                <\/li>\n<li>5143                <\/li>\n<li>3997                <\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>DIS 29500, Office Open XML, was submitted for Fast Track review by Ecma as 6,045 page specification. (After the BRM, it is now longer, maybe 7,500 pages or so. We don&#8217;t know for sure, since the post-BRM text is not yet available for inspection.) Based on the original 6,045 page length, a 5-month review by [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","footnotes":""},"categories":[6],"tags":[],"class_list":{"0":"post-161","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-ooxml","7":"entry"},"_links":{"self":[{"href":"https:\/\/www.robweir.com\/blog\/wp-json\/wp\/v2\/posts\/161","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.robweir.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.robweir.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.robweir.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.robweir.com\/blog\/wp-json\/wp\/v2\/comments?post=161"}],"version-history":[{"count":0,"href":"https:\/\/www.robweir.com\/blog\/wp-json\/wp\/v2\/posts\/161\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.robweir.com\/blog\/wp-json\/wp\/v2\/media?parent=161"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.robweir.com\/blog\/wp-json\/wp\/v2\/categories?post=161"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.robweir.com\/blog\/wp-json\/wp\/v2\/tags?post=161"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}