Repository files navigation

ReadSharp

ReadSharp was previously PocketSharp.Reader and is now hosted without the PocketSharp dependency.

Install ReadSharp using NuGet

Install-Package ReadSharp

What's it all about?

The library extracts the main content of a website and returns the article as HTML with it's associated title, description, favicon and all included images.

The content can be encapsulated in a <body>-Tag and displayed as a readable website with a custom CSS (it's up to you!).

ReadSharp is based on a custom PCL port of NReadability and SgmlReader, which are included in the solution.

Association with Pocket

This library is a replacement for the Article View API by Pocket which is limited by usage and privacy.

With ReadSharp you won't hit any usage limits, as you are extracting the content directly. And it's open source.


Example

usingReadSharp;Readerreader=newReader();Articlearticle;try{article=awaitreader.Read(newUri("http://frontendplay.com/story/4/http-caching-demystified-part-2-implementation"));}catch(ReadExceptionexc){// handle exception}

Options

HttpOptions

You can pass HttpOptions to the Reader constructor, which count for all requests:

  • HttpMessageHandlerCustomHttpHandler
    Use your own HTTP handler
  • int?RequestTimeout
    Define a custom timeout in seconds, after which requests should cancel
  • stringUserAgent
    Override the user agent, which is passed to the destination server
  • boolUseMobileUserAgent
    There are desktop and mobile default user agents. By enabling this property, the mobile user agent is used. If you pass a custom user agent, this property is ignored!

ReadOptions

There are also ReadOptions available, which are passed on every request:

  • boolHasHeaderTags
    Return complete HTML document or just the body part
  • boolHasNoHeadline
    Removes <h1> title from the article
  • boolUseDeepLinks
    If you check this option, deep-links (containing hashes, e.g. href="#article") are not transformed into absolute URIs
  • boolPrettyPrint
    Determines whether the HTML output will be formatted

Article Model

The Article contains following fields:

  • stringTitle (the title of the page)
  • stringDescription (description of the page, extracted from meta information)
  • stringContent (contains the article)
  • UriFrontImage (main page image extracted from meta tags like apple-touch-icon and others)
  • UriFavicon (the favicon of the page)
  • List<ArticleImage>Images (contains all images found in the text)
  • stringNextPage (contains the next page URI, if available)

Article Image

  • UriUri
  • stringTitle (extracted from the title attribute)
  • stringAlternativeText (extracted from the alt attribute)

Supported platforms

ReadSharp is a Portable Class Library, therefore it's compatible with multiple platforms:

  • .NET >= 4.0.3 (including WPF)
  • Silverlight >= 4
  • Windows Phone >= 7.5
  • Windows Store

Forked Dependencies

forks are included in the primary source code

Contributors

ceee
ceee

License

MIT License

About

Extract meaningful website contents using a port of NReadability

Resources

Stars

0 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

ReadSharp

ReadSharp was previously PocketSharp.Reader and is now hosted without the PocketSharp dependency.

Install ReadSharp using NuGet

Install-Package ReadSharp

What's it all about?

The library extracts the main content of a website and returns the article as HTML with it's associated title, description, favicon and all included images.

The content can be encapsulated in a <body>-Tag and displayed as a readable website with a custom CSS (it's up to you!).

ReadSharp is based on a custom PCL port of NReadability and SgmlReader, which are included in the solution.

Association with Pocket

This library is a replacement for the Article View API by Pocket which is limited by usage and privacy.

With ReadSharp you won't hit any usage limits, as you are extracting the content directly. And it's open source.


Example

usingReadSharp;Readerreader=newReader();Articlearticle;try{article=awaitreader.Read(newUri("http://frontendplay.com/story/4/http-caching-demystified-part-2-implementation"));}catch(ReadExceptionexc){// handle exception}

Options

HttpOptions

You can pass HttpOptions to the Reader constructor, which count for all requests:

  • HttpMessageHandlerCustomHttpHandler
    Use your own HTTP handler
  • int?RequestTimeout
    Define a custom timeout in seconds, after which requests should cancel
  • stringUserAgent
    Override the user agent, which is passed to the destination server
  • boolUseMobileUserAgent
    There are desktop and mobile default user agents. By enabling this property, the mobile user agent is used. If you pass a custom user agent, this property is ignored!

ReadOptions

There are also ReadOptions available, which are passed on every request:

  • boolHasHeaderTags
    Return complete HTML document or just the body part
  • boolHasNoHeadline
    Removes <h1> title from the article
  • boolUseDeepLinks
    If you check this option, deep-links (containing hashes, e.g. href="#article") are not transformed into absolute URIs
  • boolPrettyPrint
    Determines whether the HTML output will be formatted

Article Model

The Article contains following fields:

  • stringTitle (the title of the page)
  • stringDescription (description of the page, extracted from meta information)
  • stringContent (contains the article)
  • UriFrontImage (main page image extracted from meta tags like apple-touch-icon and others)
  • UriFavicon (the favicon of the page)
  • List<ArticleImage>Images (contains all images found in the text)
  • stringNextPage (contains the next page URI, if available)

Article Image

  • UriUri
  • stringTitle (extracted from the title attribute)
  • stringAlternativeText (extracted from the alt attribute)

Supported platforms

ReadSharp is a Portable Class Library, therefore it's compatible with multiple platforms:

  • .NET >= 4.0.3 (including WPF)
  • Silverlight >= 4
  • Windows Phone >= 7.5
  • Windows Store

Forked Dependencies

forks are included in the primary source code

Contributors

ceee
ceee

License

MIT License

About

Extract meaningful website contents using a port of NReadability

Resources

Stars

0 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ReadSharp

ReadSharp was previously PocketSharp.Reader and is now hosted without the PocketSharp dependency.

Install ReadSharp using NuGet

Install-Package ReadSharp

What's it all about?

The library extracts the main content of a website and returns the article as HTML with it's associated title, description, favicon and all included images.

The content can be encapsulated in a <body>-Tag and displayed as a readable website with a custom CSS (it's up to you!).

ReadSharp is based on a custom PCL port of NReadability and SgmlReader, which are included in the solution.

Association with Pocket

This library is a replacement for the Article View API by Pocket which is limited by usage and privacy.

With ReadSharp you won't hit any usage limits, as you are extracting the content directly. And it's open source.


Example

usingReadSharp;Readerreader=newReader();Articlearticle;try{article=awaitreader.Read(newUri("http://frontendplay.com/story/4/http-caching-demystified-part-2-implementation"));}catch(ReadExceptionexc){// handle exception}

Options

HttpOptions

You can pass HttpOptions to the Reader constructor, which count for all requests:

  • HttpMessageHandlerCustomHttpHandler
    Use your own HTTP handler
  • int?RequestTimeout
    Define a custom timeout in seconds, after which requests should cancel
  • stringUserAgent
    Override the user agent, which is passed to the destination server
  • boolUseMobileUserAgent
    There are desktop and mobile default user agents. By enabling this property, the mobile user agent is used. If you pass a custom user agent, this property is ignored!

ReadOptions

There are also ReadOptions available, which are passed on every request:

  • boolHasHeaderTags
    Return complete HTML document or just the body part
  • boolHasNoHeadline
    Removes <h1> title from the article
  • boolUseDeepLinks
    If you check this option, deep-links (containing hashes, e.g. href="#article") are not transformed into absolute URIs
  • boolPrettyPrint
    Determines whether the HTML output will be formatted

Article Model

The Article contains following fields:

  • stringTitle (the title of the page)
  • stringDescription (description of the page, extracted from meta information)
  • stringContent (contains the article)
  • UriFrontImage (main page image extracted from meta tags like apple-touch-icon and others)
  • UriFavicon (the favicon of the page)
  • List<ArticleImage>Images (contains all images found in the text)
  • stringNextPage (contains the next page URI, if available)

Article Image

  • UriUri
  • stringTitle (extracted from the title attribute)
  • stringAlternativeText (extracted from the alt attribute)

Supported platforms

ReadSharp is a Portable Class Library, therefore it's compatible with multiple platforms:

  • .NET >= 4.0.3 (including WPF)
  • Silverlight >= 4
  • Windows Phone >= 7.5
  • Windows Store

Forked Dependencies

forks are included in the primary source code

Contributors

ceee
ceee

License

MIT License

About

Extract meaningful website contents using a port of NReadability

Resources

Stars

0 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ReadSharp

ReadSharp was previously PocketSharp.Reader and is now hosted without the PocketSharp dependency.

Install ReadSharp using NuGet

Install-Package ReadSharp

What's it all about?

The library extracts the main content of a website and returns the article as HTML with it's associated title, description, favicon and all included images.

The content can be encapsulated in a <body>-Tag and displayed as a readable website with a custom CSS (it's up to you!).

ReadSharp is based on a custom PCL port of NReadability and SgmlReader, which are included in the solution.

Association with Pocket

This library is a replacement for the Article View API by Pocket which is limited by usage and privacy.

With ReadSharp you won't hit any usage limits, as you are extracting the content directly. And it's open source.


Example

usingReadSharp;Readerreader=newReader();Articlearticle;try{article=awaitreader.Read(newUri("http://frontendplay.com/story/4/http-caching-demystified-part-2-implementation"));}catch(ReadExceptionexc){// handle exception}

Options

HttpOptions

You can pass HttpOptions to the Reader constructor, which count for all requests:

  • HttpMessageHandlerCustomHttpHandler
    Use your own HTTP handler
  • int?RequestTimeout
    Define a custom timeout in seconds, after which requests should cancel
  • stringUserAgent
    Override the user agent, which is passed to the destination server
  • boolUseMobileUserAgent
    There are desktop and mobile default user agents. By enabling this property, the mobile user agent is used. If you pass a custom user agent, this property is ignored!

ReadOptions

There are also ReadOptions available, which are passed on every request:

  • boolHasHeaderTags
    Return complete HTML document or just the body part
  • boolHasNoHeadline
    Removes <h1> title from the article
  • boolUseDeepLinks
    If you check this option, deep-links (containing hashes, e.g. href="#article") are not transformed into absolute URIs
  • boolPrettyPrint
    Determines whether the HTML output will be formatted

Article Model

The Article contains following fields:

  • stringTitle (the title of the page)
  • stringDescription (description of the page, extracted from meta information)
  • stringContent (contains the article)
  • UriFrontImage (main page image extracted from meta tags like apple-touch-icon and others)
  • UriFavicon (the favicon of the page)
  • List<ArticleImage>Images (contains all images found in the text)
  • stringNextPage (contains the next page URI, if available)

Article Image

  • UriUri
  • stringTitle (extracted from the title attribute)
  • stringAlternativeText (extracted from the alt attribute)

Supported platforms

ReadSharp is a Portable Class Library, therefore it's compatible with multiple platforms:

  • .NET >= 4.0.3 (including WPF)
  • Silverlight >= 4
  • Windows Phone >= 7.5
  • Windows Store

Forked Dependencies

forks are included in the primary source code

Contributors

ceee
ceee

License

MIT License

About

Extract meaningful website contents using a port of NReadability

Resources

Stars

0 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

ReadSharp

ReadSharp was previously PocketSharp.Reader and is now hosted without the PocketSharp dependency.

Install ReadSharp using NuGet

Install-Package ReadSharp

What's it all about?

The library extracts the main content of a website and returns the article as HTML with it's associated title, description, favicon and all included images.

The content can be encapsulated in a <body>-Tag and displayed as a readable website with a custom CSS (it's up to you!).

ReadSharp is based on a custom PCL port of NReadability and SgmlReader, which are included in the solution.

Association with Pocket

This library is a replacement for the Article View API by Pocket which is limited by usage and privacy.

With ReadSharp you won't hit any usage limits, as you are extracting the content directly. And it's open source.


Example

usingReadSharp;Readerreader=newReader();Articlearticle;try{article=awaitreader.Read(newUri("http://frontendplay.com/story/4/http-caching-demystified-part-2-implementation"));}catch(ReadExceptionexc){// handle exception}

Options

HttpOptions

You can pass HttpOptions to the Reader constructor, which count for all requests:

  • HttpMessageHandlerCustomHttpHandler
    Use your own HTTP handler
  • int?RequestTimeout
    Define a custom timeout in seconds, after which requests should cancel
  • stringUserAgent
    Override the user agent, which is passed to the destination server
  • boolUseMobileUserAgent
    There are desktop and mobile default user agents. By enabling this property, the mobile user agent is used. If you pass a custom user agent, this property is ignored!

ReadOptions

There are also ReadOptions available, which are passed on every request:

  • boolHasHeaderTags
    Return complete HTML document or just the body part
  • boolHasNoHeadline
    Removes <h1> title from the article
  • boolUseDeepLinks
    If you check this option, deep-links (containing hashes, e.g. href="#article") are not transformed into absolute URIs
  • boolPrettyPrint
    Determines whether the HTML output will be formatted

Article Model

The Article contains following fields:

  • stringTitle (the title of the page)
  • stringDescription (description of the page, extracted from meta information)
  • stringContent (contains the article)
  • UriFrontImage (main page image extracted from meta tags like apple-touch-icon and others)
  • UriFavicon (the favicon of the page)
  • List<ArticleImage>Images (contains all images found in the text)
  • stringNextPage (contains the next page URI, if available)

Article Image

  • UriUri
  • stringTitle (extracted from the title attribute)
  • stringAlternativeText (extracted from the alt attribute)

Supported platforms

ReadSharp is a Portable Class Library, therefore it's compatible with multiple platforms:

  • .NET >= 4.0.3 (including WPF)
  • Silverlight >= 4
  • Windows Phone >= 7.5
  • Windows Store

Forked Dependencies

forks are included in the primary source code

Contributors

ceee
ceee

License

MIT License

About

Extract meaningful website contents using a port of NReadability

Resources

Stars

0 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ReadSharp

ReadSharp was previously PocketSharp.Reader and is now hosted without the PocketSharp dependency.

Install ReadSharp using NuGet

Install-Package ReadSharp

What's it all about?

The library extracts the main content of a website and returns the article as HTML with it's associated title, description, favicon and all included images.

The content can be encapsulated in a <body>-Tag and displayed as a readable website with a custom CSS (it's up to you!).

ReadSharp is based on a custom PCL port of NReadability and SgmlReader, which are included in the solution.

Association with Pocket

This library is a replacement for the Article View API by Pocket which is limited by usage and privacy.

With ReadSharp you won't hit any usage limits, as you are extracting the content directly. And it's open source.


Example

usingReadSharp;Readerreader=newReader();Articlearticle;try{article=awaitreader.Read(newUri("http://frontendplay.com/story/4/http-caching-demystified-part-2-implementation"));}catch(ReadExceptionexc){// handle exception}

Options

HttpOptions

You can pass HttpOptions to the Reader constructor, which count for all requests:

  • HttpMessageHandlerCustomHttpHandler
    Use your own HTTP handler
  • int?RequestTimeout
    Define a custom timeout in seconds, after which requests should cancel
  • stringUserAgent
    Override the user agent, which is passed to the destination server
  • boolUseMobileUserAgent
    There are desktop and mobile default user agents. By enabling this property, the mobile user agent is used. If you pass a custom user agent, this property is ignored!

ReadOptions

There are also ReadOptions available, which are passed on every request:

  • boolHasHeaderTags
    Return complete HTML document or just the body part
  • boolHasNoHeadline
    Removes <h1> title from the article
  • boolUseDeepLinks
    If you check this option, deep-links (containing hashes, e.g. href="#article") are not transformed into absolute URIs
  • boolPrettyPrint
    Determines whether the HTML output will be formatted

Article Model

The Article contains following fields:

  • stringTitle (the title of the page)
  • stringDescription (description of the page, extracted from meta information)
  • stringContent (contains the article)
  • UriFrontImage (main page image extracted from meta tags like apple-touch-icon and others)
  • UriFavicon (the favicon of the page)
  • List<ArticleImage>Images (contains all images found in the text)
  • stringNextPage (contains the next page URI, if available)

Article Image

  • UriUri
  • stringTitle (extracted from the title attribute)
  • stringAlternativeText (extracted from the alt attribute)

Supported platforms

ReadSharp is a Portable Class Library, therefore it's compatible with multiple platforms:

  • .NET >= 4.0.3 (including WPF)
  • Silverlight >= 4
  • Windows Phone >= 7.5
  • Windows Store

Forked Dependencies

forks are included in the primary source code

Contributors

ceee
ceee

License

MIT License

About

Extract meaningful website contents using a port of NReadability

Resources

Stars

0 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ReadSharp

ReadSharp was previously PocketSharp.Reader and is now hosted without the PocketSharp dependency.

Install ReadSharp using NuGet

Install-Package ReadSharp

What's it all about?

The library extracts the main content of a website and returns the article as HTML with it's associated title, description, favicon and all included images.

The content can be encapsulated in a <body>-Tag and displayed as a readable website with a custom CSS (it's up to you!).

ReadSharp is based on a custom PCL port of NReadability and SgmlReader, which are included in the solution.

Association with Pocket

This library is a replacement for the Article View API by Pocket which is limited by usage and privacy.

With ReadSharp you won't hit any usage limits, as you are extracting the content directly. And it's open source.


Example

usingReadSharp;Readerreader=newReader();Articlearticle;try{article=awaitreader.Read(newUri("http://frontendplay.com/story/4/http-caching-demystified-part-2-implementation"));}catch(ReadExceptionexc){// handle exception}

Options

HttpOptions

You can pass HttpOptions to the Reader constructor, which count for all requests:

  • HttpMessageHandlerCustomHttpHandler
    Use your own HTTP handler
  • int?RequestTimeout
    Define a custom timeout in seconds, after which requests should cancel
  • stringUserAgent
    Override the user agent, which is passed to the destination server
  • boolUseMobileUserAgent
    There are desktop and mobile default user agents. By enabling this property, the mobile user agent is used. If you pass a custom user agent, this property is ignored!

ReadOptions

There are also ReadOptions available, which are passed on every request:

  • boolHasHeaderTags
    Return complete HTML document or just the body part
  • boolHasNoHeadline
    Removes <h1> title from the article
  • boolUseDeepLinks
    If you check this option, deep-links (containing hashes, e.g. href="#article") are not transformed into absolute URIs
  • boolPrettyPrint
    Determines whether the HTML output will be formatted

Article Model

The Article contains following fields:

  • stringTitle (the title of the page)
  • stringDescription (description of the page, extracted from meta information)
  • stringContent (contains the article)
  • UriFrontImage (main page image extracted from meta tags like apple-touch-icon and others)
  • UriFavicon (the favicon of the page)
  • List<ArticleImage>Images (contains all images found in the text)
  • stringNextPage (contains the next page URI, if available)

Article Image

  • UriUri
  • stringTitle (extracted from the title attribute)
  • stringAlternativeText (extracted from the alt attribute)

Supported platforms

ReadSharp is a Portable Class Library, therefore it's compatible with multiple platforms:

  • .NET >= 4.0.3 (including WPF)
  • Silverlight >= 4
  • Windows Phone >= 7.5
  • Windows Store

Forked Dependencies

forks are included in the primary source code

Contributors

ceee
ceee

License

MIT License

About

Extract meaningful website contents using a port of NReadability

Resources

Stars

0 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

ReadSharp

ReadSharp was previously PocketSharp.Reader and is now hosted without the PocketSharp dependency.

Install ReadSharp using NuGet

Install-Package ReadSharp

What's it all about?

The library extracts the main content of a website and returns the article as HTML with it's associated title, description, favicon and all included images.

The content can be encapsulated in a <body>-Tag and displayed as a readable website with a custom CSS (it's up to you!).

ReadSharp is based on a custom PCL port of NReadability and SgmlReader, which are included in the solution.

Association with Pocket

This library is a replacement for the Article View API by Pocket which is limited by usage and privacy.

With ReadSharp you won't hit any usage limits, as you are extracting the content directly. And it's open source.


Example

usingReadSharp;Readerreader=newReader();Articlearticle;try{article=awaitreader.Read(newUri("http://frontendplay.com/story/4/http-caching-demystified-part-2-implementation"));}catch(ReadExceptionexc){// handle exception}

Options

HttpOptions

You can pass HttpOptions to the Reader constructor, which count for all requests:

  • HttpMessageHandlerCustomHttpHandler
    Use your own HTTP handler
  • int?RequestTimeout
    Define a custom timeout in seconds, after which requests should cancel
  • stringUserAgent
    Override the user agent, which is passed to the destination server
  • boolUseMobileUserAgent
    There are desktop and mobile default user agents. By enabling this property, the mobile user agent is used. If you pass a custom user agent, this property is ignored!

ReadOptions

There are also ReadOptions available, which are passed on every request:

  • boolHasHeaderTags
    Return complete HTML document or just the body part
  • boolHasNoHeadline
    Removes <h1> title from the article
  • boolUseDeepLinks
    If you check this option, deep-links (containing hashes, e.g. href="#article") are not transformed into absolute URIs
  • boolPrettyPrint
    Determines whether the HTML output will be formatted

Article Model

The Article contains following fields:

  • stringTitle (the title of the page)
  • stringDescription (description of the page, extracted from meta information)
  • stringContent (contains the article)
  • UriFrontImage (main page image extracted from meta tags like apple-touch-icon and others)
  • UriFavicon (the favicon of the page)
  • List<ArticleImage>Images (contains all images found in the text)
  • stringNextPage (contains the next page URI, if available)

Article Image

  • UriUri
  • stringTitle (extracted from the title attribute)
  • stringAlternativeText (extracted from the alt attribute)

Supported platforms

ReadSharp is a Portable Class Library, therefore it's compatible with multiple platforms:

  • .NET >= 4.0.3 (including WPF)
  • Silverlight >= 4
  • Windows Phone >= 7.5
  • Windows Store

Forked Dependencies

forks are included in the primary source code

Contributors

ceee
ceee

License

MIT License

About

Extract meaningful website contents using a port of NReadability

Resources

Stars

0 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors