Quiz formats compared

 

I wrote a server-based application in ASP/VBScript to create a quiz file format which can be imported into BlackBoard starting form a simpler quiz file format which is easy to create and edit in a text editor, such as Notepad.

I then wanted to compare the two formats and make recommendations. Blackboard's XML format (as are XML files in general) massively over coded - over engineered.

My recommendation is that Blackboard adapt the originating format as the final file format and work from that type of file rather than the hideously over coded XML file currently used.

For the purposes of this example I am going to look only at a single "Fill In The Blanks" (FIB) question.

 

My Originating File Format - 1 question = 178 bytes

I devised this format based on various such formats I've used over the decades for printer drivers (early) to initialization files and configuration files. They are very compact and lightweight. Better still they are very robust. The just work, so to speak. Flaws are ignored.

FIB
The data units within each record are [fields] - single units of information such as a first name, a last name, address line one, address line two, city, state and so forth.

Size: 178 bytes - 6.3 percent of the XML file weight

You can see a full set of file-format examples here: http://www.artfuldancer.com/lessons/BBconvert/
as well as try this yourself.

 

The Intermediate file format which BB will accept as an import - 1 question = 191 bytes

I use my convertor to parse the file format (shown above) into this intermediate file format (the line below). This is then usable as an import file for Blackboard. Because you can't see a "tab" character except as spaces I've substituted the word "[TAB]" in Italics.

This will probably "line wrap" in your browser. In the actual text file the blue text directly below is one line only.

FIB [TAB] The data units within each record are _________ - single units of information such as a first name, a last name, address line one, address line two, city, state and so forth. [TAB] fields

Size: 191 Bytes - 6.8 percent of the XML file weight

 

The Blackboard XML format - 1 question = 2,810 bytes

Now comes the huge and complicated XML format which I got from Blackboard as a ZIP-file download to my computer. The file is a text file but has no line breaks of any kinds. Machines don't need them, people do. This file was created by a machine from a database for a machine to parse.

To show the structure I spent a little time putting "newline" characters in the file so that it is human readable. I could also have put in hierarchical indentations ("pretty formatting") but decided that might be less clear. I did put in extra lines between some of the structual areas. Much as with HTML tags are arranged in pairs (normally) with a starting <tag> and an ending </tag> enclosing content between them. The starting tag can have any number of "attributes" (specifications) just after the tag-name in any order. The tags have the same label but the ending tag has a slash "/" just after the left-angle bracket. Some tags are self-terminating and contain a slash at the end of the single tag - such as <singletag />

There is a lot more to the format and the file starting with a header section in the file. Further, there is an entire set of files which go together including a separate header file. To make this short and handy as an example I am concentrating on one question and comparing the number of bytes in the file consumed by the question text.

The tag code below defines the question shown above in a single line. I put the original elements from the text files in boldface blue. All the rest is over engineering (over coding) - a lot.

 

<item maxattempts="0">

<itemmetadata>
<bbmd_asi_object_id>_3162534_1</bbmd_asi_object_id>
<bbmd_asitype>Item</bbmd_asitype>
<bbmd_assessmenttype>Pool</bbmd_assessmenttype>
<bbmd_sectiontype>Subsection</bbmd_sectiontype>
<bbmd_questiontype>Fill in the Blank</bbmd_questiontype>
<bbmd_is_from_cartridge>false</bbmd_is_from_cartridge>
<bbmd_is_disabled>false</bbmd_is_disabled>
<bbmd_negative_points_ind>N</bbmd_negative_points_ind>
<bbmd_canvas_fullcrdt_ind>false</bbmd_canvas_fullcrdt_ind>
<bbmd_all_fullcredit_ind>false</bbmd_all_fullcredit_ind>
<bbmd_numbertype>none</bbmd_numbertype>
<bbmd_partialcredit></bbmd_partialcredit>
<bbmd_orientationtype>vertical</bbmd_orientationtype>
<bbmd_is_extracredit>false</bbmd_is_extracredit>
<qmd_absolutescore_max>10.0</qmd_absolutescore_max>
<qmd_weighting>0.0</qmd_weighting>
<qmd_instructornotes></qmd_instructornotes>
</itemmetadata>

