diff --git a/lib/banzai/filter/syntax_highlight_filter.rb b/lib/banzai/filter/syntax_highlight_filter.rb
index 028edef704bde1641d22fffa6f717fa7e7417bb1..91f0159f9a1180e13824da5c0668202a509d115b 100644
--- a/lib/banzai/filter/syntax_highlight_filter.rb
+++ b/lib/banzai/filter/syntax_highlight_filter.rb
@@ -19,21 +19,22 @@ module Banzai
         language = node.attr('class')
         code     = node.text
 
-        lexer = Rouge::Lexer.find_fancy(language)
+        css_classes = "code highlight"
+
+        lexer = Rouge::Lexer.find_fancy(language) || Rouge::Lexers::PlainText
         formatter = Rouge::Formatters::HTML.new
-        css_classes = "code highlight js-syntax-highlight #{lexer.tag}"
 
         begin
-          highlighted = ''
-          highlighted << %(<pre class="#{css_classes}"><code>)
-          highlighted << formatter.format(lexer.lex(code))
-          highlighted << %(</code></pre>)
+          code = formatter.format(lexer.lex(code))
+
+          css_classes << " js-syntax-highlight #{lexer.tag}"
         rescue
           # Gracefully handle syntax highlighter bugs/errors to ensure
           # users can still access an issue/comment/etc.
-          highlighted = "<pre>#{code}</pre>"
         end
 
+        highlighted = %(<pre class="#{css_classes}"><code>#{code}</code></pre>)
+
         # Extracted to a method to measure it
         replace_parent_pre_element(node, highlighted)
       end
diff --git a/spec/lib/banzai/filter/syntax_highlight_filter_spec.rb b/spec/lib/banzai/filter/syntax_highlight_filter_spec.rb
index 48ebc81cf829f9848c86f9babf5d8c7ea6a36238..b1370bca8332dfe2fbe95fddb2a89c7e7a8fad2b 100644
--- a/spec/lib/banzai/filter/syntax_highlight_filter_spec.rb
+++ b/spec/lib/banzai/filter/syntax_highlight_filter_spec.rb
@@ -3,15 +3,35 @@ require 'spec_helper'
 describe Banzai::Filter::SyntaxHighlightFilter, lib: true do
   include FilterSpecHelper
 
-  it 'highlights valid code blocks' do
-    result = filter('<pre><code>def fun end</code>')
-    expect(result.to_html).to eq("<pre class=\"code highlight js-syntax-highlight plaintext\"><code>def fun end</code></pre>")
+  context "when no language is specified" do
+    it "highlights as plaintext" do
+      result = filter('<pre><code>def fun end</code></pre>')
+      expect(result.to_html).to eq('<pre class="code highlight js-syntax-highlight plaintext"><code>def fun end</code></pre>')
+    end
   end
 
-  it 'passes through invalid code blocks' do
-    allow_any_instance_of(Rouge::Formatter).to receive(:format).and_raise(StandardError)
+  context "when a valid language is specified" do
+    it "highlights as that language" do
+      result = filter('<pre><code class="ruby">def fun end</code></pre>')
+      expect(result.to_html).to eq('<pre class="code highlight js-syntax-highlight ruby"><code><span class="k">def</span> <span class="nf">fun</span> <span class="k">end</span></code></pre>')
+    end
+  end
+
+  context "when an invalid language is specified" do
+    it "highlights as plaintext" do
+      result = filter('<pre><code class="gnuplot">This is a test</code></pre>')
+      expect(result.to_html).to eq('<pre class="code highlight js-syntax-highlight plaintext"><code>This is a test</code></pre>')
+    end
+  end
+
+  context "when Rouge formatting fails" do
+    before do
+      allow_any_instance_of(Rouge::Formatter).to receive(:format).and_raise(StandardError)
+    end
 
-    result = filter('<pre><code>This is a test</code></pre>')
-    expect(result.to_html).to eq('<pre>This is a test</pre>')
+    it "highlights as plaintext" do
+      result = filter('<pre><code class="ruby">This is a test</code></pre>')
+      expect(result.to_html).to eq('<pre class="code highlight"><code>This is a test</code></pre>')
+    end
   end
 end