Objective-C Syntax Highlighting with Squarespace 6 using SyntaxHighlighter without Developer Mode

Syntax Highlight for Objective-C on Squarespace 6

Update 6/19/14: This method works for Safari, but it keeps failing in Chrome. I've disabled it for now until I can investigate a better option. The code and method should still work, but the comparisons won't look different below.

I write a lot of code samples and I was using SyntaxHighlighter on my wordpress blog, but since I started using Squarespace I didn't have an easy solution to get it working. I spent the day digging around the internet and found some guides on how to get it to work without the Developer Mode on Squarespace. 

Syntax highlighting is useful because it makes it easier to digest what the different parts of a blog post are. You can easily separate the content from the code because of the coloring. I'll show a comparison with pros/cons and then you can jump to the guide to setup your Squarespace blog.

Code Sample Comparison for Squarespace Blogs

Code Paragraph Style

Here is a code sample without syntax highlighting using the "Code" paragraph style for the monospace font. It's rather buggy to get right in Squarespace 6. You copy paste into Squarespace and the formatting will be off (I have to delete every other newline (return)). Then I have to apply the "Code" tag and reformat again. It's super picky and if you modify the text too much you may have to reformat it.

Pros:

  1. Works out of the box
  2. Don't need to escape "<" characters with &lt;

Cons

  1. Spacing is buggy
  2. Lots of text formatting
  3. Deleting text lines near, in, or around the Code paragraph style can alter the formatting

 

#import "ViewController.h"
@interface ViewController () <UIGestureRecognizerDelegate> {
CGFloat _centerX;
}
@end

@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];

UIScreenEdgePanGestureRecognizer *leftEdgeGesture = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self action:@selector(handleLeftEdgeGesture:)];
leftEdgeGesture.edges = UIRectEdgeLeft;
leftEdgeGesture.delegate = self;
[self.view addGestureRecognizer:leftEdgeGesture];

// Store the center, so we can animate back to it after a slide
_centerX = self.view.bounds.size.width / 2;
}
@end

As you can see it becomes hard to read and really see the code. There is no syntax highlighting and controlling the spacing is manual. I'd have to manually fix each line to get it to indent properly, instead of defaulting to my copy/paste from my code editor.

SyntaxHighlighter Code Highlighting

Here is the same code sample with SyntaxHighlighter. Instead of doing a Text block, I use a Code block with HTML. To learn how to set it up, keep on reading below.

I'll use the <pre></pre> installation method so that the code is inline with the blog, as opposed to the script method. The script method doesn't work well with RSS readers. Note: If you want your code indexed by Google, you'll want to use <pre></pre> to rank higher in search for the code.

Pros

  1. Multiple programming languages supported via brushes.
  2. Respects code formatting/spacing

Cons

  1. Need to escape the < "less-than" characters as &lt; (Find and replace all in the code block)
#import "ViewController.h"

@interface ViewController () <UIGestureRecognizerDelegate> {
    CGFloat _centerX;
}
@end
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    
    UIScreenEdgePanGestureRecognizer *leftEdgeGesture = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self action:@selector(handleLeftEdgeGesture:)];
    leftEdgeGesture.edges = UIRectEdgeLeft;
    leftEdgeGesture.delegate = self;
    [self.view addGestureRecognizer:leftEdgeGesture];
    
    // Store the center, so we can animate back to it after a slide
    _centerX = self.view.bounds.size.width / 2;
}
@end

SyntaxHighlighter Makes Code Readable on your Blog

Now that you've seen the comparison, let's jump right in and set you up with SyntaxHighlighter on Squarespace 6. You don't need to upload files or enable developer mode to make it work. Instead we can link to already public javascript and css files.

1. Go to your Squarespace Settings Tab > Code Injection > Header

Settings &gt; Code Injection &gt; Header to add custom code to all pages hosted on &nbsp;your Squarespace domain.

Settings > Code Injection > Header to add custom code to all pages hosted on  your Squarespace domain.

2. Add the following code to get syntax highlighting working for Objective-C, CSS, and javascript. I code in Objective-C, but I needed Javascript and CSS to show the code for this post.

