Giter Site home page Giter Site logo

dfeed's Introduction

DFeed

DFeed is:

  • an NNTP client
  • a mailing list archive
  • a forum-like web interface
  • an ATOM aggregator
  • an IRC bot

DFeed is running on forum.dlang.org and the #d channel on Libera.Chat.

Quick start guide:

git clone --recursive https://github.com/CyberShadow/DFeed.git
cd DFeed
make
echo "host = news.digitalmars.com" > config/sources/nntp/digitalmars.ini
echo "listen.port = 8080" > config/web.ini
./rebuild # or: dub build

On first start, DFeed will download messages from the NNTP server and save them in the DB. This will need to be done once. If you don't want to download the entire archive, stop DFeed at any time and delete the digitalmars.ini configuration file.

After starting dfeed, you should be able to access the web interface at http://localhost:8080/.

dfeed's People

Contributors

acehreli avatar ag0aep6g avatar ahmetsait avatar beatgammit avatar brad-anderson avatar cybershadow avatar gmfawcett avatar martinnowak avatar ryuukk avatar webfreak001 avatar wilzbach avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

dfeed's Issues

[enh] Add overquoting protection

Some people often overquote, it would be nice if DForums would add some protection. Perhaps a simple warning message placed somewhere when overquoting is detected?

Split view panes overlap on chromium

This could be a problem on other browsers as well, but I haven't tested it.

Occasionally, seemingly unpredictably, the element id:"group-index" is approximately 30 or 80 pixels too wide on the right hand side, causing it to overlap with the message window.

Add summary to DWiki changes

E.g.:

DFeed [D Wiki] Ve‎rax edited "Memory Management": http://j.mp/1u2Xs4d

The summary for that change is:

(→‎Controling GC Allocations: Added more information about `-vgc`)

DFeed could add this summary to the IRC line after the short link.

Text wrapping at < 79 columns?

Some people wraps text at 79 columns. It seems the web interface wraps at less than this. This makes all text written with manual wrapping look very bad. Would it make more sense to wrap at 79 columns than the current default?

Feature Request: periodic digests via email (and/or IRC?)

DFeed is great; scrolling up through the IRC channel to look through it all is not so.

Basically, the idea is to get DFeed to send periodic digests via email (and/or maybe IRC?).

So, users would need some way to subscribe (possible by talking to DFeed in #d) and specify a period (these can be pre-defined or customisable with a maximum). DFeed would then store a list of subscribers and their periods; and it would also store all of its events up to its maximum period.

I would suggest customisable per-user periods, with a resolution of 1 hour, and a maximum of 168 (1 week).

Error: module ssl is in file 'deimos/openssl/ssl.d' which cannot be read

Hi there,

This project looked cool to me, but this is my first time ever using D (so apologies if this is a trivial issue) and when I try to run rdmd dfeed I get the following error:

ae/net/ssl/openssl.d(28): Error: module ssl is in file 'deimos/openssl/ssl.d' which cannot be read
import path[0] = .
import path[1] = /Library/D/dmd/src/phobos
import path[2] = /Library/D/dmd/src/druntime/import
Failed: ["dmd", "-v", "-o-", "dfeed.d", "-I."]

Any suggestions on how to address this would be hugely appreciated..

Buf error when accessing Dlang message board

When trying to access the D language message board on forum.dlang.org I get an error message which just says "buf error". I'm using Chrome on Ipad but I've seen the problem too on my Desktop Chrome installation. When I clear all my browser data or when I browse in Inkognito mode the forum works fine. Using my Safari browser on Ipad I saw once the warning message that my cookie size reaches the RFC limit and I'll loose my browsing history (unfortunately I can't remember the exact message). Maybe the buf error is produced by a too large cookie..

StopForumSpam error

When posting a comment on forum.dlang.org I get an error:

StopForumSpam error: Socket error: Lookup error: getaddrinfo error: Name or service not known. Please solve a CAPTCHA to continue.

