who-needs-wp 0.6.1 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -53,11 +53,21 @@ Choice.options do
53
53
  desc 'Upload the output to an FTP address.'
54
54
  end
55
55
 
56
- option :remote_addr do
57
- long '--remote-addr=username'
56
+ option :upload_url do
57
+ long '--upload-url=SCP address'
58
58
  desc "Location to upload the output. To enable specify the --upload option. (Default: \"#{options[:ftp]}\")"
59
59
  end
60
60
 
61
+ option :use_term_extractor do
62
+ long '--use-term-extractor'
63
+ desc "Generate tags for each post / page using the Yahoo Term Extractor API."
64
+ end
65
+
66
+ option :index_page do
67
+ long '--index-page=filename'
68
+ desc "Override the default index page for the site. If not set then the first page in the site is used."
69
+ end
70
+
61
71
  option :help do
62
72
  long '--help'
63
73
  desc 'Show this message'
@@ -4,12 +4,17 @@ require 'rdiscount'
4
4
  require 'haml'
5
5
  require 'open-uri'
6
6
  require 'sass'
7
- require 'makers-mark'
7
+ require 'kramdown'
8
8
  require 'logger'
9
9
  require 'rss/maker'
10
10
  require 'net/ssh'
11
11
  require 'net/sftp'
12
+ require 'rexml/document'
13
+ require 'net/http'
14
+
12
15
  require 'who-needs-wp/css.rb'
16
+ require 'who-needs-wp/keywords.rb'
17
+ require 'who-needs-wp/sitemap.rb'
13
18
  require 'who-needs-wp/Content.rb'
14
19
  require 'who-needs-wp/content/Page.rb'
15
20
  require 'who-needs-wp/content/Post.rb'
@@ -18,6 +23,7 @@ require 'who-needs-wp/sidebar/twitter.rb'
18
23
  require 'who-needs-wp/sidebar/delicious.rb'
19
24
  require 'who-needs-wp/sidebar/recentposts.rb'
20
25
  require 'who-needs-wp/sidebar/pageindex.rb'
26
+ require 'who-needs-wp/sidebar/latitude.rb'
21
27
  require 'who-needs-wp/templates.rb'
22
28
 
23
29
  module WhoNeedsWP
@@ -47,6 +53,9 @@ module WhoNeedsWP
47
53
  if @options[:delicious]
48
54
  delicious = Delicious.new(@options[:delicious][:user])
49
55
  end
56
+ if @options[:latitude]
57
+ Latitude.new(@options[:latitude])
58
+ end
50
59
  Page.load
51
60
  Post.load
52
61
  if Post.all.length > 0
@@ -62,6 +71,7 @@ module WhoNeedsWP
62
71
  Post.index
63
72
  self.index
64
73
  self.css
74
+ self.sitemap
65
75
 
66
76
  if @options[:upload]
67
77
  self.upload
@@ -74,19 +84,30 @@ module WhoNeedsWP
74
84
 
75
85
  # Generate the index page for the blog
76
86
  def self.index
87
+ keywords = []
77
88
  contents = ""
78
89
  if Post.all.length > 0
79
90
  Post.all[0..3].each do |post|
80
91
  contents << post.html
92
+ keywords = keywords + post.tags
81
93
  end
82
94
  else
83
- contents << Page.all.first.html
95
+ index_page = Page.all.first
96
+ if @options[:index_page]
97
+ Page.all.each do |page|
98
+ if page.filename[:original] == @options[:index_page]
99
+ index_page = page
100
+ break
101
+ end
102
+ end
103
+ end
104
+ contents = index_page.html
84
105
  end
85
- self.render_html("index.html", "index", contents)
106
+ self.render_html("index.html", "index", contents, "", keywords, @options[:index_summary])
86
107
  end
87
108
 
88
109
  def self.upload
89
- match = @options[:remote_addr].match(/(.*)@(.*):(.*)/)
110
+ match = @options[:upload_url].match(/(.*)@(.*):(.*)/)
90
111
  username = match[1]
91
112
  host = match[2]
92
113
  remote_path = match[3]
@@ -19,8 +19,9 @@ module WhoNeedsWP
19
19
  attr_accessor :summary
20
20
  # A Hash which contains the original and generated filename
21
21
  attr_accessor :filename
22
-
23
-
22
+ # An array of tags which are associated with this content
23
+ attr_accessor :tags
24
+
24
25
  def initialize(filename)