<presentation>

<flow class="Block">
<flow class="QUESTION_BLOCK">
<flow class="FORMATTED_TEXT_BLOCK">
<material>
<mat_extension>
<mat_formattedtext type="SMART_TEXT">
The data units within each record are ________ - single units of information such as a first name, a last name, address line one, address line two, city, state and so forth.
</mat_formattedtext>
</mat_extension>
</material>
</flow>
</flow>

<flow class="RESPONSE_BLOCK">
<response_str ident="response" rcardinality="Single" rtiming="No">
<render_fib charset="us-ascii" encoding="UTF_8" rows="1" columns="127" maxchars="0" prompt="Box" fibtype="String" minnumber="0" maxnumber="0"/>
</response_str>
</flow>
</flow>

</presentation>

<resprocessing scoremodel="SumOfScores">

<outcomes>
<decvar varname="SCORE" vartype="Decimal" defaultval="0.0" minvalue="0.0" maxvalue="10.0"/>
</outcomes>

<respcondition title="386c324ac927411f85b401c1ee0d5c3e">

<conditionvar>
<varequal respident="response" case="No">fields</varequal>
</conditionvar>

<displayfeedback linkrefid="correct" feedbacktype="Response"/>
<displayfeedback linkrefid="386c324ac927411f85b401c1ee0d5c3e" feedbacktype="Response"/>

</respcondition>

<respcondition title="incorrect">
<conditionvar>
<other/>
</conditionvar>
<setvar variablename="SCORE" action="Set">0.0</setvar>
<displayfeedback linkrefid="incorrect" feedbacktype="Response"/>
</respcondition>

</resprocessing>

<itemfeedback ident="correct" view="All">
<flow_mat class="Block"/>
</itemfeedback>
<itemfeedback ident="incorrect" view="All">
<flow_mat class="Block"/>
</itemfeedback>
<itemfeedback ident="386c324ac927411f85b401c1ee0d5c3e" view="All">
<solution view="All" feedbackstyle="Complete">
<solutionmaterial>
<flow_mat class="Block"/>
</solutionmaterial>
</solution>
</itemfeedback>

</item>

 

Size: 2,810 bytes - - - from 11.86 to 15.79 times the size of the same code in the simpler formats shown here

 

NOTE: in the actual file there are no line breaks of any kind. Everything is run together like these three questions copied and pasted from the middle of the file. Essentially one very long line. Remember, this is for a machine to process and is not intended for a human to edit. You may see some lines which seem to have line breaks. That is not a line break in the file, only a break in the way your browser displays the text and the way it may select a space character to display as a line break.

