From 1819d71ff77d1899e2b23ab42549bd2f2494248c Mon Sep 17 00:00:00 2001 From: Thibaut Date: Sat, 14 Jun 2014 11:16:38 -0400 Subject: [PATCH] Update Haskell scraper --- assets/images/icons.png | Bin 19239 -> 19770 bytes assets/images/icons@2x.png | Bin 49711 -> 50387 bytes .../templates/pages/about_tmpl.coffee | 5 + .../templates/pages/news_tmpl.coffee | 5 +- assets/stylesheets/application.css.scss | 1 + assets/stylesheets/global/_icons.scss | 1 + assets/stylesheets/pages/_haskell.scss | 132 ++------------ lib/docs/filters/haskell/clean_html.rb | 161 ++++-------------- lib/docs/filters/haskell/entries.rb | 81 +++++---- lib/docs/scrapers/haskell.rb | 30 ++-- public/icons/docs/haskell/16.png | Bin 994 -> 624 bytes public/icons/docs/haskell/16@2x.png | Bin 1287 -> 705 bytes public/icons/docs/haskell/SOURCE | 1 + 13 files changed, 120 insertions(+), 297 deletions(-) create mode 100644 public/icons/docs/haskell/SOURCE diff --git a/assets/images/icons.png b/assets/images/icons.png index 719b11cc7a9b1a0654016ecca82d5018ed6b0380..01e9dda810b0efebed303f030ff4b6d6a5d8cdec 100644 GIT binary patch delta 10079 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 Bt9Sqa delta 9544 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 diff --git a/assets/images/icons@2x.png b/assets/images/icons@2x.png index 35b9fa1d5fe1b6c2c1414d28cd4ab65ba49087e5..483e2bd224403e05d7934f720bdda7866bc37d42 100644 GIT binary patch delta 9656 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 diff --git a/assets/javascripts/templates/pages/about_tmpl.coffee b/assets/javascripts/templates/pages/about_tmpl.coffee index a8fee2d1..807646f4 100644 --- a/assets/javascripts/templates/pages/about_tmpl.coffee +++ b/assets/javascripts/templates/pages/about_tmpl.coffee @@ -130,6 +130,11 @@ credits = [ '2014 Grunt Team', 'MIT', 'https://raw.githubusercontent.com/gruntjs/gruntjs.com/master/LICENSE' + ], [ + 'Haskell', + 'The University of Glasgow', + 'BSD', + 'http://www.haskell.org/ghc/license' ], [ 'HTTP', '1999 The Internet Society', diff --git a/assets/javascripts/templates/pages/news_tmpl.coffee b/assets/javascripts/templates/pages/news_tmpl.coffee index 84f9e6e6..ec995de1 100644 --- a/assets/javascripts/templates/pages/news_tmpl.coffee +++ b/assets/javascripts/templates/pages/news_tmpl.coffee @@ -24,7 +24,10 @@ newsItem = (date, news) -> result app.news = [ - [ 1400976000000, # May 25, 2014 + [ 1402704000000, # June 14, 2014 + """ New Haskell documentation """, + ], [ + 1400976000000, # May 25, 2014 """ New Laravel documentation """, ], [ 1399161600000, # May 4, 2014 diff --git a/assets/stylesheets/application.css.scss b/assets/stylesheets/application.css.scss index 57f3e5cb..2e83da64 100644 --- a/assets/stylesheets/application.css.scss +++ b/assets/stylesheets/application.css.scss @@ -35,6 +35,7 @@ 'pages/ember', 'pages/express', 'pages/go', + 'pages/haskell', 'pages/jquery', 'pages/knockout', 'pages/git', diff --git a/assets/stylesheets/global/_icons.scss b/assets/stylesheets/global/_icons.scss index c3ff5cb0..ef0df71e 100644 --- a/assets/stylesheets/global/_icons.scss +++ b/assets/stylesheets/global/_icons.scss @@ -57,3 +57,4 @@ ._icon-grunt:before { background-position: -3rem -8rem; } ._icon-maxcdn:before { background-position: -4rem -8rem; } ._icon-laravel:before { background-position: 0 -9rem; } +._icon-haskell:before { background-position: -1rem -9rem; } diff --git a/assets/stylesheets/pages/_haskell.scss b/assets/stylesheets/pages/_haskell.scss index 15b026b6..29928795 100644 --- a/assets/stylesheets/pages/_haskell.scss +++ b/assets/stylesheets/pages/_haskell.scss @@ -1,121 +1,25 @@ -._icon-haskell:before { - background-image: image-url('/icons/docs/haskell/16.png'); - background-size: cover; - background-repeat: no-repeat; -} - -.empty-table .empty { - display: none; -} - -.arguments td.src { - background: #faf9e2; - width: 30%; -} - -th.src, -td.src { - font-family: $monoFont; - font-weight: normal; - font-style: normal; - background: #f8f8f8; -} - -caption { - font-weight: bold; - text-align: left; - font-style: italic; - font-size: 1.1em; -} - -// remove margin in descript listing -dd > pre { - @extend %pre; - margin: 0; - background: #faf9e2; - border-color: #dddaaa #dddaaa #d7d7a9; -} - -// warnings are red -.warning { - @extend %note; - @extend %note-red; -} - - -// complexity classes are blue boxes -.with-complexity { - display: flex; - display: -webkit-flex; - - justify-content: space-between; - -webkit-justify-content: space-between; +._haskell { + > h2 { @extend %block-heading; } + > h3 { @extend %block-label; } + h4 { font-size: 1em; } - align-items: flex-start; - -webkit-align-items: flex-start; + .module + .package, p.src > .link { float: right; } - align-content: stretch; - -webkit-align-content: stretch; -} - -.complexity { - @extend %note; - @extend %note-blue; - margin: 0; - margin-left: 1em; - margin-bottom: 0.75em; - font-style: italic; - white-space: nowrap; - - flex-shrink: 0; - -webkit-flex-shrink: 0; - - order: 2; - -webkit-order: 2; -} - -.complexity + span { - order: 1; - -webkit-order: 1; -} - -// add box type to "since: ..." -.added { - @extend %note; - @extend %note-gold; -} - -.added-cell { - @extend %note-gold; -} - -.fields h3 { - display: none; -} + .src { + white-space: normal; + @extend %code; + } + p.src { @extend %block-label, %label-blue; } + dt.src { white-space: normal; } -// separate types more -.src { - margin-top: 2.5em; -} + .top > .subs { margin-left: 2em; } + .subs p.src { margin-top: 1em; } -h1 + .top .src, -h2 + .top .src, -h3 + .top .src, -.caption + .top .src { - margin-top: 0; -} + dt > code, .complexity, .version { @extend %label; } + .complexity, .version { @extend %label-green; } -// but not for first type -h1 + .top, -h2 + .top, -h3 + .top, -h4 + .top { - margin-top: 0; -} + table { margin: 1em 0; } + td > pre { margin: 0; } -// change color of example code -.example { - border: 1px solid; - background: #faf9e2; - border-color: #dddaaa #dddaaa #d7d7a9; + .warning { @extend %note; } } diff --git a/lib/docs/filters/haskell/clean_html.rb b/lib/docs/filters/haskell/clean_html.rb index 5f6105a7..130dfe69 100644 --- a/lib/docs/filters/haskell/clean_html.rb +++ b/lib/docs/filters/haskell/clean_html.rb @@ -2,146 +2,54 @@ module Docs class Haskell class CleanHtmlFilter < Filter def call + root_page? ? root : other + doc + end - # remove unwanted elements - css('#footer', '#package-header', '#module-header', '#synopsis', '.link', '#table-of-contents', '.package').remove - - # cpations in tables are h3 - css('table .caption').each do |node| - node.name = 'h3' - end - - # turn captions into real headers - css('.caption').each do |node| - node.name = 'h1' - end - - # section - css('.top > .caption').each do |node| - node.name = 'h2' - end - - # subsections - css('.top > .subs > .caption', '.fields > .caption').each do |node| - node.name = 'h3' - end - - # subsubsections - css('.top > .subs > .subs > .caption').each do |node| - node.name = 'h4' - end - - # ... - css('.top > .subs > .subs > .subs > .caption').each do |node| - node.name = 'h5' - end - - # ...... - css('.top > .subs > .subs > .subs > .subs > .caption').each do |node| - node.name = 'h6' - end - - # all pre's are examples - css('pre').each do |node| - node.add_css_class('example') + def root + css('#description', '#module-list').each do |node| + node.before(node.children).remove end + end - # turn source listing in to pre - css('.src').each do |node| - if node.name != "td" - node.name = 'pre' - end + def other + css('h1').each do |node| + node.remove if node.content == 'Documentation' end - # check if second column of table is totally empty. - # and remove it if it is - css('table').each do |table| - empty = true - table.css('td + td').each do |snd| - empty = empty && snd['class'] =~ /empty/ - end - if empty - # remove empty column - table.css('td + td').remove - end + css('h1, h2, h3, h4').each do |node| + node.name = node.name.sub(/\d/) { |i| i.to_i + 1 } end - # move table captions into the tables - css(".caption + table").each do |table| - caption = table.previous - caption.name = "caption" - caption.parent = table + at_css('#module-header').tap do |node| + heading = at_css('.caption') + heading.name = 'h1' + node.before(heading) + node.before(node.children).remove end - css(".caption + .show table").each do |table| - caption = table.parent.parent.css('.caption')[0] - caption.name = 'caption' - caption.parent = table - end + css('#synopsis').remove - # better arguments display: - css('.src + .arguments table').each do |table| - src = table.parent.previous # the function name - row = doc.document.create_element('tr') - table.css('tr')[0].before(row) - src.parent = row - src.name = "th" - src['colspan'] = 2 + css('#interface', 'h2 code').each do |node| + node.before(node.children).remove end - # remove root page title - if root_page? - at_css('h1').remove + css('a[name]').each do |node| + node['id'] = node['name'] + node.remove_attribute('name') end - # add id to links (based on name) - css('a').each do |node| - if node['name'] - node['id'] = node['name'] - end - end - - # make code in description into proper pre - css('dd > code').each do |node| - node.name = 'pre' + css('p.caption').each do |node| + node.name = 'h4' end - # add some informational boxes css('em').each do |node| - if node.content == 'Deprecated.' - # Make deprecated messages red. - node.parent.add_css_class('warning') - elsif node.content =~ /O\(.*\)/ - # this is big_O notation, but only apply the class if this is not - # inside running text (it must be at the start of a paragraph) - # from: - #

O(n). Koel ok

- # to: - #

- # O(n) - # Koel ok - #

- if node.previous == nil - node.add_css_class('complexity') # add css class - node.name="span" # just make it div - node.next.content = node.next.content.gsub(/^. /, "") # remove . if directly after em - node.content = node.content.gsub(/\.$/, "") # remove trailing . if it's inside em - - # reparent the nodes - cont = doc.document.create_element "p", :class => "with-complexity" - node.parent.previous = cont - par = node.parent - node.parent = cont - par.parent = cont - par.name = "span" - end - elsif node.content =~ /Since: .*/ - # add box to 'Since:' annotations - if node.parent.parent.name == "td" - node.parent.parent.add_css_class('added-cell') - else - node.add_css_class('added') - end + if node.content.start_with?('O(') + node.name = 'span' + node['class'] = 'complexity' + elsif node.content.start_with?('Since') + node.name = 'span' + node['class'] = 'version' end end @@ -150,10 +58,3 @@ module Docs end end end - -class Nokogiri::XML::Node - def add_css_class( *classes ) - existing = (self['class'] || "").split(/\s+/) - self['class'] = existing.concat(classes).uniq.join(" ") - end -end diff --git a/lib/docs/filters/haskell/entries.rb b/lib/docs/filters/haskell/entries.rb index c0fbcbb6..edfaabae 100644 --- a/lib/docs/filters/haskell/entries.rb +++ b/lib/docs/filters/haskell/entries.rb @@ -1,55 +1,54 @@ module Docs class Haskell class EntriesFilter < Docs::EntriesFilter + IGNORE_ENTRIES_PATHS = %w( + bytestring-0.10.4.0/Data-ByteString-Lazy.html + bytestring-0.10.4.0/Data-ByteString-Char8.html + bytestring-0.10.4.0/Data-ByteString-Lazy-Char8.html + array-0.5.0.0/Data-Array-IArray.html + containers-0.5.5.1/Data-IntMap-Lazy.html + containers-0.5.5.1/Data-Map-Lazy.html + unix-2.7.0.1/System-Posix-Files-ByteString.html + filepath-1.3.0.2/System-FilePath-Windows.html + transformers-0.3.0.0/Control-Monad-Trans-RWS-Lazy.html + transformers-0.3.0.0/Control-Monad-Trans-Writer-Lazy.html + base-4.7.0.0/GHC-Conc-Sync.html + base-4.7.0.0/GHC-IO-Encoding-UTF32.html + unix-2.7.0.1/System-Posix-Terminal-ByteString.html) - # gets name and type in one fell swoop - # - # eg. - # Control.Monad > [Monad, Control] - # Control.Concurrent.Mvar > [Concurrent.MVar, Control] - # Array > [Array, nil] - def get_name_and_type - if at_css('h1') && at_css('h1').content == 'Haskell Hierarchical Libraries' - puts 'ok' - name = 'Haskell' - type = nil - else - # find full module identifier - caption = at_css('#module-header .caption') + def get_name + at_css('#module-header .caption').content.strip + end - if caption - # split the module path - parts = caption.content.split('.') + def get_type + %w(System.Posix System.Win32 Control.Monad).each do |type| + return type if name.start_with?(type) + end - if parts.length > 1 - # if more than one part then the - # first is the type and the rest is the name - type = parts[0] - name = parts.drop(1).join('.') - else - # if only one part, this is the name - name = parts[0] - type = nil - end - else - # no caption found -> no type / no name - name = 'no-name' - type = 'no-type' - end + if name.start_with?('Data') + name.split('.')[0..1].join('.') + else + name.split('.').first end - [name, type] end - # get the name - def get_name - n, t = get_name_and_type() - n + def additional_entries + return [] if IGNORE_ENTRIES_PATHS.include?(subpath) + + css('#synopsis > ul > li').each_with_object [] do |node, entries| + link = node.at_css('a') + next unless link['href'].start_with?('#') + name = node.content.strip + name.remove! %r{\A(?:module|data|newtype|class|type family m|type)\s+} + name.sub! %r{\A\((.+?)\)}, '\1' + name.sub!(/ (?:\:\: (\w+))?.+\z/) { |_| $1 ? " (#{$1})" : '' } + next if name == self.name + entries << [name, link['href'].remove('#')] + end end - # get the type - def get_type - n, t = get_name_and_type() - t + def include_default_entry? + at_css('#synopsis > ul > li') end end end diff --git a/lib/docs/scrapers/haskell.rb b/lib/docs/scrapers/haskell.rb index 9fbb7af0..eec02b3b 100755 --- a/lib/docs/scrapers/haskell.rb +++ b/lib/docs/scrapers/haskell.rb @@ -1,24 +1,32 @@ module Docs class Haskell < UrlScraper self.name = 'Haskell' - self.slug = 'haskell' self.type = 'haskell' self.version = '7.8.2' self.base_url = 'http://www.haskell.org/ghc/docs/7.8.2/html/libraries/' - self.initial_paths = ['/index.html'] + self.root_path = 'index.html' - html_filters.push 'haskell/entries' - html_filters.push 'haskell/clean_html' - html_filters.push 'title' + html_filters.push 'haskell/entries', 'haskell/clean_html' + options[:container] = '#content' - options[:container] = '#content' - options[:skip_patterns] = [/src/, /index/, /haskell2010/, /ghc-/, /Cabal-/] # skip source listings and index files + options[:skip] = %w( + hoopl-3.10.0.1/Compiler-Hoopl-Internals.html + base-4.7.0.0/Control-Exception-Base.html + binary-0.7.1.0/Data-Binary-Get-Internal.html + template-haskell-2.9.0.0/Language-Haskell-TH-Lib.html + haskell98-2.0.0.3/Prelude.html + pretty-1.1.1.1/Text-PrettyPrint.html + base-4.7.0.0/Data-OldTypeable-Internal.html + base-4.7.0.0/Data-Typeable-Internal.html + base-4.7.0.0/GHC-IO-Encoding-Types.html + unix-2.7.0.1/System-Posix-Process-Internals.html) + + options[:skip_patterns] = [/src\//, /doc-index/, /haskell2010/, /ghc-/, /Cabal-/] options[:attribution] = <<-HTML - © The University Court of the University of Glasgow.
- All rights reserved. See here for more info + © The University of Glasgow and others
+ Licensed under a BSD-style license (see top of the page). HTML - - end + end end diff --git a/public/icons/docs/haskell/16.png b/public/icons/docs/haskell/16.png index 97f907327a1712d03ddb9a35d275f42fdbe8ea8e..8a66915c7ee19af5727ea8301d44d74f48d97831 100644 GIT binary patch delta 610 zcmV-o0-gQh2k-=t8Gi-<001BJ|6u?C0yjxSK~#9!rBmNalTjFcwh6NDn-Y}9*4U5S zwNw|;MX;bQtSIne5Zy&+O-r|2vrBK1Lc0jMsLO&OiDxd@swA-pWKi3%^KR(f!R{rDnkC@KcXn2Y(w zHqID6mJF{(-haJ~b4{Cd3XsZ54<3Y2Q%Y`cMUp8DGY#^LSQ&1J^0{Gg-l)+smKEgt z8!fX4RVqTYP6Tl2Nf>oyWwu?bsA!UIJY==0lMCi7E5>71jT~PX)2x`I8wn(h`$4QI z6}PsaivzgEB-L|>sfX+|TBQ%;a#oP_ wf+i&#An^0lIsSRb);BfqgWcX+JO914Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>h>wg}@|4a}Uh}Ot495iJBiR3^LL>x$NRATs(g+&~w<)jtE|6COHK*8712*Lkb zIQ}2w0@-zx3vS>h6^6e+1G5?aw==_Kk=1~V-HgzPtapnV%y6K+2cafI6ugN7y98)# z9}B`*n0NkfL^2RA2xkCw6cKQo5{k-&Be^c&CbZdb5dmDa-jW;N#5=*P2HRSy8tTTc*4`gF+}2Wa)JWK4NHriJ1Q%FN+dGjoE9&dw5e;=tX*sZ8Ab+%nVGL&yfS?uEg>Z-J$nYz)EP6qy&@S* zBcmd3N8Dy&o$=<4tjt`gIk7Q!@7%R*V4COPyl0QJR87s_KYy7YSTQwAH90#SJ|sEA z!XeGg#m)8jkz+@VHyfy^n5n5QU$JD_(sYxQu8o@vQ&OKldG=IX#K=fY^z^hTMn+Sn zhKGcOUN#D8(*_4n*TvgVi~T3y=TM*+M*r8r^*xGo`oyHHP(w zBy=!Z#Wy}<4BvvdHqFArE5ufengCOjVjrbgLWggl#x=cP6y^Op&>Xc34^M7$vZeUY zTOunc#SV{BOzJVI(~(#?@4pWrfNv@8_HD{+Q0*S8;(whsNGYYL<{O>39iS8SwqqOO zFs4m_v4;s+t0!e09gahdtNE-79^Tvtyzm-<{>_;YxM)YfnM9px@f`j{Bf8M(qdw^0 zH)Gmo4(zmZz<8@iGpk}R-xw?etctF@0t5_wH<22}>mDxBRdNm!QTF?<~{d*iyIituo@a^Gb|*oCW&>&VuWRAb~-s z(SgW}PQzCl+!kzRJ%-I`Sc?f;3e?QxK9J1gJ`h0%)EGn}uN#p$hWnw$O`jW4DTbiN zWkmA16ZW_}VO!A98$qS`i5jl}6=*_BmgcNmaV-PVXmL{51_@AvL*~6!)OwVlux0}k aJitHfuKsEt;7XYQ0000!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+081LO4opAc7|g0=Dt|BrG3 zNo2HIj^Teb!~Yx<1Xr+6AG`P(psr$s6kPpsDTe=fSj6Gx099hui=y!;7to!^PCaM{ zGc$?d|8b}+ni>>i7qG!)mrKH&l*RD>3^&BsgGMj|Gf)hKdt?RBBZW{kK*2-CF!ldM z;U+_UnhG-k7=}yO5GKQ{1F8qP0UpA@@Hq`~2FSs1K`>*#0lElK0nm0dWl#}d5dHr@ zL4!9C7_~D?g8YJkv{FTVU6l%FWa$Xh)97Atya5^LF?YpTv~J_ZPG zo5$56XB8uMcmhlLRTY=F{vsOcLfhwZwVsx8xbxz9rS-F~QQ}AXxTdvTQFi^{BY%Dl zciSmx=P8qY6aT)@(S6ywgS*{_DRX+I+exX2uRUB`Pu_be9DS)0)Nw*aLM^(VS?YK< zm$%nM>CShx8MXFoan{%SE&(0KnB?v5GN*9QA$1^!v%n*=n1Ml08H5=tmfDvA6|{M} zIEGl9PEL^EYM9wNwYPU}^W^T??d{X~yP4`5XF4cosOT7FU(*RR)X_Sk+Q6lYVsb*=aAV;|P62`W9K{(yMgfjqSy5IeCh;h< zshRZONNMstaf)rGfwqadxxT#|&jK|AF_q@K0USll0wSW*r!3mRcvM^=AZ%X$8iu6C zSXUE|bw(l{A)(i=TswG}QEJjx0e>@-rYWYT+atC!FvUoKoMo#GO%?$veaGW+rsbp>6sF0dr|zj5%IJj>~p z0k;D~&PkOH)icK?tNZIccrfRXb*a{QlNBp3r!!RE*?Z-bcp XtHiCLV4K!9paup{S3j3^P6