 So, hi everybody, and welcome to today's Tech Talk. Sebastian will be talking about automated citations in Wikipedia, Scytoid, and the technology behind it. Go ahead, Sebastian. Yeah, hello everyone, and welcome. Thank you very much for having me and for putting this together. Yeah, my name is Sebastian Karcher. My main profession is actually as a data archivist at Circus University, but I also maintain the translators for the Zotero Reference Manager, which is how I get into this talk. And to get you a sense of why what we're talking about today is cool and why it's important and why it relates to Wikipedia, I'm just gonna start with a quick demo. I'm gonna start appropriately on my user sandbox rather than on a real Wikipedia page, but as I start editing and the visual editor loads, if you don't have the visual editor, you can enable that somewhere here on the right side. You know, you can start writing an article. And then, of course, you can start citing something. So let's say you did some research, you found an article in the New York Times that's really important, and then you wanna cite this and for those who remember the old days, you had to fill out like a complicated citation template and et cetera, and now you just click on the site button you have up here. You paste your URL in here, click Generate. It will take a little time and it will give you a preview of the citation and you click Insert and there you go. And you can do that from a ton of different sites. So for example, if you are more academically inclined, you go to the JSTAR archive of articles. It's the same story, Site, Input URL, Generate. It gives you the whole citation, you click Insert. And then once you save the page, you get your fully formatted beautiful, beautiful citations at the bottom here and that was super quick and painless and that's the technology I wanna be talking about today. Some preliminaries, I should say, questions. I'm obviously super happy about questions. They should mostly go through the IRC chat and then someone in the Wikimedia office will read them to me and you should free to ask them at any time during the talk. I'm happy to be interrupted to clarify, to repeat things, et cetera. And the second thing is as you think about, as you think about kind of expectations, I was thinking about kind of a three tiered structure of expectations. So if you're just kind of generally interested in how this all works, you can lean back, relax and kind of just see some cool tech at work and I'm hoping to make this entertaining enough for you to be worth it. If you are kind of interested in dabbling, but you don't really are a coder, you don't know much about how this technology work, my hope is that this gives you enough of a structure and in the end enough links to resources that you can start reading up, practicing a little bit and eventually get yourself in a position to actually help contribute and improve these features and kind of the third tier, if you already know some JavaScript, maybe know what an XPath is or familiar with regular expressions, then you might be able to just actually go ahead and write your own Zotero and then Wikipedia functioning code right after this webinar. So this is kind of the three layers that I'm thinking of. Now you will have heard me mentioning Zotero repeatedly. So what is Zotero and why am I talking about it? Zotero is actually its own software that hundreds and thousands of academics use. It's a reference manager software developed at George Mason University in Virginia. It's based on the Mozilla framework so it's originally just a Firefox extension, now it also exists in standalone and it's free and open source under a GPL license. Now the feature that you just saw me demonstrate is referred to as Cytoid and what that essentially does is it connects Wikipedia to a Zotero that runs on the server. So if we're running Zotero on my own computer, I would just be clicking a button and importing those items into my own database. And what Cytoid cleverly does is it runs Zotero effectively on a server and then uses the same technology but instead of importing it into my local database where I keep my academic references, it passes it on to Wikipedia. And for those of you on the Google Hangout, we actually have the developer of Cytoid along so Mariel Volts wrote this whole thing and it's a really cool code and a really cool extension of taking advantage of open source software and shows the benefits of what that can do. Great, so as I mentioned in the beginning, I actually have relatively little involvement in Cytoid apart from occasionally helping out when a user reports a bug in Zotero. My main interest and my main knowledge and why I'm talking to you today is the Zotero part. So I'm gonna talk to you about Zotero translators and those are the little files and I'm gonna talk more about those later. Those are the little files that actually help Wikipedia understand all those different sites that people want to or may want to site in Zotero. If you wanna be following along or if you wanna work with us, there's three pieces of software that you need. The first one is the Firefox browser as a development environment that's really your only good option here. You will need the Zotero reference manager which in this case you should be installing the Firefox add-on version of that and then you will need the tool that's called Scaffold that has the, I'm sorry, that is sort of an IDE so it helps us more easily develop those Zotero translators. And at this point I should briefly mention that I have all the links that I have on these slides here. I put on my webpage, so that's SebastianKartcher.com slash link list. And so you can follow along right here where the initial links, there's some side out documentation and now we're here at the development environment and as I scroll down every link that I'll have on my slides and a bunch of additional ones will be on this link list. So that's in case you can't read it, SebastianKartcher.com, so my name.com slash link list. Great. So Zotero translators. Relatively simple, there's all individual small little files and every one of those files is written in JavaScript and most of the files and the only ones that we're gonna talk about really today on this first category, what we refer to as web translators. So they import sources from the web and most typically one file, one translator will refer to a single webpage. In some cases we have translators that refer to a whole family, say a specific content management system or something like that. And in some cases and we actually will look at this, one of those web translators will actually call on yet another translator that has knowledge of a specified format, be it RIS, which is a common metadata format for academics, but also a lot of the different formats that can be embedded in the headers of websites which is probably most interesting for people developing for Wikipedia. And the most common thing that though that you'll probably wanna be working on is web translators that we refer to as scrapers. So what they do is they take data off that is already visible on the webpage but they extract it in a systematic way. What's the author, what's the date, what's the title, et cetera. And then pass it on to Zotero if you're writing for Zotero and then to Cytoid and to Wikipedia citations once that's implemented. And there's a full list of all the translators that are currently available. It's somewhere above 300 and covering literally thousands of different sites because again, some of them are relatively general in nature. I don't have the time to go in depth on all the technology that I'm gonna be using on all the tools that I'm gonna be using but the most important tool that we'll be talking about are expats. And expats are mostly used actually in XML but we're gonna be talking about them in the contents of websites and web pages. And the way I think about expats and I'm not a computer scientist so there might be some imprecision in terminology here but the way I think about them is as directions to a specific part of a web page. Remember if you've ever looked at a web page and if you've never done so you can in your browser just press control you or command you if you're on a Mac and see the entire code of any website or web page you're looking at. It's just build up of a number of nested nodes and I've kind of built you the most simple version of a web page that you'll actually never find in the wild but this is a complete web page if you save this as HTML your browser could read it. Right and we have a title that wouldn't actually appear or rather it would appear here at the top of my browser and then we have a title that would appear and then we have some content so this could be like some article. And then the question is well how do I get systematically? How do I for example get to the title here? And the way I think about this is you're just asking for direction exactly the way you would ask for direction if you're coming to a strange city and need to find say the city hall. And so what do you do? Well at every corner at every note you tell Sotero you tell the software to go. So let's say in the previous example we wanna go to the title of the web page and so what you would say is and I'm gonna scroll back so that you can follow. You take the HTML road and then you go down and then you take the body road and then you go down and then you take the diff road. Okay so those are directions. The problem here is though there are actually two of those diff roads so we need a way to be a little bit more precise than this and so there are two strategies that we can use for that. We can do what many of us would actually do when we give directions. We can say well take the first diff road and we signify that by these little ones and square brackets behind the div or we can do something that would perhaps be a little bit more reliable and we essentially use the street name or in HTML talk the attribute. And in this case if we look up the attribute was the item prop and that was called a headline. I'm gonna scroll up again so you can see that we had the diff item prop headline. And so this is how our complete X path would look and if we had multiple and that's where this becomes useful if we had multiple sides that all have the same structure but maybe a different content this would always find us the headline on that set of web pages and that's of course what we're looking at. If you for example want to import from the New York Times we look at a bunch of articles that all have different content but all have the same structure. This is why we're interested in this. There's just really one more thing that I need to mention. If you can imagine if you've ever actually done the control view thing and looked at a web page the number of nodes that these have and the level of hierarchy that they have is very long. So if you were to start at HTML and then go through the entire structure you'd spend a lot of time writing these long, long nodes and no one could read them. What you can do instead is to start your X path with a double slash and then it starts anywhere in the hierarchy and just looks for your headlines street or for the diff node with the item prop attribute headline. And those double slashers actually don't just work at the beginning. You can actually insert and we're gonna see this. You can insert them in the middle of an X path too that has multiple elements. And then, and I think we won't be needing this but it's terribly useful to know. You can also search for part of an attribute that's this contains that we have here. So if I have so say diff contains item prop head that would find headline but it would also find header. It would find headline one, headline two, something like that. And so if you have kind of this systematic but not always entirely clear structure of your web page that contains attribute is incredibly useful. All right, one more thing that I wanna mention in terms of structure and that's how well, okay you know about these X path things and these exist all over the programming world. These are nothing specific to the Zotero. Zotero is a tiny fraction of where they're actually used for but how do they help us in Zotero? Well the way Zotero thinks about importing web pages is actually in three steps. You always have a target so you tell Zotero, okay here's the set of URLs that this particular translator remember translator always one specific JavaScript file where this particular translator might be relevant on. Then the next step is a function that every trans web translator must have and that's this detect web function. And that is I'm gonna take a closer look at the page that is actually open in the browser right now or the URL that I'm pasting into my Wikipedia site tool and I check is there actually something on the site on that page that I know that I can translate that I can extract the relevant metadata out of. And then the third step is the do web and as that name suggests that actually runs the translator so that triggers the function that then actually extracts that data from the web page and passes it on either to your local Zotero database or in the case of Cytoid, two year Wikipedia document. So those three elements are in every Zotero translator and normally if you write kind of standard code there are two functions that we almost always include and you'll see this later on. The first one is a function that we call scrape and that's where the actual work happens. So all the relevant code that we'll be writing that scrapes information from the page is very intuitively in the functions called scrape. And the second one is get search results and that's actually less relevant for Wikipedia but it's very useful for Zotero if you look on search results pages you can actually click a button and then select all or any number of the search results to import into your reference manager and this is a helper function for that. It's not going to be terribly relevant but we usually want it if you submit translators that are gonna run in Zotero. Two things to keep in mind as you do this you don't have to start from scratch. There are as I mentioned 300 of translators and there are lots of people who have done this and have searched about it and there's two places I would look. The first thing is that one of my colleagues who helps run the Zotero translators, Philip from Mannheim, he happens to be a librarian so he catalogs things which is incredibly useful and one thing that he has cataloged is the set of code blocks he uses a lot in his translators and those are very well-written, very standard format and give you kind of like, you just have to plug in some values and your translator runs a type of structure around where you can work and the second thing is you can look at translators that actually do something relatively similar to what we wanna do and so for example, the first thing that we're gonna do is we're just gonna scrape some information from a website and we're gonna look at the translator for the German FIZ, so one of the largest daily newspapers that does just that and then we apply that to an entirely different site but we can use a lot of the existing structure and then the second thing is and I'll see if we can have time to get to that or that's very useful is we find information that's already stored in a format that Sotero knows in the header of the website. I don't know if you're familiar with this but most websites actually have a bunch of information that's not visible to the user but just to computers, Google, other search engines, et cetera and one example here are for example the public library of science open access journals that would be good for that. There are dozens and dozens of other examples. All right, so next thing we're gonna actually put this to work but before I do that I know I have been racing through this a little bit or rather mightily but I wanna kind of give you a chance to let it sink for a minute and maybe ask any questions and I'll switch my presentation mode so I have broader access so I'm gonna hold for a minute for questions. Hi, that's me by the way. No questions at the moment? No questions? Ay, ay, ay, ay, ay. Okay, no questions at the moment. All right, so the page that I had I'm interested to look at today is from one of the more important Argentine newspapers and I'm studied to be political scientist and I was very interested in Argentina so these are dear to my heart. It's called Pajinadosa and it's a very simple, easily structured page and let's get to it. So I mentioned earlier we have this tool called Scaffold that is gonna help us with this and so if you have that installed it will sit in Firefox here. I already have it open so it's right here and this is how you open this and this is how it starts. So the first thing it does it gives us a unique ID for the translator you can just leave it or you can generate a new one then you give the translator a name, your name and then we come to the first element that I mentioned which is the target of the translator and so what would work is if I just type in the URL that I see above here then I can test whether this works and this says true here on this side. Can everyone see what I'm doing or can people see what I'm doing in Scaffold? They get back. Perfect. Great. So that's kind of the basically all I need to do and then it already knows see so okay I wanna run this translator on this website. What we typically do is we write what is called a regular expression and I have help links on what exactly that is. Essentially it books at a couple of different options in which strings can appear and has some special characters. Sebastian? Yes? Sorry to interrupt. Can you maybe zoom a little bit? I don't know if I can zoom this. Like in the browser? Yeah, unfortunately Scaffold doesn't use the browsers. Let me think if I can quickly do this. I'm gonna give this one quick valiant attempt. If someone knows. Yeah, if that's not a problem otherwise we'll find the workaround. Thank you. Nope, sorry. That was my only hope. The only hope I had had and that unfortunately doesn't affect it. Yeah, I'm sorry about that. So, yeah. All right, so what I can do is I can, what would be a good platform to put this on, right? I'm gonna keep a Word document or LibreOffice document open and then I can put these things here highly visible. So that's what I've typed there. And what you see is these backslashes, they escape special characters. If you've never seen a regular expression you can read up on it, they're incredibly useful. But, so this is my target. So every time I'm gonna look at a website that has this type of structure at the beginning, my new translator is gonna run. So that's great. And then remember what I said earlier, we can use existing structure, right? So what I have here is actually the newspaper translator of the FAC of that German newspaper and I'm gonna start by just copying all the relevant code of that. And then I'm just gonna copy that over and then I'm gonna paste it into the code window in scaffold, which unfortunately is gonna be tiny for you. And I wish I had a way to make that bigger. I think what I'll go ahead and do is I'll just kind of paste important passages again. And so the top thing here that you see is the detectweb function that I mentioned exists for every translator and to make things simple for us we're just gonna have that function return newspaper article every time. So newspaper article is one of the item types that Zotero and Wikipedia understands. So what we have here is this. And now when I click on the little I icon at the top here and those have hover over so if you forgot, you can mention it, my scaffold tells me it's a return newspaper article. So now the page loads and Zotero knows okay, we have a newspaper article here. And if you have Zotero installed that actually, once I reload this page now, I think this will work, it will recognize the pahinadosa here and you would typically see a little newspaper I can hear. All right, so this, I'm gonna go ahead and I'm gonna go ahead and I'm gonna go ahead all right, so this already gets us quite far. We have now, we have a set of URLs it's looking at. It's gonna return a newspaper item. We have that do web function here that I'm gonna ignore for the time being because one of the nice things that I mentioned before is when we're using standard code building blocks, we can reuse a lot of things. And so I'm gonna focus on that scrape function that's the third function here. If you open that code for yourself, you can kind of follow along. And I'm gonna delete almost all of it, except for two things. And I'm gonna paste them over to my document again so you can look at them. So I have, this is all I currently have for that scrape function. So this, if you've ever seen JavaScript, just defines, okay, this is a function and you can ignore that or learn more about functions. And then this just creates a new article and this says, okay, I'm done with this article. So this would just now save an empty item into Zotero. Not terribly useful, but it already creates us our new items, so that's step number one. And now we get to go to work on our expats and they're the fact that Firefox is really well constructed for developers helps us a lot. So we can right click on the element that we're interested in. And so in this case, we're gonna start by being interested in the title and then select inspect element here. What will happen is this pane at the bottom of Firefox opens, fortunately also not zoomable. And you see the entire structure of the page here, but in particular, you see the part that you right click on highlight it. And so the node that we're currently interested in is labeled H2. If you do that on the page and the page is on the link list, so if you want to follow along, you can do that. Do the same thing, right click, you will actually be able to read this. And what we do then is, I'm gonna start typing this here. This is a little risky because text word processing software unfortunately has all types of weird things with text, but I'm gonna be daring and do this. So right, we called this a new article and I'm interested in the title of that. And then, and that's the most important Zotero specific function that you're gonna use. They all start with ZU, that's for Zotero utilities. And then you want the text that's on that X path. So ZU dot X path text. You're interested in that in the current document. And then X paths are all ways in the single or double quotation marks doesn't actually matter. Okay, I'm gonna take this and copy it over to scaffold. Again, I'm only typing this in LibreOffice so you can see it. Now I need to make sure I fix my single quotes here because that's one of the horrible things that LibreOffice does to computer code. All right, and I'm gonna see what happens if I now run the do web. So I'm now actually telling Zotero to translate this. And you see here a very brief version of, okay, what do I have here? And it includes the title of that page. So that's already importing. So again, if I imported this in Wikipedia now, I wouldn't get me much, but at least I would get the right title. So that's the start. And then I can go ahead and do kind of the same thing on with the rest of the relevant parts on the page. So I can do the same thing, say, with the date. The date happens to be up here, right? So this again is nicely labeled and this is again where I mentioned earlier that your, what should we call it? Your kind of directions, your attributes are gonna be very useful. And so I can write something like the date for my article, again, same function. Works exactly the same way. And now we need to make sure these, the one disadvantage of XPAPS is that they're incredibly finicky. So it's, I'm at class. It's, I'm at the ceiling. So you can't mistype it, it throws arrows. So this to give you, now go ahead and paste this in here and run it. It's gonna throw me an arrow. And why did that happen? It happened because I have my, I have the smart quotes still in there. Once I take them out, it should have given me the right pass and then again, I missed a letter and there we have, we now have the date. And so on, and so on. Did I get a question there? Yes, there are a few questions if you want to answer them. Yes, let's go. Okay, Marco do you want to start with yours? Yeah, sure we can. So you mentioned earlier that we use this on Wikipedia and that we run basically our own Zotero server. However, you also mentioned that Zotero needs Firefox to run, which is kind of a big security issue for us because we do not, we do not run Firefox in production but we do run the so-called Zoo Runner, which is the kind of core of Firefox. And this is the main disadvantage we have with running Zotero. So we're kind of looking how to get rid of this dependency basically. So how can we exploit the translators themselves without having to have Firefox or Zoo Runner as a dependency? So there is the Zotero standalone project but that's also client-side in the sense that it binds to your browser. So this is not a solution either. It's also Zoo Runner, so that doesn't help. Oh, oh, okay. Yeah, so that doesn't help, no way. So basically we want to investigate what it would take to actually create something that is not dependent on Zoo Runner. Also I should mention that we use the translation server that is available for Zotero, which is a Node.js server but that's basically just a translator for Zotero requests. So it's not really a standalone implementation of it. So besides Xpath, are you aware of any like Firefox specific functionalities that are used by Zotero so that we can extract them or maybe extrapolate them somehow not to use Firefox? The trend, well, not Firefox specific. We actually very much try to run the translators with generic code so they can run in any modern browser but they do of course heavily rely on the various interpretive capabilities of a browser, right? You need a fully functioning JavaScript engine with all the doc evaluate, et cetera functions. So that needs to be there. But there's no Firefox specific code. So if you look at, for example, the connectors or the bookmarklet that Zotero runs that actually runs the entire, in most cases at least, it runs the entire code of the translators in that specific browser. So in Chrome, in Safari or with some deficits even in Internet Explorer or your mobile browser. Does that answer the question? Okay, yeah, to some extent. So basically we would need to emulate most of the things that a browser can do like and we're talking here maybe cookies, caching, files, CSS and so on, handling. CSS probably not, but all the other ones, yes. Yeah, yeah, okay, that's true. Okay, better, okay, that's good enough for now. Yes, thank you. Great. Okay, and I have another question from our IRC channel from user Rincey. And he asks, I was wondering if there are any plans to standardize the licensing of translators, for example, by chasing down contributors and desk for permission to re-license. Is it now GPL, AGPL or unlicensed? I just seem to have lost connection. I can hear you. Okay, great, great. Yeah, so Rincey, who is a good friend, asked about standardization of translators. Well, we're trying to move all translators to the same license that Taro has, which is AGPL3. But you see here, and that's probably why he asked, is this older translator is still under a general GPL license? I think the general goal is to A, standardize, but also to think about a more viable way than individual licenses for translators. So having people sign or agree to some contributor agreement that leaves Zotero the flexibility to do things like, say, upgrade to a new AGPL, like to a comparable license in the future, et cetera. And I think that's the general goal, but I don't know how far we are with that. In case people are wondering what we are referring to, most translators you'll see actually have a specific license at the top, and it's mostly the GPL3, or so the new public license, or the AGPL3, the Ferro new public license. The latter one is the one that Zotero is using. And so we prefer that, but there is a lot of like, un-uniformity some translators without, et cetera, et cetera. So it's a bit of a licensing gray zone, I would say. Okay, thank you. I think that you can go back to your presentation and we will talk later. Okay. I cannot hear you, it's a bustier right now. It looks like you're muted. Okay, you're back. No, I'm back. Excellent. Yes. All right. So one key thing that we always want, of course, is the author. The author is Mariana here. This again, for those of you following along, it's very nicely solved on the website. It's a very structured code, right? The author has her own class. So it's P class equals author. And so again, we can add the author as I'm gonna do this here. And authors are labeled creators and you'll see that they already exist in the items that I have here on my right side. And they are in square brackets. In JavaScript, those square brackets indicate that those are an object. So what I do is, sorry, that those are an array. So I push to that array to add an item, right? And the reason that that is the case is that, of course, articles can have multiple authors. And then I use a specific Zotero function that's Zotero clean author. And I hope I do this right. I'm gonna do this in two steps. So the first thing that I'm actually gonna do is I'm gonna just wrap the authors off the page, right? So I'm gonna define an author, again, do our zox path. And then we said P at class is author. And then a really nice thing that is very good to keep in mind are the debugging functions that Zotero has built in. I'm gonna copy that over for those who can't read along in a minute. So, function, and I can actually use that to look at individual variables, for example. So copying this over, what I now added is these two lines of code. So I define a new variable. I grab that variable from the site, and then I'm gonna check, okay, what's actually in there. I run this, something went wrong. Probably author in Spanish spelled without a T. So you get all the error messages here, which is one of the nice features of using something like Scaffold. You don't have to save, rerun, you can just do this live. And now it tells me here the author of the article, but we get the por, which is the Spanish byline demarcator first. And so what we wanna do here is we wanna clean that up a little bit. So in JavaScript, we can just simply do nice. Nice, right, so we wanna search for por at the beginning of my string, and then we just wanna cut it off. This is what I'm doing here. So the cutting it off is just replacing it with an empty string, those two, hi. And that didn't work. There we go. Now my Mariana appears the way she should. And then we can just push that variable to Zotero with this clean author function. And all those functions, I have a link to the documentation. All those functions are specifically documented. So you obviously don't have to remember all of those. You can also look them up in existing translators. And one of the nice things that the clean author function is, it takes the best guess as what's the first name and what's the last name. And so our current state of affairs, and again, I'm gonna copy this over for people to see, our current state of affairs, of what this puts out for us is this. We have a newspaper article, we have an author, correct first name, last name, we have a date, and we have a title, and we have the library catalog we're getting it from. And that's actually for the most part, what we would want from a typical article. And what we can do is we can hard coat strings. So if I'm looking on that Pahinadotus page, I would typically, you know, know that it's published in that particular paper so I can just, in actually, quotation marks, put the name off the paper and do the same thing with the ISSN. And I looked that up earlier, I hope. There we have the ISSN. And essentially, all relevant information that you can think of, you would like some, you would like to know about an article you should include here. And yeah, so we got our full data imported, and now we will be ready to go. We could go a little further. So one thing that we might want to look at are there any keywords on the page? One thing we might want to look at is is there something that we could use as an abstract on the page that might be useful? So there are other things that I could look at. But as a basic outline, and more importantly, to kind of get you a sense of how this works, this is all you really need. I can save this now. This is the second button from the left at the top here. And just to show you, unfortunately, because the Wikipedia module needs to be updated separately, I can't showcase this in Wikipedia. But what I can do is I can reload the page to re-trigger the translator. And then I can save this down into my Zotero. So in Zotero, the saving works just by clicking that button. And you see here, I hope you can kind of see here the title, the author, the publication, the date, the ISSN. So all the little things that we added. And that's your basic Zotero translator and your basic framework for Wikipedia. And I think I got a couple more questions. So why don't I pause for that? Okay, let's see if Mark wanted to ask a follow up question to the previous one. Yeah, so I was basically wondering if you are aware of any efforts to port Zotero to Node.js for server-side usage, basically. Beyond the individual components, so the translation server and site prognode which creates citation, which is less relevant for Wikipedia, no. But, yeah, no, not that I'm aware of. Okay, thanks. Okay, I'm going to go ahead and ask people and I'll see if they have questions that they want me to ask. In the meanwhile, I think I will ask my question. And my question is, is there a way to tell Zotero when some content from a given website is just content? I mean, can Zotero learn the distinction between online material, which only appears online on a website and material which has also been printed? So, for example, the website for Wealth.de, they have a certain URL for things which also appear in the printed magazine newspaper and then they have another different URL, of course, for things that only appears on their website. So, can Zotero learn that distinction? Generally, the answer is, whenever there is something systematic, that's different. So, for example, if you have a different URL, as in the case you described, and I was just clicking through, I'd seen that earlier, if you have an example where it somehow, where indicates that something is from the print edition, all things like that. Zotero can learn to treat them differently, yes. The question is, how would we necessarily treat them differently? So, in some cases, I think for the Atlantic, I used to do that. I used to treat stuff that was in the magazine as a magazine article and everything that was just on the page as either a website or a blog entry. That doesn't always make sense, though, because it's still kind of published in the Atlantic, so what does it mean? But the answer is, as a principle, Zotero can absolutely distinguish between the two and as long as the website makes the distinction, right? So, in this case, for example, I could probably, I don't know if people can see this, but I can actually make this bigger. This says edition impresa. So, this actually says print edition here. So, I could check if this is here, treat this as a printed article, if this is not there, treat it as a blog entry or something. So, yes, absolutely possible. Okay, thank you, that helps a lot. Another question from me and if other people in the Hangout want to interrupt me, they're welcome to do so. So, there should be a list of tests, I think, on the Zotero website, but it has been broken for a while now. At least, and that should be a list of all the Zotero translators and the tests, the automatic tests, but it looks like that page really doesn't return any useful information and it's been still for a while. Yes, yeah, so the story of that is, I don't have any influence on that unfortunately, but the story of that is that this runs on a little server on the GMU campus and if that crashes, someone needs to take care of that and Simon, who is the principal architect of this, is in the middle of his PhD, so his time for that unfortunately is rather limited and he hasn't gotten to that for a long time. What is the case though and what is generally quite cool is that you can run the tests locally in Firefox using the URL here. I'm just gonna blow this up a little more. So this is this guy. The problem is for the Wikipedia purposes, that's a little trickier because you actually are interested in the server side tests and those don't run and I don't have a good solution for you on that. We kind of need to poke Simon to get this back running. But yeah, that is the story of that. That's the best workaround we currently have available so you can see the full list and run the tests individually or in bunch on your local Firefox with Sotero installed, but that's it. Can you please add this link to the link list? Yes, thank you very much. You have four groups, are there any more questions? Okay, thank you so much for the talk, that was great. We had a whole bunch of people watching online, so I'll look forward to the recording for their later. Yeah, let me actually finish out by talking about the links that I have at the bottom here. So these are the help resources that I'm offering. So these are the automated tests that I'm gonna publish in a second. And as well do so now. And then there are a couple of things. There's general Sotero documentation which is quite technically for writing translators, it's quite technical, but it's comprehensive, especially for web translators, so that's good. I have a couple of suggestions for XPaths, for JavaScript, just look at Code Academy if you wanna learn the basics, it's great. For regular expressions, there are a ton of tutorials. If you have Sotero specific questions, we have a Google group that we like to refer people for more technical coding type of questions to and there are lots of very, very knowledgeable people we're happy to answer it. And finally, if you do come up with something, don't be shy to put up a public request on the Sotero translator repository and that is basically the only way to get it into Wikipedia and we'll be very happy to work with you. Remember though, this is production level, software hundreds and thousands of academics rely on it. So we are relatively exacting with kind of the final product. So you'll have to bring some patient, especially as a first time submitter, but we're very excited when we get people to contribute their code and we'd be happy if the one or the other of you would be among those and with that, thank you very much for listening, for following along, sorry for the little script, I hope we can blow this up on the video somehow and thanks again. Thank you so much, Sebastian.