Advertisements

WordPress Source Code Test Post: Old Editor

A test post to show WP support the problem with source code I’m fighting…

I created this using the “old” editor, then went back to the Posts listing and edited it with that editor. It’s worth noting that the “Edit” link in the post preview triggers the “improved” editor, which shreds existing sourcecode blocks.

One of the many pictures I use that are easiest to handle using the Visual editor, which is why I’m pushing back so hard against any workaround that involves not switching editor modes:

Mood Light - thermocouple location

Mood Light – thermocouple location

I create code blocks by typing (or pasting) the opening & closing sourcecode tags, then copying the block from the text editor and pasting it between the tags. No MS Word, no word processing, no exotic formats, just plain text from a programming editor.

A chunk of code that I pasted in Text mode, then switched to Visual mode to insert the picture above:

void loop() {
	
	MillisNow = millis();
	if ((MillisNow - MillisThen) > UpdateMS) {
		digitalWrite(PIN_HEARTBEAT,HIGH);
		
		for (byte c=0; c < PIXELSIZE; c++) { // step to next increment in each color if (++Pixels[c].Step >= Pixels[c].NumSteps) {
				Pixels[c].Step = 0;
				printf("Cycle %d steps %d at %8ld delta %ld ms\r\n",c,Pixels[c].NumSteps,MillisNow,(MillisNow - MillisThen));
			}
		}

		for (int i=0; i < LEDSTRINGCOUNT; i++) {				// for each layer
			byte Value[PIXELSIZE];
			for (byte c=0; c < PIXELSIZE; c++) {				//  ... for each color
				Value[c] = StepColor(c,-i*Pixels[c].PlatterPhase);		// figure new PWM value
//				Value[c] = (c == RED && Value[c] == 0) ? Pixels[c].MaxPWM : Value[c];	// flash highlight for tracking
			}
			uint32_t UniColor = strip.Color(Value[RED],Value[GREEN],Value[BLUE]);
			if (false && (i == 0))
				printf("L: %d C: %08lx\r\n",i,UniColor);
			for (int j=0; j < LEDSTRIPCOUNT; j++) {				// fill layer with color
				strip.setPixelColor(Map[i][j],UniColor);
			}
		}
		strip.show();

		MillisThen = MillisNow;
		digitalWrite(PIN_HEARTBEAT,LOW);
	}
	
}

All the “greater than”, “less than”, and “ampersand” characters have been HTML-escaped and will now stay that way forever.

Part of that problem may be that the editor sometimes inserts a bogus end tag for a Preformatted block that doesn’t match an opening tag, typically at the bottom of the post. That seems to happen only when the source code block is the last text in the post; it’s as if the editor puts pre tags around the block as some part of round-tripping the source code, but loses track when it removes them.

It will also insert spurious nbsp escaped characters in blank lines that seem to affect the outcome.

Here’s the same block, inserted in Visual mode with “Paste as text” turned off:

void loop() {
 
 MillisNow = millis();
 if ((MillisNow - MillisThen) > UpdateMS) {
 digitalWrite(PIN_HEARTBEAT,HIGH);
 
 for (byte c=0; c < PIXELSIZE; c++) { // step to next increment in each color if (++Pixels[c].Step >= Pixels[c].NumSteps) {
 Pixels[c].Step = 0;
 printf("Cycle %d steps %d at %8ld delta %ld ms\r\n",c,Pixels[c].NumSteps,MillisNow,(MillisNow - MillisThen));
 }
 }

 for (int i=0; i < LEDSTRINGCOUNT; i++) { // for each layer
 byte Value[PIXELSIZE];
 for (byte c=0; c < PIXELSIZE; c++) { // ... for each color
 Value[c] = StepColor(c,-i*Pixels[c].PlatterPhase); // figure new PWM value
// Value[c] = (c == RED && Value[c] == 0) ? Pixels[c].MaxPWM : Value[c]; // flash highlight for tracking
 }
 uint32_t UniColor = strip.Color(Value[RED],Value[GREEN],Value[BLUE]);
 if (false && (i == 0))
 printf("L: %d C: %08lx\r\n",i,UniColor);
 for (int j=0; j < LEDSTRIPCOUNT; j++) { // fill layer with color
 strip.setPixelColor(Map[i][j],UniColor);
 }
 }
 strip.show();

 MillisThen = MillisNow;
 digitalWrite(PIN_HEARTBEAT,LOW);
 }
 
}

The editor converts all the leading tabs into a single space character, shredding the layout. If that were Python, it would shred the syntax as well.

Here’s the same block of text, inserted in Visual mode with “Paste as text” turned on:

void loop() {
 
 MillisNow = millis();
 if ((MillisNow - MillisThen) > UpdateMS) {
 digitalWrite(PIN_HEARTBEAT,HIGH);
 
 for (byte c=0; c < PIXELSIZE; c++) { // step to next increment in each color if (++Pixels[c].Step >= Pixels[c].NumSteps) {
 Pixels[c].Step = 0;
 printf("Cycle %d steps %d at %8ld delta %ld ms\r\n",c,Pixels[c].NumSteps,MillisNow,(MillisNow - MillisThen));
 }
 }

 for (int i=0; i < LEDSTRINGCOUNT; i++) { // for each layer
 byte Value[PIXELSIZE];
 for (byte c=0; c < PIXELSIZE; c++) { // ... for each color
 Value[c] = StepColor(c,-i*Pixels[c].PlatterPhase); // figure new PWM value
// Value[c] = (c == RED && Value[c] == 0) ? Pixels[c].MaxPWM : Value[c]; // flash highlight for tracking
 }
 uint32_t UniColor = strip.Color(Value[RED],Value[GREEN],Value[BLUE]);
 if (false && (i == 0))
 printf("L: %d C: %08lx\r\n",i,UniColor);
 for (int j=0; j < LEDSTRIPCOUNT; j++) { // fill layer with color
 strip.setPixelColor(Map[i][j],UniColor);
 }
 }
 strip.show();

 MillisThen = MillisNow;
 digitalWrite(PIN_HEARTBEAT,LOW);
 }
 
}

Pretty much the same thing: consecutive tabs become a single space.

For whatever it’s worth, I’ve removed a bogus pre closing tag from the bottom of the post three times by now…

Keeping some text at the bottom seems to prevent the bogus pre tag, but that’s hard to enforce…

Advertisements