When you publish or edit an article in the TechNet Wiki, you can include the [toc] tag in the body of the article to have a Table of Contents automatically created. The Table of Contents is created from the headings in the article.
When a TechNet Wiki article with the [toc] tag is saved, a script analyzes all of the headings. Headings are enclosed by <h1> and </h1> tags in the HTML, where the digit "1" can be any digit from 1 to 9. For example, a heading line in the HTML might be similar to below before being saved:
<h3>This is an Example</h3>
If a heading does not have an anchor tag (such as in my example), one is added when the article is saved. The name in the anchor tag will be the text of the heading, but with spaces and special characters replaced by underscores. For example, the above heading will be modified as follows when the Wiki article is saved:
<h3><a name="This_is_an_Example"></a>This is an Example</h3>
Each anchor name tag is enclosed by the <a name> and </a> tags. When a Wiki article with the [toc] tag is displayed in a browser, a script creates the Table of Contents from all headings in the article. When you click on an entry in the Table of Contents, the browser will jump to the appropriate heading line by referencing the anchor name tag. This makes it important that the anchor names be unique in the article. If two anchors have the same name, the Table of Contents will only jump to the first instance of the name.
Several problems in the HTML of TechNet Wiki articles can make the TOC (Table of Contents) feature not work properly. The VBScript program linked on this page is designed to parse the HTML to find these problems. The script finds the following problems:
1. Embedded "0" characters in headings. This character is no problem in the text of the heading. However, the script that runs when the article is saved will include the "0" in the anchor tag name. This causes the heading to not appear in the TOC at all. It is hoped that this bug will be fixed in the future, but for now the workaround is to replace all "0" characters in the anchor name tag with something else, such as the string "Oh". In addition, when the article is saved, the anchor tag with the "0" characters is not recognized, so the script creates another with the same problem. This adds to the "trash" in the HTML, making it harder to read. For example, HTML similar to the following can be found in a Wiki article when a heading has the zero character (this one line will be word wrapped):
<h3><a name="Windows_Server_2008_R2"></a><a name="Windows_Server_2008_R2"></a><a name="Windows_Server_2008_R2"></a><a name="Windows_Server_2008_R2"></a>Windows Server 2008 R2</h3>
This article was saved 4 times, and each time the anchor tag was not recognized and was re-created from the text of the heading. This heading line will not appear in the Table of Contents because the anchor tag name is still not recognized by the script that creates the TOC. The fix is to remove the extra anchor name tags (so there is only one) and replace the "0" character with something else, such as the string "Oh", in the remaining anchor tag. For example, the heading above could be fixed as follows:
<h3><a name="Windows_Server_TwentyOhEight_R2"></a>Windows Server 2008 R2</h3>
2. Foreign characters (extended ASCII) in headings. The same problem causes the TOC feature to not recognize foreign characters, such as "é", "í", "ç", or "ã".
3. Duplicate anchor name tags in headings. This can cause the Table of Contents feature to link to the wrong location in the article.
4. Blank headings (no text to be displayed). This can result in blanks in the Table of Contents, and the TOC may link to the blank line.
5. Leading digits in headings. This is usually not a problem. However any leading digits in the heading are not included in the anchor name tag created by the TOC script. This can in some cases cause the anchor name tag to be a duplicate, if two headings only differ by the leading digit.
6. RGB color values, either decimal or hexadecimal. These are no longer supported in the TechNet Wiki. The workaround is to replace these values with standard color names.
In addition, the VBScript program finds all duplicate anchor name tags in the TechNet Wiki article, whether in headings or not.
In preparation to run the script, open the TechNet Wiki article and click on the "Edit" tab. In the Wiki editor select "HTML" near the bottom (the default selection is "Design"). Copy the entire HTML of the article into a text file and save it. Then run this script and either specify the file with the HTML of the article as a parameter or let the script prompt you for the file.
The output of the script will display the headings where problems were found. However, the script does not fix the problems. You will need to edit the Wiki article, select HTML in the editor, find the problem lines, and fix them yourself. You can search on the string "<h" (without the quotes) to find all heading lines in the HTML.
The script output indicates the problem and the heading. If headings have duplicate anchor name tags, the script will list the duplicates twice, once as duplicate headings, then again as duplicate anchor tags. If the heading has embedded zero characters, only the first anchor name tag is displayed, to avoid the very long heading that results when the anchor tag is repeated many times. When decimal RGB color values are found, the script also outputs the closest standard color name in square brackets. Typical output can be similar to below:
----- Analyze Headings
## Embedded "0" in name tag: <h3><a name="Server 2008"></a>Server 2008</a></h3>
## Blank heading: <h4></h4>
## Blank heading: <h3><a name="see_also"></a></h3>
## Duplicate anchor name tag: <h1><a name="see_also"></a>see also</h1>
Number of problems in headings: 4
----- Analyze Anchor Name Tags
## Duplicate anchor name tag: <a name="see_also"></a>
Number of duplicate anchor name tags: 1
----- Search for color values
## Found rgb color: rgb(192, 0, 0) [best standard color: FireBrick]
## Found rgb color: rgb(42, 42, 42) [best standard color: DarkSlateGray]
## Found rgb color: rgb(255, 0, 0) [best standard color: Red]
Total color values found: 3
' ParseWiki.vbs
' VBScript program to parse TechNet Wiki Article HTML for heading
' and anchor name tag problems.
' Script Author: Richard L. Mueller
' Version 1.0 - October 11, 2012
' Version 1.1 - November 8, 2012 - Improve recognition of headings.
' Version 1.2 - February 15, 2012 - Find foreign characters. Find: é í ç ã
' Version 1.3 - April 10, 2013 - Find rgb and hex color values.
' Version 1.4 - June 7, 2013 - Suggest best color to replace rgb color values.
' Version 1.5 - December 2, 2013 - Find any extended ASCII characters.
Option Explicit
Dim strFile, objFSO, objFile, strText, objRE, objHeadings, objHeading
Dim strHeading, objList, objRE2, objRE3, objRE4, objNames, objName, strName
Dim strLeading, objTags, objTag, strTag, intCount, strHeading2
Dim k, blnName, blnSpan, blnEndName, blnEndSpan, blnBlank, blnHeading
Dim intIndex, strTemp, objRGBColors, objRGBColor, objHexColors, objHexColor
Dim strColor, arrColors(138, 3)
Const ForReading = 1
' Check for file or prompt.
' This file should be a copy of the Wiki article HTML.
If (Wscript.Arguments.Count = 0) Then
strFile = InputBox("Enter file name")
' Check if user canceled.
If (strFile = "") Then
Wscript.Quit
End If
Else
strFile = Wscript.Arguments(0)
End If
' Open the file.
Set objFSO = CreateObject("Scripting.FileSystemObject")
On Error Resume Next
Set objFile = objFSO.OpenTextFile(strFile, ForReading)
If (Err.Number <> 0) Then
Wscript.Echo "Unable to open file: " & strFile
Wscript.Echo "Error Number: " & Err.Number
Wscript.Echo "Description: " & Err.Description
Wscript.Quit
End If
On Error GoTo 0
' Populate array with the standard color names and their decimal RGB values.
arrColors(0, 0) = "Red"
arrColors(0, 1) = "255"
arrColors(0, 2) = "0"
arrColors(0, 3) = "0"
arrColors(1, 0) = "DarkRed"
arrColors(1, 1) = "139"
arrColors(1, 2) = "0"
arrColors(1, 3) = "0"
arrColors(2, 0) = "FireBrick"
arrColors(2, 1) = "178"
arrColors(2, 2) = "34"
arrColors(2, 3) = "34"
arrColors(3, 0) = "Crimson"
arrColors(3, 1) = "220"
arrColors(3, 2) = "20"
arrColors(3, 3) = "60"
arrColors(4, 0) = "IndianRed"
arrColors(4, 1) = "205"
arrColors(4, 2) = "92"
arrColors(4, 3) = "92"
arrColors(5, 0) = "LightCoral"
arrColors(5, 1) = "240"
arrColors(5, 2) = "128"
arrColors(5, 3) = "128"
arrColors(6, 0) = "DarkSalmon"
arrColors(6, 1) = "233"
arrColors(6, 2) = "150"
arrColors(6, 3) = "122"
arrColors(7, 0) = "Salmon"
arrColors(7, 1) = "250"
arrColors(7, 2) = "128"
arrColors(7, 3) = "114"
arrColors(8, 0) = "LightSalmon"
arrColors(8, 1) = "255"
arrColors(8, 2) = "160"
arrColors(8, 3) = "122"
arrColors(9, 0) = "MediumVioletRed"
arrColors(9, 1) = "199"
arrColors(9, 2) = "21"
arrColors(9, 3) = "133"
arrColors(10, 0) = "PaleVioletRed"
arrColors(10, 1) = "219"
arrColors(10, 2) = "112"
arrColors(10, 3) = "147"
arrColors(11, 0) = "DeepPink"
arrColors(11, 1) = "255"
arrColors(11, 2) = "20"
arrColors(11, 3) = "147"
arrColors(12, 0) = "HotPink"
arrColors(12, 1) = "255"
arrColors(12, 2) = "105"
arrColors(12, 3) = "180"
arrColors(13, 0) = "LightPink"
arrColors(13, 1) = "255"
arrColors(13, 2) = "182"
arrColors(13, 3) = "193"
arrColors(14, 0) = "Pink"
arrColors(14, 1) = "255"
arrColors(14, 2) = "192"
arrColors(14, 3) = "203"
arrColors(15, 0) = "OrangeRed"
arrColors(15, 1) = "255"
arrColors(15, 2) = "69"
arrColors(15, 3) = "0"
arrColors(16, 0) = "Tomato"
arrColors(16, 1) = "255"
arrColors(16, 2) = "99"
arrColors(16, 3) = "71"
arrColors(17, 0) = "Coral"
arrColors(17, 1) = "255"
arrColors(17, 2) = "127"
arrColors(17, 3) = "80"
arrColors(18, 0) = "DarkOrange"
arrColors(18, 1) = "255"
arrColors(18, 2) = "140"
arrColors(18, 3) = "0"
arrColors(19, 0) = "Orange"
arrColors(19, 1) = "255"
arrColors(19, 2) = "165"
arrColors(19, 3) = "0"
arrColors(20, 0) = "Gold"
arrColors(20, 1) = "255"
arrColors(20, 2) = "215"
arrColors(20, 3) = "0"
arrColors(21, 0) = "Yellow"
arrColors(21, 1) = "255"
arrColors(21, 2) = "255"
arrColors(21, 3) = "0"
arrColors(22, 0) = "LightYellow"
arrColors(22, 1) = "255"
arrColors(22, 2) = "255"
arrColors(22, 3) = "224"
arrColors(23, 0) = "LemonChiffon"
arrColors(23, 1) = "255"
arrColors(23, 2) = "250"
arrColors(23, 3) = "205"
arrColors(24, 0) = "LightGoldenrodYellow"
arrColors(24, 1) = "250"
arrColors(24, 2) = "250"
arrColors(24, 3) = "210"
arrColors(25, 0) = "PapayaWhip"
arrColors(25, 1) = "255"
arrColors(25, 2) = "239"
arrColors(25, 3) = "213"
arrColors(26, 0) = "Moccasin"
arrColors(26, 1) = "255"
arrColors(26, 2) = "228"
arrColors(26, 3) = "181"
arrColors(27, 0) = "PeachPuff"
arrColors(27, 1) = "255"
arrColors(27, 2) = "218"
arrColors(27, 3) = "185"
arrColors(28, 0) = "PaleGoldenrod"
arrColors(28, 1) = "238"
arrColors(28, 2) = "232"
arrColors(28, 3) = "170"
arrColors(29, 0) = "Khaki"
arrColors(29, 1) = "240"
arrColors(29, 2) = "230"
arrColors(29, 3) = "140"
arrColors(30, 0) = "DarkKhaki"
arrColors(30, 1) = "189"
arrColors(30, 2) = "183"
arrColors(30, 3) = "107"
arrColors(31, 0) = "CornSilk"
arrColors(31, 1) = "255"
arrColors(31, 2) = "248"
arrColors(31, 3) = "220"
arrColors(32, 0) = "BlanchedAlmond"
arrColors(32, 1) = "255"
arrColors(32, 2) = "235"
arrColors(32, 3) = "205"
arrColors(33, 0) = "Bisque"
arrColors(33, 1) = "255"
arrColors(33, 2) = "228"
arrColors(33, 3) = "196"
arrColors(34, 0) = "NavajoWhite"
arrColors(34, 1) = "255"
arrColors(34, 2) = "222"
arrColors(34, 3) = "173"
arrColors(35, 0) = "Wheat"
arrColors(35, 1) = "245"
arrColors(35, 2) = "222"
arrColors(35, 3) = "179"
arrColors(36, 0) = "BurlyWood"
arrColors(36, 1) = "222"
arrColors(36, 2) = "184"
arrColors(36, 3) = "135"
arrColors(37, 0) = "Tan"
arrColors(37, 1) = "210"
arrColors(37, 2) = "180"
arrColors(37, 3) = "140"
arrColors(38, 0) = "RosyBrown"
arrColors(38, 1) = "188"
arrColors(38, 2) = "143"
arrColors(38, 3) = "143"
arrColors(39, 0) = "SandyBrown"
arrColors(39, 1) = "244"
arrColors(39, 2) = "164"
arrColors(39, 3) = "96"
arrColors(40, 0) = "Goldenrod"
arrColors(40, 1) = "218"
arrColors(40, 2) = "165"
arrColors(40, 3) = "32"
arrColors(41, 0) = "DarkGoldenrod"
arrColors(41, 1) = "184"
arrColors(41, 2) = "134"
arrColors(41, 3) = "11"
arrColors(42, 0) = "Peru"
arrColors(42, 1) = "205"
arrColors(42, 2) = "133"
arrColors(42, 3) = "63"
arrColors(43, 0) = "Chocolate"
arrColors(43, 1) = "210"
arrColors(43, 2) = "105"
arrColors(43, 3) = "30"
arrColors(44, 0) = "SaddleBrown"
arrColors(44, 1) = "139"
arrColors(44, 2) = "69"
arrColors(44, 3) = "19"
arrColors(45, 0) = "Sienna"
arrColors(45, 1) = "160"
arrColors(45, 2) = "82"
arrColors(45, 3) = "45"
arrColors(46, 0) = "Brown"
arrColors(46, 1) = "165"
arrColors(46, 2) = "42"
arrColors(46, 3) = "42"
arrColors(47, 0) = "Maroon"
arrColors(47, 1) = "128"
arrColors(47, 2) = "0"
arrColors(47, 3) = "0"
arrColors(48, 0) = "DarkOliveGreen"
arrColors(48, 1) = "85"
arrColors(48, 2) = "107"
arrColors(48, 3) = "47"
arrColors(49, 0) = "Olive"
arrColors(49, 1) = "128"
arrColors(49, 2) = "128"
arrColors(49, 3) = "0"
arrColors(50, 0) = "OliveDrab"
arrColors(50, 1) = "107"
arrColors(50, 2) = "142"
arrColors(50, 3) = "35"
arrColors(51, 0) = "YellowGreen"
arrColors(51, 1) = "154"
arrColors(51, 2) = "205"
arrColors(51, 3) = "50"
arrColors(52, 0) = "LimeGreen"
arrColors(52, 1) = "50"
arrColors(52, 2) = "205"
arrColors(52, 3) = "50"
arrColors(53, 0) = "Lime"
arrColors(53, 1) = "0"
arrColors(53, 2) = "255"
arrColors(53, 3) = "0"
arrColors(54, 0) = "LawnGreen"
arrColors(54, 1) = "124"
arrColors(54, 2) = "252"
arrColors(54, 3) = "0"
arrColors(55, 0) = "Chartreuse"
arrColors(55, 1) = "127"
arrColors(55, 2) = "255"
arrColors(55, 3) = "0"
arrColors(56, 0) = "GreenYellow"
arrColors(56, 1) = "173"
arrColors(56, 2) = "255"
arrColors(56, 3) = "47"
arrColors(57, 0) = "SpringGreen"
arrColors(57, 1) = "0"
arrColors(57, 2) = "255"
arrColors(57, 3) = "127"
arrColors(58, 0) = "MediumSpringGreen"
arrColors(58, 1) = "0"
arrColors(58, 2) = "250"
arrColors(58, 3) = "154"
arrColors(59, 0) = "LightGreen"
arrColors(59, 1) = "144"
arrColors(59, 2) = "238"
arrColors(59, 3) = "144"
arrColors(60, 0) = "PaleGreen"
arrColors(60, 1) = "152"
arrColors(60, 2) = "251"
arrColors(60, 3) = "152"
arrColors(61, 0) = "DarkSeaGreen"
arrColors(61, 1) = "143"
arrColors(61, 2) = "188"
arrColors(61, 3) = "143"
arrColors(62, 0) = "MediumSeaGreen"
arrColors(62, 1) = "60"
arrColors(62, 2) = "179"
arrColors(62, 3) = "113"
arrColors(63, 0) = "SeaGreen"
arrColors(63, 1) = "46"
arrColors(63, 2) = "139"
arrColors(63, 3) = "87"
arrColors(64, 0) = "ForestGreen"
arrColors(64, 1) = "34"
arrColors(64, 2) = "139"
arrColors(64, 3) = "34"
arrColors(65, 0) = "Green"
arrColors(65, 1) = "0"
arrColors(65, 2) = "128"
arrColors(65, 3) = "0"
arrColors(66, 0) = "DarkGreen"
arrColors(66, 1) = "0"
arrColors(66, 2) = "100"
arrColors(66, 3) = "0"
arrColors(67, 0) = "MediumAquamarine"
arrColors(67, 1) = "102"
arrColors(67, 2) = "205"
arrColors(67, 3) = "170"
arrColors(68, 0) = "Aqua"
arrColors(68, 1) = "0"
arrColors(68, 2) = "255"
arrColors(68, 3) = "255"
arrColors(69, 0) = "Cyan"
arrColors(69, 1) = "0"
arrColors(69, 2) = "255"
arrColors(69, 3) = "255"
arrColors(70, 0) = "LightCyan"
arrColors(70, 1) = "224"
arrColors(70, 2) = "255"
arrColors(70, 3) = "255"
arrColors(71, 0) = "PaleTurquoise"
arrColors(71, 1) = "175"
arrColors(71, 2) = "238"
arrColors(71, 3) = "238"
arrColors(72, 0) = "Aquamarine"
arrColors(72, 1) = "127"
arrColors(72, 2) = "255"
arrColors(72, 3) = "212"
arrColors(73, 0) = "Turquoise"
arrColors(73, 1) = "64"
arrColors(73, 2) = "224"
arrColors(73, 3) = "208"
arrColors(74, 0) = "MediumTurquoise"
arrColors(74, 1) = "72"
arrColors(74, 2) = "209"
arrColors(74, 3) = "204"
arrColors(75, 0) = "DarkTurquoise"
arrColors(75, 1) = "0"
arrColors(75, 2) = "206"
arrColors(75, 3) = "209"
arrColors(76, 0) = "LightSeaGreen"
arrColors(76, 1) = "32"
arrColors(76, 2) = "178"
arrColors(76, 3) = "170"
arrColors(77, 0) = "CadetBlue"
arrColors(77, 1) = "95"
arrColors(77, 2) = "158"
arrColors(77, 3) = "160"
arrColors(78, 0) = "DarkCyan"
arrColors(78, 1) = "0"
arrColors(78, 2) = "139"
arrColors(78, 3) = "139"
arrColors(79, 0) = "Teal"
arrColors(79, 1) = "0"
arrColors(79, 2) = "128"
arrColors(79, 3) = "128"
arrColors(80, 0) = "LightSteelBlue"
arrColors(80, 1) = "176"
arrColors(80, 2) = "196"
arrColors(80, 3) = "222"
arrColors(81, 0) = "PowderBlue"
arrColors(81, 1) = "176"
arrColors(81, 2) = "224"
arrColors(81, 3) = "230"
arrColors(82, 0) = "LightBlue"
arrColors(82, 1) = "173"
arrColors(82, 2) = "216"
arrColors(82, 3) = "230"
arrColors(83, 0) = "SkyBlue"
arrColors(83, 1) = "135"
arrColors(83, 2) = "206"
arrColors(83, 3) = "235"
arrColors(84, 0) = "LightSkyBlue"
arrColors(84, 1) = "135"
arrColors(84, 2) = "206"
arrColors(84, 3) = "250"
arrColors(85, 0) = "DeepSkyBlue"
arrColors(85, 1) = "0"
arrColors(85, 2) = "191"
arrColors(85, 3) = "255"
arrColors(86, 0) = "DodgerBlue"
arrColors(86, 1) = "30"
arrColors(86, 2) = "144"
arrColors(86, 3) = "255"
arrColors(87, 0) = "CornflowerBlue"
arrColors(87, 1) = "100"
arrColors(87, 2) = "149"
arrColors(87, 3) = "237"
arrColors(88, 0) = "SteelBlue"
arrColors(88, 1) = "70"
arrColors(88, 2) = "130"
arrColors(88, 3) = "180"
arrColors(89, 0) = "RoyalBlue"
arrColors(89, 1) = "65"
arrColors(89, 2) = "105"
arrColors(89, 3) = "225"
arrColors(90, 0) = "Blue"
arrColors(90, 1) = "0"
arrColors(90, 2) = "0"
arrColors(90, 3) = "255"
arrColors(91, 0) = "MediumBlue"
arrColors(91, 1) = "0"
arrColors(91, 2) = "0"
arrColors(91, 3) = "205"
arrColors(92, 0) = "DarkBlue"
arrColors(92, 1) = "0"
arrColors(92, 2) = "0"
arrColors(92, 3) = "139"
arrColors(93, 0) = "Navy"
arrColors(93, 1) = "0"
arrColors(93, 2) = "0"
arrColors(93, 3) = "128"
arrColors(94, 0) = "MidnightBlue"
arrColors(94, 1) = "25"
arrColors(94, 2) = "25"
arrColors(94, 3) = "112"
arrColors(95, 0) = "Lavender"
arrColors(95, 1) = "230"
arrColors(95, 2) = "230"
arrColors(95, 3) = "250"
arrColors(96, 0) = "Thistle"
arrColors(96, 1) = "216"
arrColors(96, 2) = "191"
arrColors(96, 3) = "216"
arrColors(97, 0) = "Plum"
arrColors(97, 1) = "221"
arrColors(97, 2) = "160"
arrColors(97, 3) = "221"
arrColors(98, 0) = "Violet"
arrColors(98, 1) = "238"
arrColors(98, 2) = "130"
arrColors(98, 3) = "238"
arrColors(99, 0) = "Orchid"
arrColors(99, 1) = "218"
arrColors(99, 2) = "112"
arrColors(99, 3) = "214"
' Also called Fuchsia.
arrColors(100, 0) = "Magenta"
arrColors(100, 1) = "255"
arrColors(100, 2) = "0"
arrColors(100, 3) = "255"
arrColors(101, 0) = "MediumOrchid"
arrColors(101, 1) = "186"
arrColors(101, 2) = "85"
arrColors(101, 3) = "211"
arrColors(102, 0) = "MediumPurple"
arrColors(102, 1) = "147"
arrColors(102, 2) = "112"
arrColors(102, 3) = "219"
arrColors(103, 0) = "BlueViolet"
arrColors(103, 1) = "138"
arrColors(103, 2) = "43"
arrColors(103, 3) = "226"
arrColors(104, 0) = "DarkViolet"
arrColors(104, 1) = "148"
arrColors(104, 2) = "0"
arrColors(104, 3) = "211"
arrColors(105, 0) = "DarkOrchid"
arrColors(105, 1) = "153"
arrColors(105, 2) = "50"
arrColors(105, 3) = "204"
arrColors(106, 0) = "DarkMagenta"
arrColors(106, 1) = "139"
arrColors(106, 2) = "0"
arrColors(106, 3) = "139"
arrColors(107, 0) = "Purple"
arrColors(107, 1) = "128"
arrColors(107, 2) = "0"
arrColors(107, 3) = "128"
arrColors(108, 0) = "Indigo"
arrColors(108, 1) = "75"
arrColors(108, 2) = "0"
arrColors(108, 3) = "130"
arrColors(109, 0) = "DarkSlateBlue"
arrColors(109, 1) = "72"
arrColors(109, 2) = "61"
arrColors(109, 3) = "139"
arrColors(110, 0) = "SlateBlue"
arrColors(110, 1) = "106"
arrColors(110, 2) = "90"
arrColors(110, 3) = "205"
arrColors(111, 0) = "MediumSlateBlue"
arrColors(111, 1) = "123"
arrColors(111, 2) = "104"
arrColors(111, 3) = "238"
arrColors(112, 0) = "White"
arrColors(112, 1) = "255"
arrColors(112, 2) = "255"
arrColors(112, 3) = "255"
arrColors(113, 0) = "Snow"
arrColors(113, 1) = "255"
arrColors(113, 2) = "250"
arrColors(113, 3) = "250"
arrColors(114, 0) = "HoneyDew"
arrColors(114, 1) = "240"
arrColors(114, 2) = "255"
arrColors(114, 3) = "240"
arrColors(115, 0) = "MintCream"
arrColors(115, 1) = "245"
arrColors(115, 2) = "255"
arrColors(115, 3) = "250"
arrColors(116, 0) = "Azure"
arrColors(116, 1) = "240"
arrColors(116, 2) = "255"
arrColors(116, 3) = "255"
arrColors(117, 0) = "AliceBlue"
arrColors(117, 1) = "240"
arrColors(117, 2) = "248"
arrColors(117, 3) = "255"
arrColors(118, 0) = "GhostWhite"
arrColors(118, 1) = "248"
arrColors(118, 2) = "248"
arrColors(118, 3) = "255"
arrColors(119, 0) = "WhiteSmoke"
arrColors(119, 1) = "245"
arrColors(119, 2) = "245"
arrColors(119, 3) = "245"
arrColors(120, 0) = "Seashell"
arrColors(120, 1) = "255"
arrColors(120, 2) = "245"
arrColors(120, 3) = "238"
arrColors(121, 0) = "Beige"
arrColors(121, 1) = "245"
arrColors(121, 2) = "245"
arrColors(121, 3) = "220"
arrColors(122, 0) = "OldLace"
arrColors(122, 1) = "253"
arrColors(122, 2) = "245"
arrColors(122, 3) = "230"
arrColors(123, 0) = "FloralWhite"
arrColors(123, 1) = "255"
arrColors(123, 2) = "250"
arrColors(123, 3) = "240"
arrColors(124, 0) = "Ivory"
arrColors(124, 1) = "255"
arrColors(124, 2) = "255"
arrColors(124, 3) = "240"
arrColors(125, 0) = "AntiqueWhite"
arrColors(125, 1) = "250"
arrColors(125, 2) = "235"
arrColors(125, 3) = "215"
arrColors(126, 0) = "Linen"
arrColors(126, 1) = "250"
arrColors(126, 2) = "240"
arrColors(126, 3) = "230"
arrColors(127, 0) = "LavenderBlush"
arrColors(127, 1) = "255"
arrColors(127, 2) = "240"
arrColors(127, 3) = "245"
arrColors(128, 0) = "MistyRose"
arrColors(128, 1) = "255"
arrColors(128, 2) = "228"
arrColors(128, 3) = "225"
arrColors(129, 0) = "Gainsboro"
arrColors(129, 1) = "220"
arrColors(129, 2) = "220"
arrColors(129, 3) = "220"
arrColors(130, 0) = "LightGray"
arrColors(130, 1) = "211"
arrColors(130, 2) = "211"
arrColors(130, 3) = "211"
arrColors(131, 0) = "Silver"
arrColors(131, 1) = "192"
arrColors(131, 2) = "192"
arrColors(131, 3) = "192"
arrColors(132, 0) = "DarkGray"
arrColors(132, 1) = "169"
arrColors(132, 2) = "169"
arrColors(132, 3) = "169"
arrColors(133, 0) = "Gray"
arrColors(133, 1) = "128"
arrColors(133, 2) = "128"
arrColors(133, 3) = "128"
arrColors(134, 0) = "DimGray"
arrColors(134, 1) = "105"
arrColors(134, 2) = "105"
arrColors(134, 3) = "105"
arrColors(135, 0) = "LightSlateGray"
arrColors(135, 1) = "119"
arrColors(135, 2) = "136"
arrColors(135, 3) = "153"
arrColors(136, 0) = "SlateGray"
arrColors(136, 1) = "112"
arrColors(136, 2) = "128"
arrColors(136, 3) = "144"
arrColors(137, 0) = "DarkSlateGray"
arrColors(137, 1) = "47"
arrColors(137, 2) = "79"
arrColors(137, 3) = "79"
arrColors(138, 0) = "Black"
arrColors(138, 1) = "0"
arrColors(138, 2) = "0"
arrColors(138, 3) = "0"
' Set up dictionary object.
Set objList = CreateObject("Scripting.Dictionary")
objList.CompareMode = vbTextCompare
' Read the file contents. Convert to all lower case.
strText = LCase(objFile.ReadAll)
objFile.Close
Set objRE = New RegExp
objRE.Global = True
Set objRE2 = New RegExp
objRE2.Global = True
Set objRE3 = New RegExp
objRE3.Global = True
Set objRE4 = New RegExp
objRE4.Global = True
' Parse headings.
objRE.Pattern = "<h[0-9].*</h[0-9]>"
Set objHeadings = objRE.Execute(strText)
' Parse anchor name tags.
objRE2.Pattern = "<a name=.*></a>"
' Parse rgb color values.
objRE3.Pattern = "rgb\([0-9]+, [0-9]+, [0-9]+\)"
' Parse hex color values.
objRE4.Pattern = "#[0-9a-f]{6}"
' Read file for headings and anchor name tags.
Wscript.Echo "----- Analyze Headings"
intCount = 0
For Each objHeading In objHeadings
strHeading = objHeading.Value
' Find anchor name tags in the heading.
Set objNames = objRE2.Execute(strHeading)
For Each objName In objNames
strName = objName.Value
' Check leading character of the anchor name tag.
strLeading = Mid(strName, 10, 1)
If (IsNumeric(strLeading) = True) Then
Wscript.Echo "## Leading digit in anchor name tag: " & strHeading
intCount = intCount + 1
End If
' Check for embedded "0" characters in the anchor name tag.
If (InStr(strName, "0") > 0) Then
' Remove any duplicate <a name>...</a> anchor tags for readability.
intIndex = InStr(strName, "</a>")
strTemp = Left(strName, intIndex + 3)
' "0" characters are only a problem in the first <a name> tag.
If (InStr(strTemp, "0") > 0) Then
Wscript.Echo "## Embedded ""0"" in name tag: " _
& Replace(strHeading, strName, strTemp)
intCount = intCount + 1
End If
End If
If (Foreign(strName) = True) Then
Wscript.Echo "## Foreign character in anchor name tag: " & strHeading
intCount = intCount + 1
End If
' Check for duplicate anchor name tags.
If (objList.Exists(strName) = False) Then
objList.Add strName, True
Else
Wscript.Echo "## Duplicate anchor name tag: " & strHeading
intCount = intCount + 1
End If
Next
' Check for blank heading (no characters outside name or span tags).
blnName = False
blnSpan = False
blnEndName = False
blnEndSpan = False
blnHeading = True
blnBlank = True
' Ignore spaces when looking for blanks.
strHeading2 = Replace(strHeading, " ", "")
For k = 1 to Len(strHeading)
If (blnHeading = False) Then
If (Mid(strHeading2, k, 3) = "</h") Then
Exit For
End If
If (blnName = True) And (Mid(strHeading2, k, 1) = ">") Then
blnName = False
End If
If (Mid(strHeading2, k, 8) = "<a name=") Then
blnName = True
End If
If (blnSpan = True) And (Mid(strHeading2, k, 1) = ">") Then
blnSpan = False
End If
If (Mid(strHeading2, k, 12) = "<span style=") Then
blnSpan = True
End If
If (blnEndName = True) And (Mid(strHeading2, k, 1) = ">") Then
blnEndName = False
End If
If (Mid(strHeading2, k, 4) = "</a>") Then
blnEndName = True
End If
If (blnEndSpan = True) And (Mid(strHeading2, k, 1) = ">") Then
blnEndSpan = False
End If
If (Mid(strHeading2, k, 7) = "</span>") Then
blnEndSpan = True
End If
If (blnName = False) And (blnSpan = False) _
And (blnEndName = False) And (blnEndSpan = False) Then
If (Mid(strHeading2, k, 1) <> ">") Then
blnBlank = False
Exit For
End If
End If
End If
If (blnHeading = True) And (Mid(strHeading2, k, 1) = ">") Then
blnHeading = False
End If
Next
If (blnBlank = True) Then
Wscript.Echo "## Blank heading: " & strHeading
intCount = intCount + 1
End If
Next
Wscript.Echo "Number of problems in headings: " & CStr(intCount)
' Read all anchor name tags in the file.
Wscript.Echo "----- Analyze Anchor Name Tags"
intCount = 0
objList.RemoveAll
Set objTags = objRE2.Execute(strText)
For Each objTag In objTags
strTag = objTag.Value
' Check for duplicates.
If (objList.Exists(strTag) = False) Then
objList.Add strTag, True
Else
Wscript.Echo "## Duplicate anchor name tag: " & strTag
intCount = intCount + 1
End If
' Check for embedded "0" characters in the anchor name tag.
If (InStr(strTag, "0") > 0) Then
' Remove any duplicate <a name>...</a> anchor tags for readability.
intIndex = InStr(strTag, "</a>")
strTemp = Left(strTag, intIndex + 3)
' "0" characters are only a problem in the first <a name> tag.
If (InStr(strTemp, "0") > 0) Then
Wscript.Echo "## Embedded ""0"" in name tag: " & strTemp
intCount = intCount + 1
End If
End If
If (Foreign(strTag) = True) Then
' Remove any duplicate <a name>...</a> anchor tags for readability.
intIndex = InStr(strTag, "</a>")
strTemp = Left(strTag, intIndex + 3)
Wscript.Echo "## Foreign character in anchor name tag: " & strTemp
intCount = intCount + 1
End If
Next
Wscript.Echo "Number of problems in anchor name tags: " & CStr(intCount)
Wscript.Echo "----- Search for color values"
objList.RemoveAll
intCount = 0
' To select digits from RGB values.
objRE.Pattern = "[0-9]+"
Set objRGBColors = objRE3.Execute(strText)
For Each objRGBColor In objRGBColors
strColor = objRGBColor.Value
' Check for duplicates.
If (objList.Exists(strColor) = False) Then
objList.Add strColor, True
Wscript.Echo "## Found rgb color: " & strColor _
& " [best standard color: " & BestColor(strColor) & "]"
intCount = intCount + 1
End If
Next
objList.RemoveAll
Set objHexColors = objRE4.Execute(strText)
For Each objHexColor In objHexColors
strColor = objHexColor.Value
' Check for duplicates.
If (objList.Exists(strColor) = False) Then
objList.Add strColor, True
Wscript.Echo "## Found hex color value: " & UCase(strColor)
intCount = intCount + 1
End If
Next
Wscript.Echo "Total color values found: " & CStr(intCount)
Function BestColor(ByVal strRGBColor)
' Select best color for RGB values.
' The following must have global scope and be defined in the main
' program: objRE, arrColors
Dim objMatches, objMatch, k, lngMin, lngValue, intColor, arrValues(2)
Set objMatches = objRE.Execute(strRGBColor)
k = 0
For Each objMatch In objMatches
arrValues(k) = objMatch.Value
k = k + 1
Next
' Consider all of the standard colors.
lngMin = 3*255*255
For k = 0 To 138
' Calculate the distance between this standard color and the RGB value.
lngValue = (arrColors(k, 1) - arrValues(0))^2 _
+ (arrColors(k, 2) - arrValues(1))^2 _
+ (arrColors(k, 3) - arrValues(2))^2
' Keep track of the color with the smallest distance (least difference).
If (lngValue <= lngMin) Then
intColor = k
lngMin = lngValue
End If
Next
' Select the best standard color name.
BestColor = arrColors(intColor, 0)
End Function
Function Foreign(strValue)
' Function to detect foreign characters.
' Returns True if the input string contains any extended ASCII characters,
' otherwise returns False.
Dim k
Foreign = False
For k = 1 To Len(strValue)
If (Asc(Mid(strValue, k, 1)) > 127) Then
Foreign = True
Exit Function
End If
Next
End Function
' ParseWiki.vbs ' VBScript program to parse TechNet Wiki Article HTML for heading ' and anchor name tag problems. ' Script Author: Richard L. Mueller ' Version 1.0 - October 11, 2012 ' Version 1.1 - November 8, 2012 - Improve recognition of headings. ' Version 1.2 - February 15, 2012 - Find foreign characters. Find: é í ç ã ' Version 1.3 - April 10, 2013 - Find rgb and hex color values. ' Version 1.4 - June 7, 2013 - Suggest best color to replace rgb color values. ' Version 1.5 - December 2, 2013 - Find any extended ASCII characters. Option Explicit Dim strFile, objFSO, objFile, strText, objRE, objHeadings, objHeading Dim strHeading, objList, objRE2, objRE3, objRE4, objNames, objName, strName Dim strLeading, objTags, objTag, strTag, intCount, strHeading2 Dim k, blnName, blnSpan, blnEndName, blnEndSpan, blnBlank, blnHeading Dim intIndex, strTemp, objRGBColors, objRGBColor, objHexColors, objHexColor Dim strColor, arrColors(138, 3) Const ForReading = 1 ' Check for file or prompt. ' This file should be a copy of the Wiki article HTML. If (Wscript.Arguments.Count = 0) Then strFile = InputBox("Enter file name") ' Check if user canceled. If (strFile = "") Then Wscript.Quit End If Else strFile = Wscript.Arguments(0) End If ' Open the file. Set objFSO = CreateObject("Scripting.FileSystemObject") On Error Resume Next Set objFile = objFSO.OpenTextFile(strFile, ForReading) If (Err.Number <> 0) Then Wscript.Echo "Unable to open file: " & strFile Wscript.Echo "Error Number: " & Err.Number Wscript.Echo "Description: " & Err.Description Wscript.Quit End If On Error GoTo 0 ' Populate array with the standard color names and their decimal RGB values. arrColors(0, 0) = "Red" arrColors(0, 1) = "255" arrColors(0, 2) = "0" arrColors(0, 3) = "0" arrColors(1, 0) = "DarkRed" arrColors(1, 1) = "139" arrColors(1, 2) = "0" arrColors(1, 3) = "0" arrColors(2, 0) = "FireBrick" arrColors(2, 1) = "178" arrColors(2, 2) = "34" arrColors(2, 3) = "34" arrColors(3, 0) = "Crimson" arrColors(3, 1) = "220" arrColors(3, 2) = "20" arrColors(3, 3) = "60" arrColors(4, 0) = "IndianRed" arrColors(4, 1) = "205" arrColors(4, 2) = "92" arrColors(4, 3) = "92" arrColors(5, 0) = "LightCoral" arrColors(5, 1) = "240" arrColors(5, 2) = "128" arrColors(5, 3) = "128" arrColors(6, 0) = "DarkSalmon" arrColors(6, 1) = "233" arrColors(6, 2) = "150" arrColors(6, 3) = "122" arrColors(7, 0) = "Salmon" arrColors(7, 1) = "250" arrColors(7, 2) = "128" arrColors(7, 3) = "114" arrColors(8, 0) = "LightSalmon" arrColors(8, 1) = "255" arrColors(8, 2) = "160" arrColors(8, 3) = "122" arrColors(9, 0) = "MediumVioletRed" arrColors(9, 1) = "199" arrColors(9, 2) = "21" arrColors(9, 3) = "133" arrColors(10, 0) = "PaleVioletRed" arrColors(10, 1) = "219" arrColors(10, 2) = "112" arrColors(10, 3) = "147" arrColors(11, 0) = "DeepPink" arrColors(11, 1) = "255" arrColors(11, 2) = "20" arrColors(11, 3) = "147" arrColors(12, 0) = "HotPink" arrColors(12, 1) = "255" arrColors(12, 2) = "105" arrColors(12, 3) = "180" arrColors(13, 0) = "LightPink" arrColors(13, 1) = "255" arrColors(13, 2) = "182" arrColors(13, 3) = "193" arrColors(14, 0) = "Pink" arrColors(14, 1) = "255" arrColors(14, 2) = "192" arrColors(14, 3) = "203" arrColors(15, 0) = "OrangeRed" arrColors(15, 1) = "255" arrColors(15, 2) = "69" arrColors(15, 3) = "0" arrColors(16, 0) = "Tomato" arrColors(16, 1) = "255" arrColors(16, 2) = "99" arrColors(16, 3) = "71" arrColors(17, 0) = "Coral" arrColors(17, 1) = "255" arrColors(17, 2) = "127" arrColors(17, 3) = "80" arrColors(18, 0) = "DarkOrange" arrColors(18, 1) = "255" arrColors(18, 2) = "140" arrColors(18, 3) = "0" arrColors(19, 0) = "Orange" arrColors(19, 1) = "255" arrColors(19, 2) = "165" arrColors(19, 3) = "0" arrColors(20, 0) = "Gold" arrColors(20, 1) = "255" arrColors(20, 2) = "215" arrColors(20, 3) = "0" arrColors(21, 0) = "Yellow" arrColors(21, 1) = "255" arrColors(21, 2) = "255" arrColors(21, 3) = "0" arrColors(22, 0) = "LightYellow" arrColors(22, 1) = "255" arrColors(22, 2) = "255" arrColors(22, 3) = "224" arrColors(23, 0) = "LemonChiffon" arrColors(23, 1) = "255" arrColors(23, 2) = "250" arrColors(23, 3) = "205" arrColors(24, 0) = "LightGoldenrodYellow" arrColors(24, 1) = "250" arrColors(24, 2) = "250" arrColors(24, 3) = "210" arrColors(25, 0) = "PapayaWhip" arrColors(25, 1) = "255" arrColors(25, 2) = "239" arrColors(25, 3) = "213" arrColors(26, 0) = "Moccasin" arrColors(26, 1) = "255" arrColors(26, 2) = "228" arrColors(26, 3) = "181" arrColors(27, 0) = "PeachPuff" arrColors(27, 1) = "255" arrColors(27, 2) = "218" arrColors(27, 3) = "185" arrColors(28, 0) = "PaleGoldenrod" arrColors(28, 1) = "238" arrColors(28, 2) = "232" arrColors(28, 3) = "170" arrColors(29, 0) = "Khaki" arrColors(29, 1) = "240" arrColors(29, 2) = "230" arrColors(29, 3) = "140" arrColors(30, 0) = "DarkKhaki" arrColors(30, 1) = "189" arrColors(30, 2) = "183" arrColors(30, 3) = "107" arrColors(31, 0) = "CornSilk" arrColors(31, 1) = "255" arrColors(31, 2) = "248" arrColors(31, 3) = "220" arrColors(32, 0) = "BlanchedAlmond" arrColors(32, 1) = "255" arrColors(32, 2) = "235" arrColors(32, 3) = "205" arrColors(33, 0) = "Bisque" arrColors(33, 1) = "255" arrColors(33, 2) = "228" arrColors(33, 3) = "196" arrColors(34, 0) = "NavajoWhite" arrColors(34, 1) = "255" arrColors(34, 2) = "222" arrColors(34, 3) = "173" arrColors(35, 0) = "Wheat" arrColors(35, 1) = "245" arrColors(35, 2) = "222" arrColors(35, 3) = "179" arrColors(36, 0) = "BurlyWood" arrColors(36, 1) = "222" arrColors(36, 2) = "184" arrColors(36, 3) = "135" arrColors(37, 0) = "Tan" arrColors(37, 1) = "210" arrColors(37, 2) = "180" arrColors(37, 3) = "140" arrColors(38, 0) = "RosyBrown" arrColors(38, 1) = "188" arrColors(38, 2) = "143" arrColors(38, 3) = "143" arrColors(39, 0) = "SandyBrown" arrColors(39, 1) = "244" arrColors(39, 2) = "164" arrColors(39, 3) = "96" arrColors(40, 0) = "Goldenrod" arrColors(40, 1) = "218" arrColors(40, 2) = "165" arrColors(40, 3) = "32" arrColors(41, 0) = "DarkGoldenrod" arrColors(41, 1) = "184" arrColors(41, 2) = "134" arrColors(41, 3) = "11" arrColors(42, 0) = "Peru" arrColors(42, 1) = "205" arrColors(42, 2) = "133" arrColors(42, 3) = "63" arrColors(43, 0) = "Chocolate" arrColors(43, 1) = "210" arrColors(43, 2) = "105" arrColors(43, 3) = "30" arrColors(44, 0) = "SaddleBrown" arrColors(44, 1) = "139" arrColors(44, 2) = "69" arrColors(44, 3) = "19" arrColors(45, 0) = "Sienna" arrColors(45, 1) = "160" arrColors(45, 2) = "82" arrColors(45, 3) = "45" arrColors(46, 0) = "Brown" arrColors(46, 1) = "165" arrColors(46, 2) = "42" arrColors(46, 3) = "42" arrColors(47, 0) = "Maroon" arrColors(47, 1) = "128" arrColors(47, 2) = "0" arrColors(47, 3) = "0" arrColors(48, 0) = "DarkOliveGreen" arrColors(48, 1) = "85" arrColors(48, 2) = "107" arrColors(48, 3) = "47" arrColors(49, 0) = "Olive" arrColors(49, 1) = "128" arrColors(49, 2) = "128" arrColors(49, 3) = "0" arrColors(50, 0) = "OliveDrab" arrColors(50, 1) = "107" arrColors(50, 2) = "142" arrColors(50, 3) = "35" arrColors(51, 0) = "YellowGreen" arrColors(51, 1) = "154" arrColors(51, 2) = "205" arrColors(51, 3) = "50" arrColors(52, 0) = "LimeGreen" arrColors(52, 1) = "50" arrColors(52, 2) = "205" arrColors(52, 3) = "50" arrColors(53, 0) = "Lime" arrColors(53, 1) = "0" arrColors(53, 2) = "255" arrColors(53, 3) = "0" arrColors(54, 0) = "LawnGreen" arrColors(54, 1) = "124" arrColors(54, 2) = "252" arrColors(54, 3) = "0" arrColors(55, 0) = "Chartreuse" arrColors(55, 1) = "127" arrColors(55, 2) = "255" arrColors(55, 3) = "0" arrColors(56, 0) = "GreenYellow" arrColors(56, 1) = "173" arrColors(56, 2) = "255" arrColors(56, 3) = "47" arrColors(57, 0) = "SpringGreen" arrColors(57, 1) = "0" arrColors(57, 2) = "255" arrColors(57, 3) = "127" arrColors(58, 0) = "MediumSpringGreen" arrColors(58, 1) = "0" arrColors(58, 2) = "250" arrColors(58, 3) = "154" arrColors(59, 0) = "LightGreen" arrColors(59, 1) = "144" arrColors(59, 2) = "238" arrColors(59, 3) = "144" arrColors(60, 0) = "PaleGreen" arrColors(60, 1) = "152" arrColors(60, 2) = "251" arrColors(60, 3) = "152" arrColors(61, 0) = "DarkSeaGreen" arrColors(61, 1) = "143" arrColors(61, 2) = "188" arrColors(61, 3) = "143" arrColors(62, 0) = "MediumSeaGreen" arrColors(62, 1) = "60" arrColors(62, 2) = "179" arrColors(62, 3) = "113" arrColors(63, 0) = "SeaGreen" arrColors(63, 1) = "46" arrColors(63, 2) = "139" arrColors(63, 3) = "87" arrColors(64, 0) = "ForestGreen" arrColors(64, 1) = "34" arrColors(64, 2) = "139" arrColors(64, 3) = "34" arrColors(65, 0) = "Green" arrColors(65, 1) = "0" arrColors(65, 2) = "128" arrColors(65, 3) = "0" arrColors(66, 0) = "DarkGreen" arrColors(66, 1) = "0" arrColors(66, 2) = "100" arrColors(66, 3) = "0" arrColors(67, 0) = "MediumAquamarine" arrColors(67, 1) = "102" arrColors(67, 2) = "205" arrColors(67, 3) = "170" arrColors(68, 0) = "Aqua" arrColors(68, 1) = "0" arrColors(68, 2) = "255" arrColors(68, 3) = "255" arrColors(69, 0) = "Cyan" arrColors(69, 1) = "0" arrColors(69, 2) = "255" arrColors(69, 3) = "255" arrColors(70, 0) = "LightCyan" arrColors(70, 1) = "224" arrColors(70, 2) = "255" arrColors(70, 3) = "255" arrColors(71, 0) = "PaleTurquoise" arrColors(71, 1) = "175" arrColors(71, 2) = "238" arrColors(71, 3) = "238" arrColors(72, 0) = "Aquamarine" arrColors(72, 1) = "127" arrColors(72, 2) = "255" arrColors(72, 3) = "212" arrColors(73, 0) = "Turquoise" arrColors(73, 1) = "64" arrColors(73, 2) = "224" arrColors(73, 3) = "208" arrColors(74, 0) = "MediumTurquoise" arrColors(74, 1) = "72" arrColors(74, 2) = "209" arrColors(74, 3) = "204" arrColors(75, 0) = "DarkTurquoise" arrColors(75, 1) = "0" arrColors(75, 2) = "206" arrColors(75, 3) = "209" arrColors(76, 0) = "LightSeaGreen" arrColors(76, 1) = "32" arrColors(76, 2) = "178" arrColors(76, 3) = "170" arrColors(77, 0) = "CadetBlue" arrColors(77, 1) = "95" arrColors(77, 2) = "158" arrColors(77, 3) = "160" arrColors(78, 0) = "DarkCyan" arrColors(78, 1) = "0" arrColors(78, 2) = "139" arrColors(78, 3) = "139" arrColors(79, 0) = "Teal" arrColors(79, 1) = "0" arrColors(79, 2) = "128" arrColors(79, 3) = "128" arrColors(80, 0) = "LightSteelBlue" arrColors(80, 1) = "176" arrColors(80, 2) = "196" arrColors(80, 3) = "222" arrColors(81, 0) = "PowderBlue" arrColors(81, 1) = "176" arrColors(81, 2) = "224" arrColors(81, 3) = "230" arrColors(82, 0) = "LightBlue" arrColors(82, 1) = "173" arrColors(82, 2) = "216" arrColors(82, 3) = "230" arrColors(83, 0) = "SkyBlue" arrColors(83, 1) = "135" arrColors(83, 2) = "206" arrColors(83, 3) = "235" arrColors(84, 0) = "LightSkyBlue" arrColors(84, 1) = "135" arrColors(84, 2) = "206" arrColors(84, 3) = "250" arrColors(85, 0) = "DeepSkyBlue" arrColors(85, 1) = "0" arrColors(85, 2) = "191" arrColors(85, 3) = "255" arrColors(86, 0) = "DodgerBlue" arrColors(86, 1) = "30" arrColors(86, 2) = "144" arrColors(86, 3) = "255" arrColors(87, 0) = "CornflowerBlue" arrColors(87, 1) = "100" arrColors(87, 2) = "149" arrColors(87, 3) = "237" arrColors(88, 0) = "SteelBlue" arrColors(88, 1) = "70" arrColors(88, 2) = "130" arrColors(88, 3) = "180" arrColors(89, 0) = "RoyalBlue" arrColors(89, 1) = "65" arrColors(89, 2) = "105" arrColors(89, 3) = "225" arrColors(90, 0) = "Blue" arrColors(90, 1) = "0" arrColors(90, 2) = "0" arrColors(90, 3) = "255" arrColors(91, 0) = "MediumBlue" arrColors(91, 1) = "0" arrColors(91, 2) = "0" arrColors(91, 3) = "205" arrColors(92, 0) = "DarkBlue" arrColors(92, 1) = "0" arrColors(92, 2) = "0" arrColors(92, 3) = "139" arrColors(93, 0) = "Navy" arrColors(93, 1) = "0" arrColors(93, 2) = "0" arrColors(93, 3) = "128" arrColors(94, 0) = "MidnightBlue" arrColors(94, 1) = "25" arrColors(94, 2) = "25" arrColors(94, 3) = "112" arrColors(95, 0) = "Lavender" arrColors(95, 1) = "230" arrColors(95, 2) = "230" arrColors(95, 3) = "250" arrColors(96, 0) = "Thistle" arrColors(96, 1) = "216" arrColors(96, 2) = "191" arrColors(96, 3) = "216" arrColors(97, 0) = "Plum" arrColors(97, 1) = "221" arrColors(97, 2) = "160" arrColors(97, 3) = "221" arrColors(98, 0) = "Violet" arrColors(98, 1) = "238" arrColors(98, 2) = "130" arrColors(98, 3) = "238" arrColors(99, 0) = "Orchid" arrColors(99, 1) = "218" arrColors(99, 2) = "112" arrColors(99, 3) = "214" ' Also called Fuchsia. arrColors(100, 0) = "Magenta" arrColors(100, 1) = "255" arrColors(100, 2) = "0" arrColors(100, 3) = "255" arrColors(101, 0) = "MediumOrchid" arrColors(101, 1) = "186" arrColors(101, 2) = "85" arrColors(101, 3) = "211" arrColors(102, 0) = "MediumPurple" arrColors(102, 1) = "147" arrColors(102, 2) = "112" arrColors(102, 3) = "219" arrColors(103, 0) = "BlueViolet" arrColors(103, 1) = "138" arrColors(103, 2) = "43" arrColors(103, 3) = "226" arrColors(104, 0) = "DarkViolet" arrColors(104, 1) = "148" arrColors(104, 2) = "0" arrColors(104, 3) = "211" arrColors(105, 0) = "DarkOrchid" arrColors(105, 1) = "153" arrColors(105, 2) = "50" arrColors(105, 3) = "204" arrColors(106, 0) = "DarkMagenta" arrColors(106, 1) = "139" arrColors(106, 2) = "0" arrColors(106, 3) = "139" arrColors(107, 0) = "Purple" arrColors(107, 1) = "128" arrColors(107, 2) = "0" arrColors(107, 3) = "128" arrColors(108, 0) = "Indigo" arrColors(108, 1) = "75" arrColors(108, 2) = "0" arrColors(108, 3) = "130" arrColors(109, 0) = "DarkSlateBlue" arrColors(109, 1) = "72" arrColors(109, 2) = "61" arrColors(109, 3) = "139" arrColors(110, 0) = "SlateBlue" arrColors(110, 1) = "106" arrColors(110, 2) = "90" arrColors(110, 3) = "205" arrColors(111, 0) = "MediumSlateBlue" arrColors(111, 1) = "123" arrColors(111, 2) = "104" arrColors(111, 3) = "238" arrColors(112, 0) = "White" arrColors(112, 1) = "255" arrColors(112, 2) = "255" arrColors(112, 3) = "255" arrColors(113, 0) = "Snow" arrColors(113, 1) = "255" arrColors(113, 2) = "250" arrColors(113, 3) = "250" arrColors(114, 0) = "HoneyDew" arrColors(114, 1) = "240" arrColors(114, 2) = "255" arrColors(114, 3) = "240" arrColors(115, 0) = "MintCream" arrColors(115, 1) = "245" arrColors(115, 2) = "255" arrColors(115, 3) = "250" arrColors(116, 0) = "Azure" arrColors(116, 1) = "240" arrColors(116, 2) = "255" arrColors(116, 3) = "255" arrColors(117, 0) = "AliceBlue" arrColors(117, 1) = "240" arrColors(117, 2) = "248" arrColors(117, 3) = "255" arrColors(118, 0) = "GhostWhite" arrColors(118, 1) = "248" arrColors(118, 2) = "248" arrColors(118, 3) = "255" arrColors(119, 0) = "WhiteSmoke" arrColors(119, 1) = "245" arrColors(119, 2) = "245" arrColors(119, 3) = "245" arrColors(120, 0) = "Seashell" arrColors(120, 1) = "255" arrColors(120, 2) = "245" arrColors(120, 3) = "238" arrColors(121, 0) = "Beige" arrColors(121, 1) = "245" arrColors(121, 2) = "245" arrColors(121, 3) = "220" arrColors(122, 0) = "OldLace" arrColors(122, 1) = "253" arrColors(122, 2) = "245" arrColors(122, 3) = "230" arrColors(123, 0) = "FloralWhite" arrColors(123, 1) = "255" arrColors(123, 2) = "250" arrColors(123, 3) = "240" arrColors(124, 0) = "Ivory" arrColors(124, 1) = "255" arrColors(124, 2) = "255" arrColors(124, 3) = "240" arrColors(125, 0) = "AntiqueWhite" arrColors(125, 1) = "250" arrColors(125, 2) = "235" arrColors(125, 3) = "215" arrColors(126, 0) = "Linen" arrColors(126, 1) = "250" arrColors(126, 2) = "240" arrColors(126, 3) = "230" arrColors(127, 0) = "LavenderBlush" arrColors(127, 1) = "255" arrColors(127, 2) = "240" arrColors(127, 3) = "245" arrColors(128, 0) = "MistyRose" arrColors(128, 1) = "255" arrColors(128, 2) = "228" arrColors(128, 3) = "225" arrColors(129, 0) = "Gainsboro" arrColors(129, 1) = "220" arrColors(129, 2) = "220" arrColors(129, 3) = "220" arrColors(130, 0) = "LightGray" arrColors(130, 1) = "211" arrColors(130, 2) = "211" arrColors(130, 3) = "211" arrColors(131, 0) = "Silver" arrColors(131, 1) = "192" arrColors(131, 2) = "192" arrColors(131, 3) = "192" arrColors(132, 0) = "DarkGray" arrColors(132, 1) = "169" arrColors(132, 2) = "169" arrColors(132, 3) = "169" arrColors(133, 0) = "Gray" arrColors(133, 1) = "128" arrColors(133, 2) = "128" arrColors(133, 3) = "128" arrColors(134, 0) = "DimGray" arrColors(134, 1) = "105" arrColors(134, 2) = "105" arrColors(134, 3) = "105" arrColors(135, 0) = "LightSlateGray" arrColors(135, 1) = "119" arrColors(135, 2) = "136" arrColors(135, 3) = "153" arrColors(136, 0) = "SlateGray" arrColors(136, 1) = "112" arrColors(136, 2) = "128" arrColors(136, 3) = "144" arrColors(137, 0) = "DarkSlateGray" arrColors(137, 1) = "47" arrColors(137, 2) = "79" arrColors(137, 3) = "79" arrColors(138, 0) = "Black" arrColors(138, 1) = "0" arrColors(138, 2) = "0" arrColors(138, 3) = "0" ' Set up dictionary object. Set objList = CreateObject("Scripting.Dictionary") objList.CompareMode = vbTextCompare ' Read the file contents. Convert to all lower case. strText = LCase(objFile.ReadAll) objFile.Close Set objRE = New RegExp objRE.Global = True Set objRE2 = New RegExp objRE2.Global = True Set objRE3 = New RegExp objRE3.Global = True Set objRE4 = New RegExp objRE4.Global = True ' Parse headings. objRE.Pattern = "<h[0-9].*</h[0-9]>" Set objHeadings = objRE.Execute(strText) ' Parse anchor name tags. objRE2.Pattern = "<a name=.*></a>" ' Parse rgb color values. objRE3.Pattern = "rgb\([0-9]+, [0-9]+, [0-9]+\)" ' Parse hex color values. objRE4.Pattern = "#[0-9a-f]{6}" ' Read file for headings and anchor name tags. Wscript.Echo "----- Analyze Headings" intCount = 0 For Each objHeading In objHeadings strHeading = objHeading.Value ' Find anchor name tags in the heading. Set objNames = objRE2.Execute(strHeading) For Each objName In objNames strName = objName.Value ' Check leading character of the anchor name tag. strLeading = Mid(strName, 10, 1) If (IsNumeric(strLeading) = True) Then Wscript.Echo "## Leading digit in anchor name tag: " & strHeading intCount = intCount + 1 End If ' Check for embedded "0" characters in the anchor name tag. If (InStr(strName, "0") > 0) Then ' Remove any duplicate <a name>...</a> anchor tags for readability. intIndex = InStr(strName, "</a>") strTemp = Left(strName, intIndex + 3) ' "0" characters are only a problem in the first <a name> tag. If (InStr(strTemp, "0") > 0) Then Wscript.Echo "## Embedded ""0"" in name tag: " _ & Replace(strHeading, strName, strTemp) intCount = intCount + 1 End If End If If (Foreign(strName) = True) Then Wscript.Echo "## Foreign character in anchor name tag: " & strHeading intCount = intCount + 1 End If ' Check for duplicate anchor name tags. If (objList.Exists(strName) = False) Then objList.Add strName, True Else Wscript.Echo "## Duplicate anchor name tag: " & strHeading intCount = intCount + 1 End If Next ' Check for blank heading (no characters outside name or span tags). blnName = False blnSpan = False blnEndName = False blnEndSpan = False blnHeading = True blnBlank = True ' Ignore spaces when looking for blanks. strHeading2 = Replace(strHeading, " ", "") For k = 1 to Len(strHeading) If (blnHeading = False) Then If (Mid(strHeading2, k, 3) = "</h") Then Exit For End If If (blnName = True) And (Mid(strHeading2, k, 1) = ">") Then blnName = False End If If (Mid(strHeading2, k, 8) = "<a name=") Then blnName = True End If If (blnSpan = True) And (Mid(strHeading2, k, 1) = ">") Then blnSpan = False End If If (Mid(strHeading2, k, 12) = "<span style=") Then blnSpan = True End If If (blnEndName = True) And (Mid(strHeading2, k, 1) = ">") Then blnEndName = False End If If (Mid(strHeading2, k, 4) = "</a>") Then blnEndName = True End If If (blnEndSpan = True) And (Mid(strHeading2, k, 1) = ">") Then blnEndSpan = False End If If (Mid(strHeading2, k, 7) = "</span>") Then blnEndSpan = True End If If (blnName = False) And (blnSpan = False) _ And (blnEndName = False) And (blnEndSpan = False) Then If (Mid(strHeading2, k, 1) <> ">") Then blnBlank = False Exit For End If End If End If If (blnHeading = True) And (Mid(strHeading2, k, 1) = ">") Then blnHeading = False End If Next If (blnBlank = True) Then Wscript.Echo "## Blank heading: " & strHeading intCount = intCount + 1 End If Next Wscript.Echo "Number of problems in headings: " & CStr(intCount) ' Read all anchor name tags in the file. Wscript.Echo "----- Analyze Anchor Name Tags" intCount = 0 objList.RemoveAll Set objTags = objRE2.Execute(strText) For Each objTag In objTags strTag = objTag.Value ' Check for duplicates. If (objList.Exists(strTag) = False) Then objList.Add strTag, True Else Wscript.Echo "## Duplicate anchor name tag: " & strTag intCount = intCount + 1 End If ' Check for embedded "0" characters in the anchor name tag. If (InStr(strTag, "0") > 0) Then ' Remove any duplicate <a name>...</a> anchor tags for readability. intIndex = InStr(strTag, "</a>") strTemp = Left(strTag, intIndex + 3) ' "0" characters are only a problem in the first <a name> tag. If (InStr(strTemp, "0") > 0) Then Wscript.Echo "## Embedded ""0"" in name tag: " & strTemp intCount = intCount + 1 End If End If If (Foreign(strTag) = True) Then ' Remove any duplicate <a name>...</a> anchor tags for readability. intIndex = InStr(strTag, "</a>") strTemp = Left(strTag, intIndex + 3) Wscript.Echo "## Foreign character in anchor name tag: " & strTemp intCount = intCount + 1 End If Next Wscript.Echo "Number of problems in anchor name tags: " & CStr(intCount) Wscript.Echo "----- Search for color values" objList.RemoveAll intCount = 0 ' To select digits from RGB values. objRE.Pattern = "[0-9]+" Set objRGBColors = objRE3.Execute(strText) For Each objRGBColor In objRGBColors strColor = objRGBColor.Value ' Check for duplicates. If (objList.Exists(strColor) = False) Then objList.Add strColor, True Wscript.Echo "## Found rgb color: " & strColor _ & " [best standard color: " & BestColor(strColor) & "]" intCount = intCount + 1 End If Next objList.RemoveAll Set objHexColors = objRE4.Execute(strText) For Each objHexColor In objHexColors strColor = objHexColor.Value ' Check for duplicates. If (objList.Exists(strColor) = False) Then objList.Add strColor, True Wscript.Echo "## Found hex color value: " & UCase(strColor) intCount = intCount + 1 End If Next Wscript.Echo "Total color values found: " & CStr(intCount) Function BestColor(ByVal strRGBColor) ' Select best color for RGB values. ' The following must have global scope and be defined in the main ' program: objRE, arrColors Dim objMatches, objMatch, k, lngMin, lngValue, intColor, arrValues(2) Set objMatches = objRE.Execute(strRGBColor) k = 0 For Each objMatch In objMatches arrValues(k) = objMatch.Value k = k + 1 Next ' Consider all of the standard colors. lngMin = 3*255*255 For k = 0 To 138 ' Calculate the distance between this standard color and the RGB value. lngValue = (arrColors(k, 1) - arrValues(0))^2 _ + (arrColors(k, 2) - arrValues(1))^2 _ + (arrColors(k, 3) - arrValues(2))^2 ' Keep track of the color with the smallest distance (least difference). If (lngValue <= lngMin) Then intColor = k lngMin = lngValue End If Next ' Select the best standard color name. BestColor = arrColors(intColor, 0) End Function Function Foreign(strValue) ' Function to detect foreign characters. ' Returns True if the input string contains any extended ASCII characters, ' otherwise returns False. Dim k Foreign = False For k = 1 To Len(strValue) If (Asc(Mid(strValue, k, 1)) > 127) Then Foreign = True Exit Function End If Next End Function