<item maxattempts="0"><itemmetadata><bbmd_asi_object_id>_3162535_1</bbmd_asi_object_id><bbmd_asitype>Item</bbmd_asitype><bbmd_assessmenttype>Pool</bbmd_assessmenttype><bbmd_sectiontype>Subsection</bbmd_sectiontype><bbmd_questiontype>Fill in the Blank</bbmd_questiontype><bbmd_is_from_cartridge>false</bbmd_is_from_cartridge><bbmd_is_disabled>false</bbmd_is_disabled><bbmd_negative_points_ind>N</bbmd_negative_points_ind><bbmd_canvas_fullcrdt_ind>false</bbmd_canvas_fullcrdt_ind><bbmd_all_fullcredit_ind>false</bbmd_all_fullcredit_ind><bbmd_numbertype>none</bbmd_numbertype><bbmd_partialcredit></bbmd_partialcredit><bbmd_orientationtype>vertical</bbmd_orientationtype><bbmd_is_extracredit>false</bbmd_is_extracredit><qmd_absolutescore_max>10.0</qmd_absolutescore_max><qmd_weighting>0.0</qmd_weighting><qmd_instructornotes></qmd_instructornotes></itemmetadata><presentation><flow class="Block"><flow class="QUESTION_BLOCK"><flow class="FORMATTED_TEXT_BLOCK"><material><mat_extension><mat_formattedtext type="SMART_TEXT">A ______________ is the method we use to ask questions of the information in our database.</mat_formattedtext></mat_extension></material></flow></flow><flow class="RESPONSE_BLOCK"><response_str ident="response" rcardinality="Single" rtiming="No"><render_fib charset="us-ascii" encoding="UTF_8" rows="1" columns="127" maxchars="0" prompt="Box" fibtype="String" minnumber="0" maxnumber="0"/></response_str></flow></flow></presentation><resprocessing scoremodel="SumOfScores"><outcomes><decvar varname="SCORE" vartype="Decimal" defaultval="0.0" minvalue="0.0" maxvalue="10.0"/></outcomes><respcondition title="06f4bff3c51241ec9ebb5536b7fc52d6"><conditionvar><varequal respident="response" case="No">query</varequal></conditionvar><displayfeedback linkrefid="correct" feedbacktype="Response"/><displayfeedback linkrefid="06f4bff3c51241ec9ebb5536b7fc52d6" feedbacktype="Response"/></respcondition><respcondition title="incorrect"><conditionvar><other/></conditionvar><setvar variablename="SCORE" action="Set">0.0</setvar><displayfeedback linkrefid="incorrect" feedbacktype="Response"/></respcondition></resprocessing><itemfeedback ident="correct" view="All"><flow_mat class="Block"/></itemfeedback><itemfeedback ident="incorrect" view="All"><flow_mat class="Block"/></itemfeedback><itemfeedback ident="06f4bff3c51241ec9ebb5536b7fc52d6" view="All"><solution view="All" feedbackstyle="Complete"><solutionmaterial><flow_mat class="Block"/></solutionmaterial></solution></itemfeedback></item><item maxattempts="0"><itemmetadata><bbmd_asi_object_id>_3162536_1</bbmd_asi_object_id><bbmd_asitype>Item</bbmd_asitype><bbmd_assessmenttype>Pool</bbmd_assessmenttype><bbmd_sectiontype>Subsection</bbmd_sectiontype><bbmd_questiontype>Fill in the Blank</bbmd_questiontype><bbmd_is_from_cartridge>false</bbmd_is_from_cartridge><bbmd_is_disabled>false</bbmd_is_disabled><bbmd_negative_points_ind>N</bbmd_negative_points_ind><bbmd_canvas_fullcrdt_ind>false</bbmd_canvas_fullcrdt_ind><bbmd_all_fullcredit_ind>false</bbmd_all_fullcredit_ind><bbmd_numbertype>none</bbmd_numbertype><bbmd_partialcredit></bbmd_partialcredit><bbmd_orientationtype>vertical</bbmd_orientationtype><bbmd_is_extracredit>false</bbmd_is_extracredit><qmd_absolutescore_max>10.0</qmd_absolutescore_max><qmd_weighting>0.0</qmd_weighting><qmd_instructornotes></qmd_instructornotes></itemmetadata><presentation><flow class="Block"><flow class="QUESTION_BLOCK"><flow class="FORMATTED_TEXT_BLOCK"><material><mat_extension><mat_formattedtext type="SMART_TEXT">Queries allow you to set up specially formatted questions for the computer using a language called ______________ (pronounced SEE-qwul, as in sequel).</mat_formattedtext></mat_extension></material></flow></flow><flow class="RESPONSE_BLOCK"><response_str ident="response" rcardinality="Single" rtiming="No"><render_fib charset="us-ascii" encoding="UTF_8" rows="1" columns="127" maxchars="0" prompt="Box" fibtype="String" minnumber="0" maxnumber="0"/></response_str></flow></flow></presentation><resprocessing scoremodel="SumOfScores"><outcomes><decvar varname="SCORE" vartype="Decimal" defaultval="0.0" minvalue="0.0" maxvalue="10.0"/></outcomes><respcondition title="3313050c4e9f41608f30beddf2ffc79b"><conditionvar><varequal respident="response" case="No">SQL</varequal></conditionvar><displayfeedback linkrefid="correct" feedbacktype="Response"/><displayfeedback linkrefid="3313050c4e9f41608f30beddf2ffc79b" feedbacktype="Response"/></respcondition><respcondition title="incorrect"><conditionvar><other/></conditionvar><setvar variablename="SCORE" action="Set">0.0</setvar><displayfeedback linkrefid="incorrect" feedbacktype="Response"/></respcondition></resprocessing><itemfeedback ident="correct" view="All"><flow_mat class="Block"/></itemfeedback><itemfeedback ident="incorrect" view="All"><flow_mat class="Block"/></itemfeedback><itemfeedback ident="3313050c4e9f41608f30beddf2ffc79b" view="All"><solution view="All" feedbackstyle="Complete"><solutionmaterial><flow_mat class="Block"/></solutionmaterial></solution></itemfeedback></item><item maxattempts="0"><itemmetadata><bbmd_asi_object_id>_3162537_1</bbmd_asi_object_id><bbmd_asitype>Item</bbmd_asitype><bbmd_assessmenttype>Pool</bbmd_assessmenttype><bbmd_sectiontype>Subsection</bbmd_sectiontype><bbmd_questiontype>Fill in the Blank</bbmd_questiontype><bbmd_is_from_cartridge>false</bbmd_is_from_cartridge><bbmd_is_disabled>false</bbmd_is_disabled><bbmd_negative_points_ind>N</bbmd_negative_points_ind><bbmd_canvas_fullcrdt_ind>false</bbmd_canvas_fullcrdt_ind><bbmd_all_fullcredit_ind>false</bbmd_all_fullcredit_ind><bbmd_numbertype>none</bbmd_numbertype><bbmd_partialcredit></bbmd_partialcredit><bbmd_orientationtype>vertical</bbmd_orientationtype><bbmd_is_extracredit>false</bbmd_is_extracredit><qmd_absolutescore_max>10.0</qmd_absolutescore_max><qmd_weighting>0.0</qmd_weighting><qmd_instructornotes></qmd_instructornotes></itemmetadata><presentation><flow class="Block"><flow class="QUESTION_BLOCK"><flow class="FORMATTED_TEXT_BLOCK"><material><mat_extension><mat_formattedtext type="SMART_TEXT">You can save any ______________ for later use any number of times</mat_formattedtext></mat_extension></material></flow></flow><flow class="RESPONSE_BLOCK"><response_str ident="response" rcardinality="Single" rtiming="No"><render_fib charset="us-ascii" encoding="UTF_8" rows="1" columns="127" maxchars="0" prompt="Box" fibtype="String" minnumber="0" maxnumber="0"/></response_str></flow></flow></presentation><resprocessing scoremodel="SumOfScores"><outcomes><decvar varname="SCORE" vartype="Decimal" defaultval="0.0" minvalue="0.0" maxvalue="10.0"/></outcomes><respcondition title="e58b54588bf0424e91feb5cae9bd276f"><conditionvar><varequal respident="response" case="No">report</varequal></conditionvar><displayfeedback linkrefid="correct" feedbacktype="Response"/><displayfeedback linkrefid="e58b54588bf0424e91feb5cae9bd276f" feedbacktype="Response"/></respcondition><respcondition title="96dfba0bc3d34c25b5c62e5e871b4d7e"><conditionvar><varequal respident="response" case="No">query</varequal></conditionvar><displayfeedback linkrefid="correct" feedbacktype="Response"/><displayfeedback linkrefid="96dfba0bc3d34c25b5c62e5e871b4d7e" feedbacktype="Response"/></respcondition><respcondition title="incorrect"><conditionvar><other/></conditionvar><setvar variablename="SCORE" action="Set">0.0</setvar><displayfeedback linkrefid="incorrect" feedbacktype="Response"/></respcondition></resprocessing><itemfeedback ident="correct" view="All"><flow_mat class="Block"/></itemfeedback><itemfeedback ident="incorrect" view="All"><flow_mat class="Block"/></itemfeedback><itemfeedback ident="e58b54588bf0424e91feb5cae9bd276f" view="All"><solution view="All" feedbackstyle="Complete"><solutionmaterial><flow_mat class="Block"/></solutionmaterial></solution></itemfeedback><itemfeedback ident="96dfba0bc3d34c25b5c62e5e871b4d7e" view="All"><solution view="All" feedbackstyle="Complete"><solutionmaterial><flow_mat class="Block"/></solutionmaterial></solution></itemfeedback></item>

 

 