<link href="http://alexgorbatchev.com/pub/sh/current/styles/shCore.css" rel="stylesheet" type="text/css"> 
<link href="http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css" rel="stylesheet" type="text/css"> 
 
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript"></script> 
 
<script src='https://raw.githubusercontent.com/PaulSolt/ObjectiveCSyntaxHighlighter/master/scripts/shBrushObjC.js 'type='text/javascript'>
</script>

<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js" type="text/javascript"></script>
<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js" type="text/javascript"></script>

<style type="text/css">
  .syntaxhighlighter {
    background-color: white !important;
    height: 300px !important;
    overflow: auto;
    border: 1px solid #DADAD9 !important;
    margin-bottom: 20px !important;
    font-size: 110% !important;
    }
  .syntaxhighlighter .line.alt2 {
    background-color: #f5f5f5 !important;
    }
  .syntaxhighlighter .line.highlighted.alt1, .syntaxhighlighter .line.highlighted.alt2 {
    background-color: #D4DDF8 !important;
    }
 
 
</style>
  
<script language="javascript"> 
  SyntaxHighlighter.config.bloggerMode = true;
  SyntaxHighlighter.config.space=' ';
  SyntaxHighlighter.all();
</script>
 
 
<!--  Uncomment a brush for your programming language syntax highlighting

<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCpp.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCSharp.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPhp.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPython.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushRuby.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSql.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushVb.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPerl.js' type='text/javascript'></script> 
-->

3. Add a Code block for HTML code, and disable "Display Source". You'll have to hover the mouse on the left side of your "Edit Post" popup window with Squarespace 6. You'll see a "+" to add a new block.

Add a new block by hovering your mouse on the left side of Squarespace

Add a new block by hovering your mouse on the left side of Squarespace

4.  Scroll down in the popup until you find "Code" under the "More" section. Click it to add it. Or you can drag it to a specific position in the layout of your blog post on Squarespace 6.

Scroll down and look for the Code block under the More category.

Scroll down and look for the Code block under the More category.

5. Turn off the "Display Source" option and use the HTML code to have the code work properly.

Add your source code and make sure to replace any "<" characters with the &lt; escape code for proper HTML formatting. If you don't, your source code won't render correctly and you'll see strange things on your blog page.

Disable the "Display Source" and make sure you are on HTML code. All &lt; characters should be replaced with &amp;lt;

Disable the "Display Source" and make sure you are on HTML code. All < characters should be replaced with &lt;

6. Add some sample code to display with syntax highlighting.

Sample code (Copy/Paste to your code block)

<pre class="brush: objc">
#import "ViewController.h"

@interface ViewController () {
    int _x;
}

@end
</pre>

Output of Sample Code

#import "ViewController.h"

@interface ViewController () {
    int _x;
}

@end

Gotchas:

Code is Editable on Double-Click

The code uses a property to make it easy to copy/paste the full code block. If you want to disable this behavior you can add the code to disable quick-code. If you click off of the text area, it'll jump back to the code. It's a little annoying, but it can make it easier for your readers to copy/paste code from your website to their IDE.

<pre class="brush: objc; quick-code: false;">
#import "ViewController.h"

@interface ViewController () {
    int _x;
}

@end
</pre>


How do I Remove Line Numbers?

Set the gutter to false after you set the brush. Include a ; (semicolon) to separate multiple arguments.

Source

<pre class="brush: objc; gutter: false;">
#import "ViewController.h"

@interface ViewController () {
    int _x;
}

@end
</pre>

Output

#import "ViewController.h"

@interface ViewController () {
    int _x;
}

@end

Xcode Copy and Paste Issue with Non-breaking Space Characters - &nbsp;

Using the default script that I have linked has a bug where when you double click and copy, the code inserts non-breaking space character codes. &nbsp; or &#160;

To fix this, make sure in the code you placed under Code Injection in Squarespace's settings that you include an explicit white space character for your spaces. You can set this to any character you'd like. Normal spaces will fix the copy/paste issues.

<script language="javascript">
  SyntaxHighlighter.config.bloggerMode = true;
  SyntaxHighlighter.config.space=' ';
  SyntaxHighlighter.all();