DFeed is too noisy

Although I've received some positive feedback about DFeed, many seem to thing that with its current behavior, it is too spammy. I've created this ticket to discuss some possible solutions and reach a common ground.

Some of the suggested solutions are:

  1. Instructing users who are annoyed by DFeed to /ignore it
    • Problem: this will cause them to miss more interesting DFeed announcements, such as new posts to dm.D.announce
    • Problem: this won't work with people who use a web client (mibbit etc.)
  2. Moving DFeed to a new channel
    • Problem: most people will be unaware of the channel's existence
    • Problem: this inconveniences some people by having to manage an extra channel tab
  3. Making DFeed's messages less visible (already done)
    • Problem: this may interfere with some people's IRC client color settings
  4. Keeping more interesting announcements in #d, and creating a new channel for ALL announcements
    • Best solution?

Locked outside the forum because of cookie size

I just got locked outside the forum because it made its cookie so bit it couldn't handle it anymore (err400, Header or Cookie too big). Isn't it supposed to remove old events to make room for the new ones? I know I browse the forum a lot, but it still came to me as a surprise.

Feature Request: Thread folding

It would be convenient if threads could be collapsed to only their title, like code folding in vim and other editors. I've noticed it's fairly common for there to be multiple long threads that I simply do not care to read, or have read, or no longer wish to follow. (digitalmars.D has some real doozies at times, and I think it's only going to get more long-winded... ;))

I'm primarily thinking of the split view, but this may be applicable elsewhere.

Some systems (like Slashdot, IIRC) get fancy and let you collapse conversations at any level; that's cool and I have to imagine it comes almost for free once the base case is working, but is above and beyond the call of duty as far as this user is concerned-- I could take it or leave it.

Another thing I think I've seen is folding that shows new unread posts. This is likewise, beyond scope, but possibly neat.

Some way to disable the keyboard shortcuts

I'd appreciate some way to disable the keyboard shortcuts. They interfere with find-as-you-type in my browser and, even when I'm not searching, I end up accidentally losing my place more often than I find myself benefiting from them.

UI-wise, I'm thinking a checkbox above or below the pane that describes the shortcuts. Also, a cookie to store the value would be welcome if it's not too much trouble.

"Back" broken on Andorid Firefox

Haven't tried with other mobile browsers, but on Android Firefox:

  1. Click on a link to go to a group (such as "Announce", "Learn", or "General").
  2. Click on a link to go to a thread.
  3. Click any "Reply" link.
  4. Press "Back" to go back to the thread.
  5. Press "Back" again.

Expected: Go back (to list of threads in group).

Actual: Current page (the thread) simply reloads.

Links has smaller font size than the text

I'm not sure if this is a bug in iPhone 6 or something with DFeed, but I've only seen it on the forums. When I view the site in landscape mode, for some links, in the text of a post, the links have a smaller font size. The computed font size is 12px. When I click on the link nothing happens and the font size gets larger (standard size, 20px). Clicking on the link again navigates to the linked site.
screen shot 2016-01-16 at 14 26 41
screen shot 2016-01-16 at 14 27 05

iconv: conversion from X-UNKNOWN unsupported

Checked out the latest version but i get this error when running $ rdmd dfeed

<...>
NNTP-Downloader: 2408 messages in group digitalmars.D.ldc.
NNTP-Downloader: < ARTICLE 1133
NNTP-Downloader: > 211 29502 1 29714 D
NNTP-Downloader: < ARTICLE 1134
NNTP-Downloader: > 220 1071 <[email protected]> article
NNTP-Downloader: > Path: digitalmars.com!elf.comlab!yqz
NNTP-Downloader: > From: Yu Qian Zhou <[email protected]>
NNTP-Downloader: > Newsgroups: D
NNTP-Downloader: > Subject: How to avoid code duplication in D? MI/CI/delegation/C&P?
NNTP-Downloader: > Date: Thu, 30 Aug 2001 06:06:50 +0100
NNTP-Downloader: > Organization: Digital Mars
NNTP-Downloader: > Lines: 125
NNTP-Downloader: > Sender: [email protected]
NNTP-Downloader: > Message-ID: <[email protected]>
NNTP-Downloader: > Mime-Version: 1.0
NNTP-Downloader: > Content-Type: TEXT/PLAIN; charset=X-UNKNOWN
NNTP-Downloader: > Content-Transfer-Encoding: QUOTED-PRINTABLE
NNTP-Downloader: > X-Trace: digitaldaemon.com 999147976 26341 163.1.27.82 (30 Aug 2001 05:06:16 GMT)
NNTP-Downloader: > X-Complaints-To: [email protected]
NNTP-Downloader: > NNTP-Posting-Date: Thu, 30 Aug 2001 05:06:16 +0000 (UTC)
NNTP-Downloader: > In-Reply-To: <[email protected]>
NNTP-Downloader: > Xref: digitalmars.com D:1071
NNTP-Downloader: >
NNTP-Downloader: >
NNTP-Downloader: > Admittedly Java's single inheritance is easy to implement, and simple to
NNTP-Downloader: > use.  But it does have some defect which sometimes force a programmer to
NNTP-Downloader: > duplicate code by 'copy & paste':
NNTP-Downloader: >
NNTP-Downloader: > Suppose I have two classes 'Car' and 'Dog', which *have already inherited*
NNTP-Downloader: > from some more important classes 'Vehicle' and 'Animal' respectively
NNTP-Downloader: > (let's assume that 'Vehicle' and 'Dog' do not have a common modifiable
NNTP-Downloader: > ancestor); now I want both these two classes to implement another
NNTP-Downloader: > interface 'Idable', how can I do it?
NNTP-Downloader: >
NNTP-Downloader: > Answer:
NNTP-Downloader: > =09  Java: Copy & Paste,               code duplication !!!
NNTP-Downloader: > =09   C++: Multiple inheritance,    no code duplication
NNTP-Downloader: > =09   C++: Textual code inclusion,  no code duplication
NNTP-Downloader: > =09Eiffel: Multiple inheritance,    no code duplication
NNTP-Downloader: > =09Sather: Semantic code inclusion, no code duplication
NNTP-Downloader: >           Kiev: MI by delegation,        no code duplication
NNTP-Downloader: >
NNTP-Downloader: > so what's the solution D can provide?
NNTP-Downloader: >
NNTP-Downloader: > =09     D: ???                         code duplication ???
NNTP-Downloader: >
NNTP-Downloader: > D borrowed DbC from Eiffel, perhaps it also worth to check the multiple
NNTP-Downloader: > inheritance mechanism of Eiffel, which is much cleaner than C++ (by
NNTP-Downloader: > renaming and redefinition).
NNTP-Downloader: >
NNTP-Downloader: > Or if you still feel strongly against MI, maybe you can also consider
NNTP-Downloader: > Sather's semantic code inclusion, or Kiev's forward-able delegation?
NNTP-Downloader: >
NNTP-Downloader: > Let me know your thoughts on this.
NNTP-Downloader: >
NNTP-Downloader: > YuQian
NNTP-Downloader: >
NNTP-Downloader: >
NNTP-Downloader: > Sample code:
NNTP-Downloader: > /***********************************************************************
NNTP-Downloader: >   Java: Copy & Paste, code duplication
NNTP-Downloader: > ***********************************************************************/
NNTP-Downloader: > interface Idable
NNTP-Downloader: > {
NNTP-Downloader: >   public   void setId(int i);
NNTP-Downloader: >   public   void getId();
NNTP-Downloader: > }
NNTP-Downloader: >
NNTP-Downloader: > class      Car
NNTP-Downloader: > extends    Vehicle
NNTP-Downloader: > implements Idable
NNTP-Downloader: > {
NNTP-Downloader: >   private  int id;
NNTP-Downloader: >   public   void setId(int i) { id =3D i;   }      =20
NNTP-Downloader: >   public   void getId()      { return i; }
NNTP-Downloader: > }
NNTP-Downloader: >
NNTP-Downloader: >
NNTP-Downloader: > class      Dog=20
NNTP-Downloader: > extends    Animal
NNTP-Downloader: > implements Idable
NNTP-Downloader: > {
NNTP-Downloader: >   private  int id;=09=09=09=09// copy
NNTP-Downloader: >   public   void setId(int i) { id =3D i;   }    =09// &
NNTP-Downloader: >   public   void getId()      { return i; }    =09// paste!
NNTP-Downloader: > }
NNTP-Downloader: >
NNTP-Downloader: > /***********************************************************************
NNTP-Downloader: >   Kiev:  Multiple inheritance by delegation, no code duplication
NNTP-Downloader: > ***********************************************************************/
NNTP-Downloader: > class Id
NNTP-Downloader: > {
NNTP-Downloader: > private int id;
NNTP-Downloader: > public  void setId(int i) { id =3D i;   }      =20
NNTP-Downloader: > public  void getId()      { return i; }
NNTP-Downloader: > }
NNTP-Downloader: >
NNTP-Downloader: > class  =A0Car=A0
NNTP-Downloader: > extends Vehicle
NNTP-Downloader: > {
NNTP-Downloader: > =A0=A0=A0=A0forward=A0public=A0Id myId;   // forward car.getId() to car.myI=
NNTP-Downloader: > d.getId()
NNTP-Downloader: > }
NNTP-Downloader: >
NNTP-Downloader: > class  =A0Dog
NNTP-Downloader: > extends Animal
NNTP-Downloader: > {
NNTP-Downloader: > =A0=A0=A0=A0forward=A0public=A0Id myId;   // forward dog.getId() to dog.myI=
NNTP-Downloader: > d.getId()
NNTP-Downloader: > }
NNTP-Downloader: >
NNTP-Downloader: > /***********************************************************************
NNTP-Downloader: >   C++:  Multiple inheritance, no code duplication
NNTP-Downloader: > ***********************************************************************/
NNTP-Downloader: > class Idable
NNTP-Downloader: > {
NNTP-Downloader: > private: int id;
NNTP-Downloader: > public:
NNTP-Downloader: >    void setId(int i) { id =3D i;   }      =20
NNTP-Downloader: >    void getId()      { return i; }
NNTP-Downloader: > };
NNTP-Downloader: >
NNTP-Downloader: > class Car: public Vehicle, Idable {};
NNTP-Downloader: > class Dog: public Animal,  Idable {};
NNTP-Downloader: >
NNTP-Downloader: > /***********************************************************************
NNTP-Downloader: >   C++:  Textual code inclusion, no code duplication
NNTP-Downloader: > ***********************************************************************/
NNTP-Downloader: >
NNTP-Downloader: > //--- begin file: id.ci ---
NNTP-Downloader: > private: int id;
NNTP-Downloader: > public:
NNTP-Downloader: >    void setId(int i) { id =3D i;   }      =20
NNTP-Downloader: >    void getId()      { return i; }
NNTP-Downloader: > //--- end   file: id.ci ---
NNTP-Downloader: >
NNTP-Downloader: >
NNTP-Downloader: > class Car: public Vehicle
NNTP-Downloader: > {
NNTP-Downloader: > #include "id.ci"
NNTP-Downloader: > };
NNTP-Downloader: >
NNTP-Downloader: > class Dog: public Animal
NNTP-Downloader: > {
NNTP-Downloader: > #include "id.ci"
NNTP-Downloader: > };
NNTP-Downloader: >
NNTP-Downloader: >
NNTP-Downloader: > .
NNTP-Downloader: Got message 1071 (<[email protected]>)
/usr/bin/iconv: conversion from X-UNKNOWN unsupported
/usr/bin/iconv: try '/usr/bin/iconv -l' to get the list of supported encodings

Reply preview

Because of the automatic wrapping, it's sometimes hard to know what your post will look like once you send it, especially when you're dealing with quoting and its associated format mangling. A preview that allows users to load what it will look like after posting would be helpful to alleviate this.

Range violation when running nntpdownloader

Win7, DMD v2.064.2. The last few lines in the log are:

NNTP-Downloader: > .
NNTP-Downloader: 882 messages in group digitalmars.D.ldc.
NNTP-Downloader: < ARTICLE 68
NNTP-Downloader: > 211 6157 1 6213 c++
NNTP-Downloader: < ARTICLE 69
NNTP-Downloader: > 220 1 <[email protected]> article
NNTP-Downloader: > Path: digitalmars.com!not-for-mail
NNTP-Downloader: > From: Jan Knepper <[email protected]>
NNTP-Downloader: > Newsgroups: c++
NNTP-Downloader: > Subject: Test
NNTP-Downloader: > Date: Sun, 07 Jan 2001 23:57:30 -0500
NNTP-Downloader: > Organization: Digital Mars
NNTP-Downloader: > Lines: 2
NNTP-Downloader: > Message-ID: <[email protected]>
NNTP-Downloader: > Mime-Version: 1.0
NNTP-Downloader: > Content-Type: text/plain; charset=us-ascii
NNTP-Downloader: > Content-Transfer-Encoding: 7bit
NNTP-Downloader: > X-Trace: digitaldaemon.com 978929962 52898 209.158.92.81 (8 Jan 2001 04:59:22 GMT)
NNTP-Downloader: > X-Complaints-To: [email protected]
NNTP-Downloader: > NNTP-Posting-Date: Mon, 8 Jan 2001 04:59:22 +0000 (UTC)
NNTP-Downloader: > X-Mailer: Mozilla 4.75 [en] (Windows NT 5.0; U)
NNTP-Downloader: > X-Accept-Language: en
NNTP-Downloader: > Xref: digitalmars.com c++:1
NNTP-Downloader: > 
NNTP-Downloader: > Test
NNTP-Downloader: > 
NNTP-Downloader: > .
NNTP-Downloader: Got message 1 (<[email protected]>)
core.exception.RangeError@rfc850(330): Range violation
----------------
0x0045D070
0x00431629
0x0041C7F7
0x0042E2E5
0x0042D455
0x0042D352
0x0041ED83
0x0041ECB6
0x0041DB79
0x0041D6EE
0x004020FB
0x0044B184
0x0044B157
0x0044B06F
0x004196CB
0x76663677 in BaseThreadInitThunk
0x77569D72 in __RtlUserThreadStart
0x77569D45 in _RtlUserThreadStart
----------------

Small margin when replies column is not shown

I think the margin on the right side of "20 minutes ago" is too small. It's not really visible on the screenshot below or in the simulator because it's so big. But on the phone it doesn't feel right and it feels like it's smaller than it was before, when the "Replies" column was present. It also feels like there's a bigger margin on the left side of the avatars/images.

screen shot 2016-01-21 at 20 43 01

I think the margin for the on the right side of "2 days ago" would look better.

screen shot 2016-01-21 at 20 43 46

A general guideline would probably be, in the simulator, if the scrollbar covers something, then it's too close to the edge.

Allow to move a thread

There are a couple of threads started at announce, that shouldn't be there and also we could then move threads to off-topic

mark/shadowban/block registered usernames

i recently came a across a few posts which used my username (but an invalid email address) and where not done by me.

might help the quality of the forum if such "fake" posts would be marked (even not shown in the web interface)

Problems installing

I am attempting to install/build this project on a vanilla Ubuntu Precise 32 box - below is the script that I run:

sudo wget http://master.dl.sourceforge.net/project/d-apt/files/d-apt.list -O /etc/apt/sources.list.d/d-apt.list
sudo apt-get update && sudo apt-get -y --allow-unauthenticated install --reinstall d-apt-keyring && sudo apt-get update

sudo apt-get install git dmd-bin sqlite3 -y

git clone --recursive git://github.com/CyberShadow/DFeed.git
cd DFeed
mkdir data

#need to change this sudo
sqlite3 data/dfeed.s3db < schema.sql

echo 80>data/web.txt
echo localhost>>data/web.txt

rdmd nntpdownload
rdmd dfeed_web

Everything succeeds until rdmd nntpdownload with the following errors:

ae/utils/time.d(213): Error: no property 'fracSecs' for type 'SysTime', did you mean 'fracSec'?
ae/utils/time.d(216): Error: no property 'fracSecs' for type 'SysTime', did you mean 'fracSec'?
ae/utils/time.d(213): Error: no property 'fracSecs' for type 'SysTime', did you mean 'fracSec'?
ae/utils/time.d(216): Error: no property 'fracSecs' for type 'SysTime', did you mean 'fracSec'?
ae/utils/time.d(100): Error: template instance ae.utils.time.putTime!(BlindWriter!char).putTime.putTimeImpl!(fmt, BlindWriter!char).putTimeImpl.putToken!('C', context, sink) error instantiating

There are many more identical complaints which I have left out for brevity.

I followed the instructions in the README - so I am posting here as it seems there is an issue with the code (unlikely) or I am not performing a required step absent from the README.

Documentation

I believe DFeed is the best example of a real world d program on the net. Unfortunately, there is absolutely zero documentation. As a newcomer to d, it is odd to see that dfeed uses no build tool. Is in possible to add a simple readme to the project to explain how to build it? Is it possible to build it?

Enable lookup by date

I generally use a newsreader program to view newsgroups. However, occasionally I want to refer to an older post. Using dfeed is great to be able to provide a link to said post, however, there is no search by date. If I know the date of the post I want to find, I should be able to specify that date and have a list of messages posted on that date appear.

SEO

Hi,
searching within the forum is not really useful right now and I have some ideas that may help.

  1. make the first post in the topic appear as the description of the topic page.
  2. define a global list of keywords. foreach word in topic posts , if matches a keyword add that keyword to the topic page keywords list.
  3. allow users to tag topics/ posts , each tag will be added to the page keywords list.

I'm ready to step in and implement this if it's ok with you.

Ignore github commit messages (or any other filters we want)

At the moment, the phobos/druntime/dmd internals mailing list forum interface is nothing more than a mirror of github commits.

See here my post about it: http://forum.dlang.org/post/[email protected]

I also, in a recent reply to that, posted a filter I established for my mail client that will ignore certain ML messages that are always github commits (http://forum.dlang.org/post/[email protected]). Could dfeed allow filtering of mail to ignore those messages? They are mostly noise.

Message <textarea> width should match eventual wrap length

If I counted correctly, it currently fits 92 characters. I believe it should be shrunk so it fits exactly 66 characters (which I believe is where it wraps currently). This will give users a better idea of what their post will look like (even if it's not exact).

I just tested and width: 66ch; actually works in Chrome. Not sure about other browsers.

Show share button

Automatize tweeting every announcement - maybe even with the official DLanguage account?

Folding of large threads

Feature request.
Inspired by "The Right Approach to Exceptions" thread. It is quite awesome but makes newsgroup exploration harder a lot if
just want to rush through the new posts quickly. Switching to linear layout temporarily is an option, but less convenient.

Enable search feature

Currently, at forum.dlang.org, the search feature searches the old archives for messages. There should be a search capability in dfeed (or at the very least, the search should focus on forum.dlang.org instead of www.digitalmars.com/d/archives)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.