Adapting The Tags - 1 question = 237 bytes

An Adaptation of the tags used in the XML file to a simpler text file with tag, delimiter, content form could be simplified to look like this:

[question]
type:FIB
text:The data units within each record are _____ - single units of information such as a first name, a last name, address line one, address line two, city, state and so forth.
answer:fields|field

Size: 237 bytes - 8.4 percent of the XML file weight

This is easy to parse, simple to edit by hand, compact in size and pretty obvious. It is robust in the sense that if it makes no sense to the parser or something gets out of wack the parse will just ignore it, not stop or crash. Any number of attributes can be added in a question entry on new lines.

 

The XML file system for this pool totals 91.6 kilobytes in 9 files and two folders. The files are space-compressed removing any indents and all linefeeds and carriage returns.

The text file with the entire list of questions in the originating format is 19 kilobytes.

The text files with the entire list of questions in the converted format come to a total of 8 kilobytes. ( 3 kb + 3 kb + 2 kb)

 

This is an example of accomplishing a task with complexity and fragility where for years simple and compact methods have been available for the same purpose.

A Binary Config File Anecdote

In the mid 1990's I took up the task of programming a Windows version of a program which translated AutoCAD DXF files to PostScript in order to allow rendering and inclusion in desktop publishing, advertising, mapping and other uses where a smooth graphics output was needed from AutoCAD.

