Class: Markdown::Config

Inherits:
Object
  • Object
show all
Defined in:
lib/markdown/config.rb

Constant Summary collapse

DEFAULTS =

note: make kramdown default engine

{ 'libs' => [
     'kramdown' ],
  'extnames' => [
     '.markdown',
     '.m',
     '.mark',
     '.mkdn',
     '.md',
     '.mdown',
     '.markdn',
     '.txt',
     '.text' ],  # todo: check - add .wiki??? ext

  'redcarpet' => {
      'extensions' => [
         'no_intra_emphasis',
         'fenced_code_blocks',
         'tables',
         'strikethrough' ] },   # todo/fix:  merge nested hash??

  'filters' => [
     'comments-percent-style' ] # optional (preprocessing) text filters: e.g. comments-percent-style, skip-end-directive, etc. (see textutils gem)

}

Instance Method Summary collapse

Constructor Details

#initializeConfig

Returns a new instance of Config.



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/markdown/config.rb', line 45

def initialize
  @props = @props_default = Props.new( DEFAULTS, 'DEFAULTS' )

  # check for user settings (markdown.yml) in home folder


  ## todo: use .markdown.yml?? or differnt name ??

  props_home_file = File.join( Env.home, 'markdown.yml' )
  if File.exists?( props_home_file )
    puts "Loading settings from '#{props_home_file}'..."
    @props = @props_home = Props.load_file( props_home_file, @props )
  end
  
  # check for user settings (markdown.yml) in working folder


  props_work_file = File.join( '.', 'markdown.yml' )
  if File.exists?( props_work_file )
    puts "Loading settings from '#{props_work_file}'..."
    @props = @props_work = Props.load_file( props_work_file, @props )
  end

  @libs   = []
  
  require_markdown_libs()
end

Instance Method Details

#dumpObject

for debugging dump all settings



70
71
72
73
74
75
76
77
78
79
# File 'lib/markdown/config.rb', line 70

def dump  # for debugging dump all settings

  puts "Markdown settings:"
  @props_default.dump   if @props_default
  @props_home.dump      if @props_home
  @props_work.dump      if @props_work
  
  puts
  puts "Markdown libs:"
  puts "  #{@libs.length} Markdown #{(@libs.length == 1) ? 'library' : 'libraries'} found: #{@libs.join(', ')}"
end

#known_markdown_libsObject



89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/markdown/config.rb', line 89

def known_markdown_libs
  # returns an array of known markdown engines e.g.

  # [ 'pandoc-ruby', 'rdiscount', 'rpeg-markdown', 'maruku', 'bluecloth', 'kramdown' ]


  ## todo: allow single lib para instead of libs

  ##  todo: allow ENV setting markdown_[select]_lib=xxxx


  ## todo/fix: use lookup with config parent cascade



  ## lookup order

  ## 1)  env variable MARKDOWN_LIB

  ## 2)  lib property (single markdown engine)

  ## 3)  libs property (first-come first-serve markdown engine list)


  user_lib = Env.markdown_lib || @props.fetch( 'lib', nil )

  if user_lib.nil?
    user_libs = @props.fetch( 'libs', nil )
  else
    [ user_lib ]  # return as array (wrap single lib entry)  

  end
end

#markdown_extnamesObject



81
82
83
# File 'lib/markdown/config.rb', line 81

def markdown_extnames
  @props.fetch( 'extnames', nil )
end

#markdown_filtersObject



85
86
87
# File 'lib/markdown/config.rb', line 85

def markdown_filters
  @props.fetch( 'filters', nil )
end

#markdown_libObject



147
148
149
# File 'lib/markdown/config.rb', line 147

def markdown_lib
  @libs.first
end

#markdown_lib=(lib) ⇒ Object



128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/markdown/config.rb', line 128

def markdown_lib=( lib )
  
  # fix/todo: check if @libs.first == lib  => do nothing; return

  
  # check if value exists in libs array

  # if yes put it into first position

  # otherwise issue warning/error - better throw exception; engine not found

  
  # try to delete 

  obj = @libs.delete( lib )
  if obj.nil?  # nothing deleted; no obj found

    # try to require; will raise load error exception if not found; know what your're doing! no fallback; sorry; better fail fast

    require lib
  end
 
  # add it back; make it first entry

  @libs.unshift( lib )
end

#markdown_lib_defaultsObject



151
152
153
154
# File 'lib/markdown/config.rb', line 151

def markdown_lib_defaults
  ## todo: return props ? that acts like a hash?? (lets us support section lookup without deep merge???)

  opts = @props.fetch( @libs.first, {} )
end

#markdown_to_html_methodObject



156
157
158
159
160
# File 'lib/markdown/config.rb', line 156

def markdown_to_html_method
  lib  = @libs.first
  method = @props.fetch_from_section( lib, 'converter', "#{lib.downcase}_to_html" )  # default to <lib>_to_html if converter prop not found    

  method.tr('-','_').to_sym
end

#require_markdown_libsObject



113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/markdown/config.rb', line 113

def require_markdown_libs
  # check for available markdown libs/gems

  # try to require each lib and remove any not installed


  known_markdown_libs.each do |lib|
    begin
      require lib
      @libs << lib
    rescue LoadError => ex
      ## todo: use logger.debug  instead of puts

      puts "Markdown library #{lib} not found. Use gem install #{lib} to install."
    end
  end
end