25
26
  @filename = {
26
27
  :original => filename,
@@ -30,7 +31,7 @@ module WhoNeedsWP
30
31
  @url = WhoNeedsWP::options[:url] + '/' + @filename[:generated]
31
32
  # Set the default author of the content to be the site author
32
33
  @author = WhoNeedsWP::options[:author]
33
-
34
+
34
35
  read_file
35
36
  end
36
37
 
@@ -38,8 +39,10 @@ module WhoNeedsWP
38
39
  def render
39
40
  # Set the summary to be the first paragraph
40
41
  @summary = $1 if @html =~ (/(?:<p>)(.*?)(?:<\/p>)/)
42
+ # Append the full site URL to any links referring to the root folder
43
+ @html.gsub!(/(href|src)=\"\//, '\1="' + WhoNeedsWP::options[:url] + '/')
41
44
  # Render the content HTML within a page
42
- WhoNeedsWP::render_html(@filename[:generated], "page", @html, @title)
45
+ WhoNeedsWP::render_html(@filename[:generated], "page", @html, @title, @tags, @summary)
43
46
  end
44
47
 
45
48
  private
@@ -49,7 +52,15 @@ module WhoNeedsWP
49
52
  content = File.read(@filename[:original])
50
53
  # Remove the author, if there is one from the Markdown
51
54
  content = extract_author(content)
52
- @markdown = MakersMark.generate(content)
55
+ if WhoNeedsWP::options[:use_term_extractor]
56
+ @tags = YahooTermExtractor.generate_keywords(content)
57
+ else
58
+ @tags = []
59
+ end
60
+
61
+ @markdown = Kramdown::Document.new(content)
62
+ #,{:coderay => {:wrap => :div, :line_numbers => :inline,
63
+ #:line_number_start => 1, :tab_width => 8, :bold_every => 10, :css => :style}})
53
64
  end
54
65
 
55
66
  # Return the title of the content, based on the filename
@@ -60,18 +71,17 @@ module WhoNeedsWP
60
71
 
61
72
  # Return the filename which will be use to save rendered content
62
73
  def generate_filename(filename)
63
- File.dirname(filename) + "/" + File.basename(filename, ".markdown") + ".html"
74
+ File.dirname(filename) + "/" + File.basename(filename, ".markdown").gsub(/[?\/]/, '') + ".html"
64
75
  end
65
76
 
66
77
  # Generate a unique ID for this content
67
78
  def generate_id
68
- if self.created_at == nil
69
- raise "Content must have a timestamp before a unique ID can be generated"
79
+ if @created_at != nil
80
+ # Replace the HTTP from the URL with tag:
81
+ @id = (WhoNeedsWP::options[:url] + '/' + @filename[:generated]).gsub(/http:\/\//, 'tag:')
82
+ match = @id.match(/([^\/]*)\/(.*)/)
83
+ @id = "#{match[1]},#{self.created_at.strftime('%Y-%m-%d')}:#{match[2]}" if match
70
84
  end
71
- # Replace the HTTP from the URL with tag:
72
- @id = (WhoNeedsWP::options[:url] + @filename[:generated]).gsub(/http:\/\//, 'tag:')
73
- match = @id.match(/([^\/]*)\/(.*)/)
74
- @id = "#{match[1]},#{self.created_at.strftime('%Y-%m-%d')}:#{match[2]}" if match
75
85
  end
76
86
 
77
87
  # Read the author from the Markdown content. If none exists
@@ -86,4 +96,4 @@ module WhoNeedsWP
86
96
  return content
87
97
  end
88
98
  end
89
- end
99
+ end
@@ -7,6 +7,7 @@ module WhoNeedsWP
7
7
  Dir.glob('pages/*.markdown').each do |filename|
8
8
  @@pages << Page.new(filename)
9
9
  end
10
+ @@pages.sort! { |a, b| a.title <=> b.title }
10
11
  end
11
12
 
12
13
  # See Content.render_content
@@ -6,6 +6,7 @@ module WhoNeedsWP
6
6
  def initialize(filename, created_at)
7
7
  super(filename)
8
8
  @created_at = created_at
9
+ generate_id
9
10
  end
10
11
 
11
12
  # A list of all the pages on the site
@@ -50,9 +51,11 @@ module WhoNeedsWP
50
51
  end
51
52
 
52
53
  def self.index(filename = "posts/index.html")
53
- WhoNeedsWP::render_html(filename, "post_index", WhoNeedsWP::render_template("all_posts", {
54
- :posts => @@posts
55
- }), "All Posts")
54
+ if File.exists?(File.dirname(filename))
55
+ WhoNeedsWP::render_html(filename, "post_index", WhoNeedsWP::render_template("all_posts", {
56
+ :posts => @@posts
57
+ }), "All Posts")
58
+ end
56
59
  end
57
60
 
58
61
  # Generate an RSS feed of all the posts
@@ -0,0 +1,17 @@
1
+
2
+ module WhoNeedsWP
3
+
4
+ class YahooTermExtractor
5
+ @@API_URI = URI.parse('http://api.search.yahoo.com/ContentAnalysisService/V1/termExtraction')
6
+ def self.generate_keywords(text)
7
+ return [] if text.empty?
8
+ keywords = []
9
+ i = Net::HTTP.post_form(@@API_URI, { 'appid' => 'who-needs-wp', 'context' => text } )
10
+ i = REXML::Document.new i.body
11
+ i.each_element("//Result") do |result|
12
+ keywords << result.text
13
+ end
14
+ return keywords
15
+ end
16
+ end
17
+ end
@@ -1,4 +1,3 @@
1
- require 'nokogiri'
2
1
 
3
2
  module WhoNeedsWP
4
3
  class Delicious < Sidebar
@@ -27,12 +26,12 @@ module WhoNeedsWP
27
26
  def get_bookmarks
28
27
  @logger.debug "Fetching bookmarks from Delicious"
29
28
  bookmarks = []
30
- doc = Nokogiri::XML(open("http://feeds.delicious.com/v2/rss/#{@username}?count=5"))
31
- doc.xpath('//channel/item').each do |item|
29
+ doc = REXML::Document.new(open("http://feeds.delicious.com/v2/rss/#{@username}?count=5"))
30
+ doc.each_element('//channel/item') do |item|
32
31
  bookmarks << {
33
- :title => (item/'title').first.content,
34
- :url => (item/'link').first.content,
35
- :date => Date.parse((item/'pubDate').first.content)
32
+ :title => item.get_text('title'),
33
+ :url => item.get_text('link'),
34
+ :date => Date.parse(item.get_text('pubDate').to_s)
36
35
  }
37
36
  end
38
37
  return bookmarks
@@ -0,0 +1,14 @@
1
+ module WhoNeedsWP
2
+ class Latitude < Sidebar
3
+ def initialize(username)
4
+ super()
5
+ @username = username
6
+ end
7
+
8
+ # See Sidebar.render
9
+ def render
10
+ @logger.debug "Rendering Latitude iFrame"
11
+ WhoNeedsWP::render_template("latitude", { :username => @username })
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,40 @@
1
+
2
+ module WhoNeedsWP
3
+ def self.sitemap
4
+ document = REXML::Document.new
5
+ urlset = document.add_element("urlset", { "xmlns" => "http://www.sitemaps.org/schemas/sitemap/0.9"})
6
+ Post.all.each do |post|
7
+ url = REXML::Element.new("url")
8
+ urlset.add(url)
9
+ url.add_element("loc").text = post.url
10
+ url.add_element("lastmod").text = post.created_at.strftime('%Y-%m-%d')
11
+ url.add_element("priority").text = "0.5"
12
+ end
13
+ Page.all.each do |page|
14
+ url = REXML::Element.new("url")
15
+ urlset.add(url)
16
+ url.add_element("loc").text = page.url
17
+ url.add_element("priority").text = "0.8"
18
+ end
19
+
20
+ # Generate sitemap for index page
21
+ url = REXML::Element.new("url")
22
+
23
+ url.add_element("loc").text = WhoNeedsWP::options[:url] + "/index.html"
24
+ if Post.all.length > 0
25
+ url.add_element("lastmod").text = Post.all[0].created_at.strftime('%Y-%m-%d')
26
+ end
27
+ url.add_element("priority").text = "1.0"
28
+ urlset.add(url)
29
+
30
+ # Write the XML document to a file
31
+ File.open("sitemap.xml", "w") do |file|
32
+ file.puts document
33
+ end
34
+
35
+ # Create a robots.txt which points to the sitemap.xml
36
+ File.open("robots.txt", "w") do |file|
37
+ file.puts "Sitemap: #{WhoNeedsWP::options[:url]}sitemap.xml"
38
+ end
39
+ end
40
+ end
@@ -1,6 +1,8 @@
1
1
  @import reset-fonts-grids.sass
2
2
  @import base.sass
3
- @import pygments.sass
3
+
4
+ iframe
5
+ border: 0
4
6
 
5
7
  #content.index .navigation
6
8
  display: none
@@ -6,7 +6,7 @@ module WhoNeedsWP
6
6
  end
7
7
 
8
8
  # Render the specified HTML contents within the layout template
9
- def self.render_html(filename, type, contents, title = "")
9
+ def self.render_html(filename, type, contents, title = "", tags = [], summary = "")
10
10
  File.open(filename, "w") do |file|
11
11
  body = @template['body'].render(Object.new, {
12
12
  :content => contents,
@@ -17,7 +17,9 @@ module WhoNeedsWP
17
17
  file.puts @template['layout'].render(Object.new, {
18
18
  :content => body,
19
19
  :options => @options,
20
- :title => title
20
+ :title => title,
21
+ :tags => tags,
22
+ :summary => summary
21
23
  })
22
24
  end
23
25
  end
@@ -1,7 +1,8 @@
1
- %h1 All Posts
2
- %ul
3
- - posts.each do |post|
4
- %li
5
- %span.date= post.created_at.strftime('%Y-%m-%d')
6
- %a.title{:href => "#{post.url}", :title => post.title}= post.title
7
- %p= post.summary
1
+ - if posts.length > 1
2
+ %h1 All Posts
3
+ %ul
4
+ - posts.each do |post|
5
+ %li
6
+ %span.date= post.created_at.strftime('%Y-%m-%d')
7
+ %a.title{:href => "#{post.url}", :title => post.title}= post.title
8
+ %p= post.summary
@@ -0,0 +1 @@
1
+ %iframe{:src => "http://www.google.com/latitude/apps/badge/api?user=#{username}&type=iframe&maptype=terrain", :width => "180", :height => "300"}
@@ -1,10 +1,14 @@
1
- !!! Strict
1
+ !!! 5
2
2
  %html
3
3
  %head
4
4
  - if options[:stylesheet] == nil or options[:stylesheet].empty?
5
5
  %link{:rel => "stylesheet", :type => "text/css", :href => "#{options[:url]}/style.css"}/
6
6
  %link{:rel => "alternate", :type => "application/atom+xml", :href => "#{options[:url]}/posts.atom", :title => "#{options[:title]} - Atom"}/
7
7
  %link{:rel => "alternate", :type => "application/rss+xml", :href => "#{options[:url]}/posts.rss", :title => "#{options[:title]} - RSS"}/
8
+ - if defined? tags and tags != nil and tags.length > 0
9
+ %meta{:name => "keywords", :content => tags.join(' ')}/
10
+ - if defined? summary and summary != nil and !summary.empty?
11
+ %meta{:name => "description", :content => summary.gsub(/<\/?[^>]*>/, "")}/
8
12
  %title
9
13
  = options[:title]
10
14
  - if defined? title and title != nil and not title.empty?
@@ -15,14 +19,16 @@
15
19
  %meta{:"http-equiv" => "Content-Type", :content => "text/html; charset=utf-8"}/
16
20
  %body
17
21
  = content
22
+ - if options[:google_analytics] != nil and not options[:google_analytics].empty?
23
+ %script{:src => 'http://www.google-analytics.com/ga.js', :type => 'text/javascript'}
24
+ = ""
18
25
 
19
- - if options[:google_analytics] != nil and not options[:google_analytics].empty?
20
- %script{:src => 'http://www.google-analytics.com/ga.js', :type => 'text/javascript'}/
21
- :javascript
22
- try {
23
- var pageTracker = _gat._getTracker("#{options[:google_analytics]}");
24
- pageTracker._trackPageview();
25
- } catch(err) {}
26
+ :javascript
27
+ try {
28
+ var pageTracker = _gat._getTracker("#{options[:google_analytics]}");
29
+ pageTracker._trackPageview();
30
+ } catch(err) {}
31
+
26
32
 
27
33
 
28
34
 
@@ -2,8 +2,9 @@
2
2
  .page
3
3
  %h2.title
4
4
  %a{:href => "#{options[:url]}/#{page.filename[:generated]}"}= page.title
5
- .author
6
- by
7
- = page.author
5
+ - if not page.author.empty?
6
+ .author
7
+ by
8
+ = page.author
8
9
  .content
9
- ~ page.markdown
10
+ ~ page.markdown.to_html
@@ -1,4 +1,4 @@
1
- - if pages.length > 0
1
+ - if pages.length > 1
2
2
  %h2 Pages
3
3
  %ul
4
4
  - pages.each do |page|
@@ -8,7 +8,7 @@
8
8
  by
9
9
  = post.author
10
10
  .content
11
- ~ post.markdown
11
+ ~ post.markdown.to_html
12
12
 
13
13
  - if previous_post or next_post
14
14
  .navigation
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 6
8
- - 1
9
- version: 0.6.1
7
+ - 7
8
+ - 0
9
+ version: 0.7.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Owen Griffin
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-03-29 00:00:00 +01:00
17
+ date: 2010-04-21 00:00:00 +01:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -60,49 +60,49 @@ dependencies:
60
60
  type: :runtime
61
61
  version_requirements: *id003
62
62
  - !ruby/object:Gem::Dependency
63
- name: nokogiri
63
+ name: choice
64
64
  prerelease: false
65
65
  requirement: &id004 !ruby/object:Gem::Requirement
66
66
  requirements:
67
67
  - - ">="
68
68
  - !ruby/object:Gem::Version
69
69
  segments:
70
+ - 0
70
71
  - 1
71
72
  - 4
72
- - 1
73
- version: 1.4.1
73
+ version: 0.1.4
74
74
  type: :runtime
75
75
  version_requirements: *id004
76
76
  - !ruby/object:Gem::Dependency
77
- name: open4
77
+ name: net-ssh
78
78
  prerelease: false
79
79
  requirement: &id005 !ruby/object:Gem::Requirement
80
80
  requirements:
81
81
  - - ">="
82
82
  - !ruby/object:Gem::Version
83
83
  segments:
84
- - 1
84
+ - 2
85
85
  - 0
86
- - 1
87
- version: 1.0.1
86
+ - 21
87
+ version: 2.0.21
88
88
  type: :runtime
89
89
  version_requirements: *id005
90
90
  - !ruby/object:Gem::Dependency
91
- name: makers-mark
91
+ name: net-sftp
92
92
  prerelease: false
93
93
  requirement: &id006 !ruby/object:Gem::Requirement
94
94
  requirements:
95
95
  - - ">="
96
96
  - !ruby/object:Gem::Version
97
97
  segments:
98
+ - 2
98
99
  - 0
99
- - 1
100
- - 1
101
- version: 0.1.1
100
+ - 4
101
+ version: 2.0.4
102
102
  type: :runtime
103
103
  version_requirements: *id006
104
104
  - !ruby/object:Gem::Dependency
105
- name: choice
105
+ name: kramdown
106
106
  prerelease: false
107
107
  requirement: &id007 !ruby/object:Gem::Requirement
108
108
  requirements:
@@ -110,39 +110,25 @@ dependencies:
110
110
  - !ruby/object:Gem::Version
111
111
  segments:
112
112
  - 0
113
- - 1
114
- - 4
115
- version: 0.1.4
113
+ - 6
114
+ - 0
115
+ version: 0.6.0
116
116
  type: :runtime
117
117
  version_requirements: *id007
118
118
  - !ruby/object:Gem::Dependency
119
- name: net-ssh
119
+ name: coderay
120
120
  prerelease: false
121
121
  requirement: &id008 !ruby/object:Gem::Requirement
122
122
  requirements:
123
123
  - - ">="
124
124
  - !ruby/object:Gem::Version
125
125
  segments:
126
- - 2
127
126
  - 0
128
- - 21
129
- version: 2.0.21
130
- type: :runtime
131
- version_requirements: *id008
132
- - !ruby/object:Gem::Dependency
133
- name: net-sftp
134
- prerelease: false
135
- requirement: &id009 !ruby/object:Gem::Requirement
136
- requirements:
137
- - - ">="
138
- - !ruby/object:Gem::Version
139
- segments:
127
+ - 9
140
128
  - 2
141
- - 0
142
- - 4
143
- version: 2.0.4
129
+ version: 0.9.2
144
130
  type: :runtime
145
- version_requirements: *id009
131
+ version_requirements: *id008
146
132
  description: A static web site generator.
147
133
  email: owen.griffin@gmail.com
148
134
  executables:
@@ -160,12 +146,14 @@ files:
160
146
  - lib/who-needs-wp/content/Page.rb
161
147
  - lib/who-needs-wp/content/Post.rb
162
148
  - lib/who-needs-wp/css.rb
149
+ - lib/who-needs-wp/keywords.rb
163
150
  - lib/who-needs-wp/sidebar/delicious.rb
151
+ - lib/who-needs-wp/sidebar/latitude.rb
164
152
  - lib/who-needs-wp/sidebar/pageindex.rb
165
153
  - lib/who-needs-wp/sidebar/recentposts.rb
166
154
  - lib/who-needs-wp/sidebar/twitter.rb
155
+ - lib/who-needs-wp/sitemap.rb
167
156
  - lib/who-needs-wp/stylesheets/base.sass
168
- - lib/who-needs-wp/stylesheets/pygments.sass
169
157
  - lib/who-needs-wp/stylesheets/reset-fonts-grids.sass
170
158
  - lib/who-needs-wp/stylesheets/style.sass
171
159
  - lib/who-needs-wp/templates.rb
@@ -173,6 +161,7 @@ files:
173
161
  - lib/who-needs-wp/templates/atom.haml
174
162
  - lib/who-needs-wp/templates/body.haml
175
163
  - lib/who-needs-wp/templates/delicious.haml
164
+ - lib/who-needs-wp/templates/latitude.haml
176
165
  - lib/who-needs-wp/templates/layout.haml
177
166
  - lib/who-needs-wp/templates/page.haml
178
167
  - lib/who-needs-wp/templates/pageindex.haml
@@ -1,140 +0,0 @@
1
- .code
2
- .c
3
- color: #999988
4
- font-style: italic
5
-
6
- .err
7
- color: #a61717
8
- background-color: #e3d2d2
9
-
10
- .k, .o
11
- font-weight: bold
12
-
13
- .cm
14
- color: #999988
15
- font-style: italic
16
-
17
- .cp
18
- color: #999999
19
- font-weight: bold
20
-
21
- .c1
22
- color: #999988
23
- font-style: italic
24
-
25
- .cs
26
- color: #999999
27
- font-weight: bold
28
- font-style: italic
29
-
30
- .gd
31
- color: #000000
32
- background-color: #ffdddd
33
-
34
- .x
35
- color: #000000
36
- background-color: #ffaaaa
37
-
38
- .ge
39
- font-style: italic
40
-
41
- .gr
42
- color: #aa0000
43
-
44
- .gh
45
- color: #999999
46
-
47
- .gi
48
- color: #000000
49
- background-color: #ddffdd
50
-
51
- .x
52
- color: #000000
53
- background-color: #aaffaa
54
-
55
- .go
56
- color: #888888
57
-
58
- .gp
59
- color: #555555
60
-
61
- .gs
62
- font-weight: bold
63
-
64
- .gu
65
- color: #aaaaaa
66
-
67
- .gt
68
- color: #aa0000
69
-
70
- .kc, .kd, .kp, .kr
71
- font-weight: bold
72
-
73
- .kt
74
- color: #445588
75
- font-weight: bold
76
-
77
- .m
78
- color: #009999
79
-
80
- .s
81
- color: #d14
82
-
83
- .na
84
- color: #008080
85
-
86
- .nb
87
- color: #0086B3
88
-
89
- .nc
90
- color: #445588
91
- font-weight: bold
92
-
93
- .no
94
- color: #008080
95
-
96
- .ni
97
- color: #800080
98
-
99
- .ne, .nf
100
- color: #990000
101
- font-weight: bold
102
-
103
- .nn
104
- color: #555555
105
-
106
- .nt
107
- color: #000080
108
-
109
- .nv
110
- color: #008080
111
-
112
- .ow
113
- font-weight: bold
114
-
115
- .w
116
- color: #bbbbbb
117
-
118
- .mf, .mh, .mi, .mo
119
- color: #009999
120
-
121
- .sb, .sc, .sd, .s2, .se, .sh, .si, .sx
122
- color: #d14
123
-
124
- .sr
125
- color: #009926
126
-
127
- .s1
128
- color: #d14
129
-
130
- .ss
131
- color: #990073
132
-
133
- .bp
134
- color: #999999
135
-
136
- .vc, .vg, .vi
137
- color: #008080
138
-
139
- .il
140
- color: #009999