Among the needs was to carry forward a configuration file used every time the program started. The program read it in as a binary file. To get the binary file you first started with a text file (hand coded), then, using the program, read in the text file and save a binary version back to disk. Then the binary version was read into the progam.

This only makes sense to programmers who normally want to encode just about anything. I had to ask a simple question, "If the program is able to read the text file anyway in order to save a binary version of it, why bother with the binary version. Just read in the text file and leave the config file in plain-text format. So that was one of the first changes I made in the way the program operated. But this wasn't my first go round with coders doing clever coding just because they were coders.

In the early 1980's programs each needed their own printer drivers to go to any printer. Each printer had its own set of codes to perform various functions. They still do except that now the operating system takes care of these drivers. In those days most printer driver files were in binary format. Microsoft Word, for example, had a utility to take a text setup file and convert the file to a binary format it could use. That is the way the package came to us so we just assumed this was the way it had to be. Until, I got a word processor named "Paperback Writer" for my Commodore 64 and all the printer configuration files were in simple plain text files. The plain-text format had a line-by-line three part format:

tag-delimiter-value

where the delimiter (item separator) is a colon (:) - something like this (I can't find any extant files anymore but this gives the idea - codes for an Epson dot matrix printer)

I also like using a "pipe" (vertical bar character | ) as a delimiter because that is even less likely to be used in regular text.

Here the first item is a printer/printing function, the a colon followed by the control code or codes sent to the printer, in ASCII values.

beeper: 7
initialize: 27 64
horzontal tab: 9
line feed: 10
vertical tab: 11
form feed: 12
return: 13
newline: 13 10
bold: 27 69
bold cancel: 27 70
underline: 27 45 49
underline cancel: 27 45 48
Italic: 27 52
Italic cancel: 27 53

AutoCAD text DXF files themselves utilized (and still do) a two-line plain-text format in which the first line is the tag and the second line is the value. The line feed has the delimiter function. Here is how a circle is given in a DXF text file. the dimensions are unitless and can represent millimeters, miles, light years, angstroms or anything.

0
circle
10
200
20
700
30
0
40
1000

This is the description for a circle whose center is X-axis=200, Y-Axis=700, Z-axis=nothing, radius is 1000. With this format the parsing software has to be aware of what the numerical codes mean. The starting zero "0" means that the text name for an entity (such as circle, line, etc) will follow on the next line.

When the parser reads a zero (0) on the line it knows that it has finished with one entity and is starting the next entity. It looks at the next line for the name of the next entity.

When that entity is a circle it then looks for the X, Y, Z axes and the radius. A 10 on a line says that the next line will have the location of the x-axis (up and down). A 20 on a line says the next line has the Y axis (left to right), A 30 is the z-axis (front to back). A 40 on a line says the next line is the radius.

Very compact, needs some knowledge on the part of the parsing software. Has been around since 1982 when AutoCAD was introduced. There are other parts to the file format such as a header section and sections for blocks and third-party special data. But they continue this very simple text-based file format.

The old Windows INI (for initilization) files used a caption in square brackets to start a section, a semi-color (;) to have a comment line and the equal sign as the delimiter between tag and value.

;next section is my name as of jan 2016
[owner]
name=Mike Strong
title=The Cheese

[spreadsheet]
folder="programs\newsheet v9"
start="newsheet.exe"
mode=full

Then there are the still much-used data files with either commas or tabs as separators and generally setting the first line in the file to contain the field names.

Here is a comma (CSV) separated values file for a blood pressure database. Commas are used as delimiters between fields. Because a comma is also a common character in text, all text fields have a quote mark as the "text qualifier" around the content for any text field. Notice how the first line lists the field names.

"id","DateTime","BP_Pill","PreMeasure","Sys","Dia","Pulse","Exercise","xrSys","xrDia","xrPulse","avgSys","avgDia","avgPulse","avgN","Comment","Other
1,4/10/2015 14:41:00,0,0,135,79,84,0,,,,135,89,78,6,"Early test readings - Friday","135/89/78/ avg6"
2,4/10/2015 14:44:00,0,0,130,90,79,0,,,,,,,,"re-measure",
3,4/10/2015 14:48:00,0,0,150,95,78,0,,,,,,,,"re-measure",
4,4/10/2015 14:51:00,0,0,126,91,77,0,,,,,,,,"re-measure",
5,4/10/2015 14:52:00,0,0,130,90,75,0,,,,,,,,"re-measure",
6,4/10/2015 16:01:00,0,0,141,90,77,0,,,,,,,,"check",


Or the same thing in tab separated values. Tabs are not displayed visibly but you do see them as a set of spaces. There is one tab below for each comma above. Note that the text qualifiers are not used here because the tab character is not stored in the database so it won't happen to show up in the text fields items.

id	DateTime	BP_Pill	PreMeasure	Sys	Dia	Pulse	Exercise	xrSys	xrDia	xrPulse	avgSys	avgDia	avgPulse	avgN	Comment	Other
1 4/10/2015 14:41:00 0 0 135 79 84 0 135 89 78 6 Early test readings - Friday 135/89/78/ avg6
2 4/10/2015 14:44:00 0 0 130 90 79 0 re-measure
3 4/10/2015 14:48:00 0 0 150 95 78 0 re-measure
4 4/10/2015 14:51:00 0 0 126 91 77 0 re-measure
5 4/10/2015 14:52:00 0 0 130 90 75 0 re-measure
6 4/10/2015 16:01:00 0 0 141 90 77 0 check

All of these work without the overdone structure of an XML file, have worked for years and will work for years.

 

On Another Subject with similar code waste

i.e. I'm grumping again

You would think that a web-based application such as Blackboard would optimize code generation to be keep the lightest possible page weights, even more so because many of the persons using courses through Blackboard may not have higher connecton speeds available. Much as with "accessible" pages or accessible hardware and architecture, anything you can do to make the pages easier and faster to get to make those pages even better for everyone. But no. There is a huge amount of over coding in the pages. Even the measured page size in kilobytes is only a part of the page weight as a cursory examination of the source code shows a lot of data files that are downloaded by the browser before being the page is fully loaded.

I wanted to be able to use my own CSS (cascading style sheet) in pages I upload or place in Blackboard but no dice, directly. There is an HTML button which allows a very primitive HTML edit capability but stops short in many ways. This shows only the code within the body tags and doesn't show the head section at all because (I am assuming/guessing here) anything it ingests becomes an insert to be used inside a BB-page body-text area. For example entering any kind of script code or entering a style sheet in the HTML edit interface is useless. They are totally discarded when you click the "update" button.

An alternative is to bring up your edited-elsewhere page in a browser. Then highlight and copy the page or elements from the page. Now, in a content editor on Blackboard paste your displayed content. Blackboard will ingest the copy and at first glance it will look like your page, although with blank boxes where you had pictures. But if you again click the HTML edit button you will see that any javascript is missing and the same for your style sheet or sheets. Instead, Blackboard took in the contents of your style sheet or sheets then applied it as inline styles. That means that instead of having a paragraph tag
such as <p>Text in here to form a paragraph.</p> in which CSS styles for the <p> tag are applied by the browser,
you will see each tag with the styles from the CSS which apply to the tag
such as <p style="attribute:value; attribute:value; attribute:value; attribute:value; attribute:value;">Text in here to form a paragraph.</p>

CSS's were designed in large part to avoid exactly this messy circumstance in which formatting was interwoven with content making HTML code hard to clean up. In particular CSS's were devised to make it easier to change styles across a document without having to set each piece of the document separately. The offenders were minor in this case, things like a font tag <font face="arial, helvetica, sans-serif">followed by text in that font face</font> or the <center> tag followed by text to be centered and ended with the </center> end tag. Easier and more compact to handle with cascading style sheets (CSS's) and classes.

By applying a style sheet you can set formatting for all tags of any particular type form that point on the page downward. To change the look for all such tags you just change the style sheet. With inline styles you have to locate all the instances and change each one directly. We did this in the early days of the web and it was tedious then even though not nearly so page-weight heavy as this. This really was a poor programming decision and should never have been written into the interface.

Blackboard does have a CSS button, but (and this is a big but) unlike all (I do mean all) HTML editors I've ever worked with this does not allow me to attach or load a CSS (style sheet). Instead this provides me a property setting on an element by element basis. Very tedious and although detailed clunky in the end because it produces inline changes to an individual element (p, h, td, etcetera) on a page. It also violates at least two accessibility recommendations by setting text blocks and allowing absolute positioning on a page. Both are hard on screen readers. If Blackboard is designed to be a straightjacket then it needs to channel accessibility as well and allow only accessible methods and properties.

Here is the style sheet which was in the page I put together in Dreamweaver. On some longer lines your browser will "wrap" the text to the next line. Those really are single lines within the style sheet, they might not display that way on the visible page.

<style type="text/css">
TH {text-align: left;}
H1 {text-align: left;}
H1, H2, H3, H4, H5, H6, p, th, td, li, ul, ol, body {font-family: Arial, Helvetica, Verdana, sans-serif;}
H1, H2, H3, H4, H5, H6 {font-weight: lighter;}
H1 {font-size: 30pt; color: blue; letter-spacing: normal; clip: rect( ); font-family: Verdana, Arial, Helvetica, sans-serif; font-weight: lighter;}
H2 {font-size: 24pt; color: red;}
H3 {font-size: 18pt;}
H4 {font-size: 16pt; color: #660000;}
H5 {font-size: 14pt; color: #660000;}
H6 {font-size: 12pt; font-weight: 500;}
P {font-size: 11pt; color: #333333;}
TH, TD, li, ul, ol, body {font-size: 11pt;}
body { padding-left: 30px;
padding-right: 30px;}
pre {font-size: 8pt;}
address {font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12pt; font-style: italic;}
dt {font-family: Arial, Helvetica, sans-serif; font-size: 12pt; font-weight: bold;}
dd {font-family: Arial, Helvetica, sans-serif; font-size: 10pt;}
A {text-decoration: underline; color: blue;}
A:Hover {text-decoration: underline; color: red;}
input {font-family: Arial, Helvetica, sans-serif; height:18; font-size:8pt;}
select {font-family: Arial, Helvetica, sans-serif; font-size:8pt;}
textarea {font-family: Arial, Helvetica, sans-serif; font-size:8pt;}
TD:banner1 {}
.topicTitle {font-family: Palatino, Times, Times New Roman, serif; font-size:18pt; color:#ff9933; font-style: normal; font-weight: bold;}
.popshadow{position:relative; left:-4; top:-4; filter:shadow(silver,direction=135)}
</style>

 

Blackboard's ingestion of CSS and regurgitation as inline styles causes this bloat: (2541 bytes)

This is a simple copyright line turned into an over-coded mess of un-needed, overweight formatting instructions. To me, this is stupid to the point of offensive, especially to someone who started programming when memory space was at a premium and efficient code was prized. While I am glad to be able to use more meaningful and longer names for variables and so forth I am not delighted by noxious, toxic overhead which is disguised by faster processors, speedier networks, more memory and massive disk space. I still like small and simple, as long as the code remains clear.

<span data-mce-style="font-size: x-small;"><span data-mce-style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: normal; font-style: normal; font-family: Arial, Helvetica, Verdana, sans-serif; font-size: xx-small; font-variant: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: -webkit-center; text-indent: 0px; text-transform: none; white-space: normal; widows: 1; word-spacing: 0px; -webkit-text-stroke-width: 0px; color: #0000ff;">Unless otherwise noted a</span><span data-mce-style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: normal; font-style: normal; font-family: Arial, Helvetica, Verdana, sans-serif; font-size: xx-small; font-variant: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: -webkit-center; text-indent: 0px; text-transform: none; white-space: normal; widows: 1; word-spacing: 0px; -webkit-text-stroke-width: 0px; color: #0000ff;">&nbsp;</span><span data-mce-style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: normal; font-style: normal; font-family: Arial, Helvetica, Verdana, sans-serif; font-size: xx-small; font-variant: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: -webkit-center; text-indent: 0px; text-transform: none; white-space: normal; widows: 1; word-spacing: 0px; -webkit-text-stroke-width: 0px; color: #0000ff;">ll content, images and text were created by and are the copyright 1983, 2003-2016 of Mike Strong - No copying or duplication is allowed without express permission from Mike Strong</span><span data-mce-style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: normal; font-style: normal; font-family: Arial, Helvetica, Verdana, sans-serif; font-size: xx-small; font-variant: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: -webkit-center; text-indent: 0px; text-transform: none; white-space: normal; widows: 1; word-spacing: 0px; -webkit-text-stroke-width: 0px; color: #0000ff;">&nbsp;-</span><span data-mce-style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-weight: normal; font-style: normal; font-family: Arial, Helvetica, Verdana, sans-serif; font-size: xx-small; font-variant: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: -webkit-center; text-indent: 0px; text-transform: none; white-space: normal; widows: 1; word-spacing: 0px; -webkit-text-stroke-width: 0px; color: #0000ff;">&nbsp;kcdance.com,&nbsp;artfuldancer.com</span></span>

Notice also that Blackboard inserted a non-breaking space (&nbsp;) in a number of places where I had typed single spaces: &nbsp;kcdance.com,&nbsp;artfuldancer.com
Note further that Blackboard guidelines recommend against using non-breaking spaces to adjust locations on a line in a page.

When this was the original code written using Dreamweaver and handcoding the inline style in the starting paragraph tag (319 bytes or 1/8th the size of the BB code)
<p Style="color:blue; font-family:Arial, Helvetica, sans-serif; font-size:8pt;">

<p Style="color:blue; font-family:Arial, Helvetica, sans-serif; font-size:8pt;">Unless otherwise noted all content, images and text were created by and are the copyright 1983, 2003-2016 of Mike Strong - No copying or duplication is allowed without express permission from Mike Strong - kcdance.com, artfuldancer.com</p>