</script>

SyntaxHighlighter Can't find brush for: js (etc)

Can't find brush for: js - We didn't uncomment or add the correct language brush for SyntaxHighlighter

Can't find brush for: js - We didn't uncomment or add the correct language brush for SyntaxHighlighter

You'll need to include a new script for each language that you want to support code formatting. I would only include the ones that you need.

You'll get this error dialog when a user loads the page and the brush type isn't supported. (Or if the source file original links you've used no longer exist)

Resources

Let me know if this post was helpful. I spent a lot of time trying to research it and figure out solutions to some of the common problems. You can take a look at the resources that I found helpful.

Connect

  1. Join my iPhone mailing list to keep learning about making iPhone apps.
  2. For more structured learning, signup for my online iPhone app course.

Learning from Experience and Small Groups

When I first started learning iOS development it was hard. I had stumbling blocks all along the way and good reading materials were hard to find. The issues were so frequent that I started blogging about advanced topics to document what I learned. I fought with the old version of Xcode 3 and the learning curve of Xcode 4. Many things were changing (iOS 3.0, 4.0, 5.0, and 6.0), and the only way to remember how I fixed things was to write it down with pictures.

While my original blog is great for advanced topics it fails to help most beginners. That's why I started http://iPhoneDev.tv to connect and teach artists, designers, entrepreneurs, hobbyists, and tech enthusiasts.   

What's Changed?

There are a lot more resources today that make learning easier. Stackoverflow.com has more problems and solutions, Apples' World Wide Developer Conference (WWDC) gives free videos about the latest features on iPhone/iPad/iOS/Mac, and the Big Nerd Ranch books have expanded and re-oriented themselves for beginners.

Learning from Other Experiences

I think the most challenging thing I've learned has been how to rock climb, also known as bouldering. At RIT we have a rock climbing gym (Red Barn) and I never liked it until recently. 

Indoor bouldering has a set of climbing holds (hands/feet) that are in a "route" or path and marked by colored tape. The goal is to traverse the wall from start to finish to complete the route. Where I found frustration as a beginner was that I couldn't "visualize" how I would solve a path, nor could I complete more than a few steps along the way. I think I spent 2-3 months climbing 1-2 times a week and I didn't see improvement. I didn't even finish a full path for the first two months. So much failure ate away and demoralized me. I started each climbing session knowing that I wasn't going to get much further.

The solution I found was to climb with a beginner, because it allowed me to teach the very few things that I had learned to someone else. Teaching in itself is a learning process that re-enforces what we know. I think I became more aware of how I was holding my body, moving on the wall, and how to identify the mistakes with another beginner. It allowed me to see how I looked on the wall, with someone who wasn't great.

Good climbers show you how to do it right, but bad climbers highlight what you're doing wrong. I think the same thing can be applied to any other field of study.

Find a Beginner Programmer and Connect

A coach is just as important as the rest of the team. When you're working on iPhone app development by yourself it's easy to become frustrated and fail to figure out a bug. What you need is another beginner programmer who you can talk about the problems and teach what you've learned. Together you'll learn more than if you both worked in separate silos.

I think a coach is also good for those times that you hit a wall. As an advanced programmer I've seen a lot of the pitfalls and I've been there before. So I know how to get out, but you won't really learn if I give you all the answers. You'll become dependent on me solving your problems and not you solving your problems. As a coach I teach you good form, how to practice, and how to find the answers. 

As you practice and learn to program iPhone apps you need someone, a peer, that can speak the same language with you and not overwhelm your current knowledge level. It's important because they can become a source of motivation and a way to learn more effectively. You can teach them and they can teach you. In the end you'll learn more than you would from just reading a book.

Homework

  1. Find another beginner iPhone programmer or a small group of programmers. (Meetup.com, local iPhone group, or Skillshare group)
  2. Start reading 1-2 chapters a day of Objective-C Programming: The Big Nerd Ranch Guide.
  3. Practice as you read about new topics. Keep Xcode open so that you can try and write code.
  4. Discuss your challenges and how you solved them with another beginner.