From 2027d63b4ad66d15821fc2b90e3e48efbb8601cb Mon Sep 17 00:00:00 2001 From: Anqi Chen <44350221+CcAaQq@users.noreply.github.com> Date: Sat, 1 Jun 2019 22:55:48 -0700 Subject: [PATCH] Add files via upload --- Yo/ajax/setBroken.php | 12 ++ Yo/ajax/updateImageCount.php | 12 ++ Yo/ajax/updateLinkCount.php | 12 ++ Yo/assets/css/style.css | 270 ++++++++++++++++++++++++++++ Yo/assets/images/icons/search.png | Bin 0 -> 1443 bytes Yo/assets/images/logo.png | Bin 0 -> 55826 bytes Yo/assets/images/page.png | Bin 0 -> 479 bytes Yo/assets/images/pageEnd.png | Bin 0 -> 479 bytes Yo/assets/images/pageSelected.png | Bin 0 -> 816 bytes Yo/assets/images/pageStart.png | Bin 0 -> 977 bytes Yo/assets/js/script.js | 90 ++++++++++ Yo/classes/DomDocumentParser.php | 31 ++++ Yo/classes/ImageResultsProvider.php | 79 ++++++++ Yo/classes/SiteResultsProvider.php | 73 ++++++++ Yo/config.php | 10 ++ Yo/crawl.php | 162 +++++++++++++++++ Yo/index.php | 36 ++++ Yo/search.php | 157 ++++++++++++++++ 18 files changed, 944 insertions(+) create mode 100644 Yo/ajax/setBroken.php create mode 100644 Yo/ajax/updateImageCount.php create mode 100644 Yo/ajax/updateLinkCount.php create mode 100644 Yo/assets/css/style.css create mode 100644 Yo/assets/images/icons/search.png create mode 100644 Yo/assets/images/logo.png create mode 100644 Yo/assets/images/page.png create mode 100644 Yo/assets/images/pageEnd.png create mode 100644 Yo/assets/images/pageSelected.png create mode 100644 Yo/assets/images/pageStart.png create mode 100644 Yo/assets/js/script.js create mode 100644 Yo/classes/DomDocumentParser.php create mode 100644 Yo/classes/ImageResultsProvider.php create mode 100644 Yo/classes/SiteResultsProvider.php create mode 100644 Yo/config.php create mode 100644 Yo/crawl.php create mode 100644 Yo/index.php create mode 100644 Yo/search.php diff --git a/Yo/ajax/setBroken.php b/Yo/ajax/setBroken.php new file mode 100644 index 0000000..90f1cf8 --- /dev/null +++ b/Yo/ajax/setBroken.php @@ -0,0 +1,12 @@ +prepare("UPDATE images SET broken = 1 WHERE imageUrl=:src"); + $query->bindParam(":src", $_POST["src"]); + + $query->execute(); +} else { + echo "No src passed to page"; +} +?> \ No newline at end of file diff --git a/Yo/ajax/updateImageCount.php b/Yo/ajax/updateImageCount.php new file mode 100644 index 0000000..8edef6a --- /dev/null +++ b/Yo/ajax/updateImageCount.php @@ -0,0 +1,12 @@ +prepare("UPDATE images SET clicks = clicks + 1 WHERE imageUrl=:imageUrl"); + $query->bindParam(":imageUrl", $_POST["imageUrl"]); + + $query->execute(); +} else { + echo "No image URL passed to page"; +} +?> \ No newline at end of file diff --git a/Yo/ajax/updateLinkCount.php b/Yo/ajax/updateLinkCount.php new file mode 100644 index 0000000..f6715f3 --- /dev/null +++ b/Yo/ajax/updateLinkCount.php @@ -0,0 +1,12 @@ +prepare("UPDATE sites SET clicks = clicks + 1 WHERE id=:id"); + $query->bindParam(":id", $_POST["linkId"]); + + $query->execute(); +} else { + echo "No link passed to page"; +} +?> \ No newline at end of file diff --git a/Yo/assets/css/style.css b/Yo/assets/css/style.css new file mode 100644 index 0000000..e0697a7 --- /dev/null +++ b/Yo/assets/css/style.css @@ -0,0 +1,270 @@ +* { + font-family: arial, sans-serif; + color: #545454; +} + +html, +body { + margin: 0; + height: 100%; +} + +.wrapper { + display: flex; + flex-direction: column; + min-height: 100%; +} + +.wrapper.indexPage { + justify-content: center; +} + +.mainSection { + display: flex; + flex-direction: column; + align-items: center; +} + +.mainSection .searchContainer { + margin-top: 20px; + width: 100%; +} + +.mainSection .searchContainer form { + display: flex; + flex-direction: column; + align-items: center; +} + +.searchContainer .searchButton { + color: #757575; + background-color: #f5f5f5; + border: none; + height: 36px; + width: 125px; + border-radius: 1px; + font-size: 13px; + font-weight: bold; + margin-top: 20px; + cursor: pointer; + outline: none; +} + +.mainSection .searchContainer .searchBox { + border: none; + box-shadow: 0 2px 2px 0 rgba(0,0,0,0.16), 0 0 0 1px rgba(0,0,0,0.08); + height: 44px; + border-radius: 2px; + outline: none; + padding: 10px; + box-sizing: border-box; + font-size: 16px; + width: 70%; + max-width: 630px; + color: #000; +} + +.mainSection .logoContainer { + width: 220px; + text-align: center; +} + +.logoContainer img { + width: 100%; +} + +.header { + background-color: #FAFAFA; + border-bottom: 1px solid #ebebeb; +} + +.wrapper .headerContent { + display: flex; + align-items: center; +} + +.headerContent .logoContainer { + width: 150px; + padding: 5px 20px; + box-sizing: border-box; +} + +.headerContent .searchContainer { + flex: 1; +} + +.headerContent .searchContainer form { + margin: 15px 0 28px 0; +} + +.headerContent .searchBarContainer { + height: 44px; + border-radius: 2px; + background-color: #fff; + box-shadow: 0 2px 2px 0 rgba(0,0,0,0.16), 0 0 0 1px rgba(0,0,0,0.08); + width: 70%; + max-width: 630px; + box-sizing: border-box; + display: flex; +} + +.headerContent .searchBarContainer .searchBox { + flex: 1; + border: none; + background-color: transparent; + outline-color: #D0021B; + padding: 12px; + font-size: 16px; + color: #000; +} + +.headerContent .searchBarContainer .searchButton { + background-color: #fff; + height: 44px; + margin-top: 0; + width: 44px; + padding-right: 20px; + display: flex; + justify-content: center; +} + +.headerContent .searchBarContainer .searchButton img { + width: 22px +} + +.tabsContainer { + margin-left: 150px; +} + +.tabsContainer .tabList { + padding: 0; + margin: 0; +} + +.tabsContainer .tabList li { + display: inline-block; + padding: 0 16px 12px 16px; + color: #777; + font-size: 13px; +} + +.tabsContainer .tabList li a { + text-decoration: none; +} + +.tabsContainer .tabList li.active { + border-bottom: 3px solid #D0021B; +} + +.tabsContainer .tabList li.active a { + font-weight: bold; + color: #D0021B; +} + +.mainResultsSection { + flex: 1; +} + +.mainResultsSection .resultsCount { + font-size: 13px; + color: #808080; + margin-left: 150px; +} + +.mainResultsSection .siteResults { + margin-left: 150px; +} + +.resultContainer { + display: flex; + flex-direction: column; + margin-bottom: 26px; +} + +.resultContainer .title { + margin: 0; +} + +.resultContainer .title a { + color: #1a0dab; + text-decoration: none; + font-weight: normal; + font-size: 18px; +} + +.resultContainer .title a:hover { + text-decoration: underline; +} + +.resultContainer .url { + color: #006621; + font-size: 14px; +} + +.resultContainer .description { + font-size: 12px; +} + +.paginationContainer { + display: flex; + justify-content: center; + margin-bottom: 25px; +} + +.pageButtons { + display: flex; +} + +.pageNumberContainer img { + height: 37px; +} + +.pageNumberContainer, +.pageNumberContainer a { + display: flex; + flex-direction: column; + align-items: center; + text-decoration: none; +} + +.pageNumber { + color: #000; + font-size: 13px; +} + +a .pageNumber { + color: #D0021B; +} + +.mainResultsSection .imageResults { + margin: 20px; +} + +.gridItem { + position: relative; +} + +.gridItem img { + max-width: 200px; + min-width: 50px; + visibility: hidden; +} + +.gridItem .details { + visibility: hidden; + position: absolute; + bottom: 0px; + left: 0px; + width: 100%; + overflow: hidden; + background-color: rgba(0,0,0,0.8); + color: #fff; + font-size: 11px; + padding: 3px; + box-sizing: border-box; + white-space: nowrap; +} + +.gridItem:hover .details { + visibility: visible; +} \ No newline at end of file diff --git a/Yo/assets/images/icons/search.png b/Yo/assets/images/icons/search.png new file mode 100644 index 0000000000000000000000000000000000000000..e2fa9f4efd511e4865b42919a5a3675d51361baf GIT binary patch literal 1443 zcmV;U1zh@xP)L%XFcXxMz5 z_uoZ+oO5Q*?!0GKW+8uf=Xu}v|2+ShIq%m1H@V3TL7Ewy!>nm#tFjd2LJ?^LF<= zrMUvZ86i(V!jAT8;oC5Ihr-B6 zFA{St;oA^&G?kU?RBpb zrB{So8~wfa*|84MvI9W6P8r)%Iv?~wHN=oc`mFeqLVVy0mkB?!23=NP;*Th#h$PU0U(3eLMYh-V6rQGQFOJv z9sR$C(NsYVRnc$3Yoa6?tD7|e04WrYP;(7{vMW5EV!s(yv#yaoB<>TzGEY$WY�a z!Y1;QM)4>_HhOblWd^Z@Vf5-6QNkB|367?m;`?C|3`M(>e-DD6yt!mc7_Ay3Cop9y z1)c5~9c~RHJ{$s2Icke9_~6f&HaTEOAT>s`6{rc$H0F9o2(?2=R(9wlj(R1yilM)32ty=F523aVznZsrYbYRs0!J7I+HM40R?6 z{FM77e!zDoDO1bRH1a=$N#rMM#}`xMD|nB*J5#!_E{tB_f@o811aQd}ii+aitQ}t* zCXt&yJJvys-Ef&8aNg3DO<^?yjkMw1X$m&@!V{^{ol&t3VcwZ5mk*mn%K`YdAxdzv zgc-)~##Khibay;V+My8yk$Ta>0R=m?xvz~@?U$Z~jkJfdd--~vjwS(chZVu=7N z0nBcwBFer9C#+2(S029eby|648i-InvpL~W6Eh9(e%qbm$BvdXh;PD`cMXEr4dVO2 z4#L%C8QhgaGTNx9(Kh~0g*RGKR5Rp|jAkXV xFQekjsQBhq*V7a|NQ})|@h4hc$4&m1{0l}1;>+SDM-Tu2002ovPDHLkV1fV`j9vf$ literal 0 HcmV?d00001 diff --git a/Yo/assets/images/logo.png b/Yo/assets/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ff929246435d2ca20114a8ed3b9118e069912584 GIT binary patch literal 55826 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 HX7~1g9UxHQ literal 0 HcmV?d00001 diff --git a/Yo/assets/images/page.png b/Yo/assets/images/page.png new file mode 100644 index 0000000000000000000000000000000000000000..a3a18b857067ed3f594b07fb9b1b967f237c98bb GIT binary patch literal 479 zcmV<50U-W~P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0dz@3K~!i%?byFA z1W_1<@ezg4DCi^-8i|sM&K$~K)CTY9S z4r-GTEAVLsK4UJCv}0%oIWl4uAh`{EL-8fFa3-vN|XbtlL?YgdKOd@&mRzu!yXosfuiUnk= z#F*?OTsg-S8{x_^ruYa~$}!bOxMa*Vv@hrD2~|h5+r$7@0Zy@l30Rh8SysiG<`)vm Veg24=1D^l@002ovPDHLkV1m3O#w`E< literal 0 HcmV?d00001 diff --git a/Yo/assets/images/pageEnd.png b/Yo/assets/images/pageEnd.png new file mode 100644 index 0000000000000000000000000000000000000000..a3a18b857067ed3f594b07fb9b1b967f237c98bb GIT binary patch literal 479 zcmV<50U-W~P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0dz@3K~!i%?byFA z1W_1<@ezg4DCi^-8i|sM&K$~K)CTY9S z4r-GTEAVLsK4UJCv}0%oIWl4uAh`{EL-8fFa3-vN|XbtlL?YgdKOd@&mRzu!yXosfuiUnk= z#F*?OTsg-S8{x_^ruYa~$}!bOxMa*Vv@hrD2~|h5+r$7@0Zy@l30Rh8SysiG<`)vm Veg24=1D^l@002ovPDHLkV1m3O#w`E< literal 0 HcmV?d00001 diff --git a/Yo/assets/images/pageSelected.png b/Yo/assets/images/pageSelected.png new file mode 100644 index 0000000000000000000000000000000000000000..58a0d3106b53ef8d952fc89003da49fc2c0e7e9e GIT binary patch literal 816 zcmV-01JC@4P)F42EVjm(4YPdZ~qlvFZ_M7l5WC(fo= zE{sxt8@n@Z!xDv)YIGhr5VzNnZ(^kqS0m;fvbN z7!NKn3;x7SWy+8_mwB!tp{TKUUDokVCRp6E#@^{h zhOUV80+~p!k%{ygnMkjZiS!zoNUzZq5wYgh0^@yg`xY4QGuGVhMg~_A4ZSLQ$&=QD zs^k6!pbEY(t%oXlG5p37xh()k5f$oDH6mQinf`mT5c%0%1wUu{?;~7^4A_yHOGc-y z?t6~!*)m@jfMR5^@)RTUp*2=32$!Qrxo>ry4bVkYPS3_RiH=PFos71Or5slR623=Dtkpbg zD!_V@{=bu40#dvXi_`qo?<2qr%OaFq`!Hh%&0C0a@f7U-hjU6eFN!cnqoJ4M!xz;{# zn5W$P&N=7R?0fIbKu*qk!9@MI6qG86oQ}Ilj8r!E8)qhAFRMX*;bgH8tUuEFj_o%l zqSkEm6>>PKsSz{&i5 zOvf!o8X2YW6j)RW4_a%#S2SJ(*8TttDzaN+G@ivRM&A)2aJyH5O{MsyYN2#i(Iip} zN>c(C71>7McE3v!#2WdGzt@3l+92X&VVQEjri)^ka=#OqS9`#e}th)Sejzl82-&U45b_#1MigwF6_vx3c{-M=7;5kQ57#sXX zayA4f<6&kKNxUO)5PZ3<$Ogl}`eOp0fG_%(01qPof!mu!3BJI^T2PwusaFe1Q^s&X zk!^+>ju&1=!k}H(bWUVm3w{{z1&_9Bz+3S$0?>5z1%a9(8x8{;%a+}q1cn+4Z5+v!Zug^>|f*3cjDaPt3&|B4d>#^VGB zu7~wIreh-jO;?`>UMRA17;HA|t{QNGTGQ2icC$!23VSP6j-D24A1gJsv3!l=AxglF za}!^%`lQ==x;6r^WQHDKIIqZdfPo}|2oJ`jt~~)K($!z!^^O#qvHQcV4} znaaorD{BUsOF6@hZUf#*DkA{@xW>=u!H?rbxN)Q=wUJ5Kv(C<-zvH(f#<}UNzQm+9 z0`NJ1R)G5*UUo0dF4ayZMgVYT7I^I^Hvbk~v8%VrI5IOb%3pOs)Ds^-aC2D%yp>ev zNIT1v``_5@9ZmO@7@0(plJ}|kFUL!ZsYve|Hjoe7D zksIkXawEM)Zlu@9-iRUbOS%}TWZp9;=l$^(t)?E97C~' : '') + + 'View image
' + + 'Visit page'; + } + + return caption; + }, + afterShow : function( instance, item ) { + increaseImageClicks(item.src); + } + }); +}); + +function loadImage(src, className) { + var image = $(""); + + image.on("load", function() { + $("." + className + " a").append(image); + + clearTimeout(timer); + + timer = setTimeout(function() { + $(".imageResults").masonry(); + }, 500); + }); + + image.on("error", function() { + $("." + className).remove(); + + $.post("ajax/setBroken.php", {src: src}); + }); + + image.attr("src", src); +} + +function increaseLinkClicks(linkId, url) { + $.post("ajax/updateLinkCount.php", {linkId: linkId}) + .done(function(result) { + if(result != "") { + alert(result); + return; + } + window.location.href = url; + }); +} + +function increaseImageClicks(imageUrl) { + $.post("ajax/updateImageCount.php", {imageUrl: imageUrl}) + .done(function(result) { + if(result != "") { + alert(result); + return; + } + }); +} \ No newline at end of file diff --git a/Yo/classes/DomDocumentParser.php b/Yo/classes/DomDocumentParser.php new file mode 100644 index 0000000..ce3bc70 --- /dev/null +++ b/Yo/classes/DomDocumentParser.php @@ -0,0 +1,31 @@ +array('method'=>"GET", 'header'=>"User-Agent: YoBot/0.1\n") + ); + $context = stream_context_create($options); + + $this->doc = new DomDocument(); + @$this->doc->loadHTML(file_get_contents($url, false, $context)); + } + + public function getlinks() { + return $this->doc->getElementsByTagName("a"); + } + + public function getTitleTags() { + return $this->doc->getElementsByTagName("title"); + } + + public function getMetaTags() { + return $this->doc->getElementsByTagName("meta"); + } + + public function getImages() { + return $this->doc->getElementsByTagName("img"); + } + } +?> \ No newline at end of file diff --git a/Yo/classes/ImageResultsProvider.php b/Yo/classes/ImageResultsProvider.php new file mode 100644 index 0000000..cd145f9 --- /dev/null +++ b/Yo/classes/ImageResultsProvider.php @@ -0,0 +1,79 @@ +con = $con; + } + + public function getNumResults($term) { + $query = $this->con->prepare("SELECT COUNT(*) as total + FROM images + WHERE (title LIKE :term + OR alt LIKE :term) + AND broken=0"); + + $searchTerm = "%". $term . "%"; + $query->bindParam(":term", $searchTerm); + $query->execute(); + + $row = $query->fetch(PDO::FETCH_ASSOC); + return $row["total"]; + } + + public function getResultsHtml($page, $pageSize, $term) { + + $fromLimit = ($page - 1) * $pageSize; + + $query = $this->con->prepare("SELECT * + FROM images + WHERE (title LIKE :term + OR alt LIKE :term) + AND broken=0 + ORDER BY clicks DESC + LIMIT :fromLimit, :pageSize"); + + $searchTerm = "%". $term . "%"; + $query->bindParam(":term", $searchTerm); + $query->bindParam(":fromLimit", $fromLimit, PDO::PARAM_INT); + $query->bindParam(":pageSize", $pageSize, PDO::PARAM_INT); + $query->execute(); + + $resultsHtml = "

"; + + $count = 0; + while($row = $query->fetch(PDO::FETCH_ASSOC)) { + $count++; + $id = $row["id"]; + $imageUrl = $row["imageUrl"]; + $siteUrl = $row["siteUrl"]; + $title = $row["title"]; + $alt = $row["alt"]; + + if($title) { + $displayText = $title; + } else if($alt) { + $displayText = $alt; + } else { + $displayText = $imageUrl; + } + + $resultsHtml .= ""; + } + $resultsHtml .= "
"; + + return $resultsHtml; + } +} +?> \ No newline at end of file diff --git a/Yo/classes/SiteResultsProvider.php b/Yo/classes/SiteResultsProvider.php new file mode 100644 index 0000000..e5543bf --- /dev/null +++ b/Yo/classes/SiteResultsProvider.php @@ -0,0 +1,73 @@ +con = $con; + } + + public function getNumResults($term) { + $query = $this->con->prepare("SELECT COUNT(*) as total + FROM sites WHERE title LIKE :term + OR url LIKE :term + OR keywords LIKE :term + OR description LIKE :term"); + + $searchTerm = "%". $term . "%"; + $query->bindParam(":term", $searchTerm); + $query->execute(); + + $row = $query->fetch(PDO::FETCH_ASSOC); + return $row["total"]; + } + + public function getResultsHtml($page, $pageSize, $term) { + + $fromLimit = ($page - 1) * $pageSize; + + $query = $this->con->prepare("SELECT * + FROM sites WHERE title LIKE :term + OR url LIKE :term + OR keywords LIKE :term + OR description LIKE :term + ORDER BY clicks DESC + LIMIT :fromLimit, :pageSize"); + + $searchTerm = "%". $term . "%"; + $query->bindParam(":term", $searchTerm); + $query->bindParam(":fromLimit", $fromLimit, PDO::PARAM_INT); + $query->bindParam(":pageSize", $pageSize, PDO::PARAM_INT); + $query->execute(); + + $resultsHtml = "
"; + + while($row = $query->fetch(PDO::FETCH_ASSOC)) { + $id = $row["id"]; + $url = $row["url"]; + $title = $row["title"]; + $description = $row["description"]; + $title = $this->trimField($title, 55); + $description = $this->trimField($description, 230); + $resultsHtml .= "
+ +

+ + $title + +

+ $url + $description + +
"; + } + $resultsHtml .= "
"; + + return $resultsHtml; + } + + private function trimField($string, $characterLimit) { + $dots = strlen($string) > $characterLimit ? "..." : ""; + return substr($string, 0, $characterLimit) . $dots; + } +} +?> \ No newline at end of file diff --git a/Yo/config.php b/Yo/config.php new file mode 100644 index 0000000..a4126c0 --- /dev/null +++ b/Yo/config.php @@ -0,0 +1,10 @@ +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); +} catch(PDOExeption $e) { + echo "Connection failed: " . $e->getMessage(); +} +?> \ No newline at end of file diff --git a/Yo/crawl.php b/Yo/crawl.php new file mode 100644 index 0000000..d2de6f1 --- /dev/null +++ b/Yo/crawl.php @@ -0,0 +1,162 @@ +prepare("SELECT * FROM sites WHERE url = :url"); + + $query->bindParam(":url", $url); + $query->execute(); + + return $query->rowCount() != 0; +} + +function insertLink($url, $title, $description, $keywords) { + global $con; + + $query = $con->prepare("INSERT INTO sites(url, title, description, keywords) + VALUES(:url, :title, :description, :keywords)"); + + $query->bindParam(":url", $url); + $query->bindParam(":title", $title); + $query->bindParam(":description", $description); + $query->bindParam(":keywords", $keywords); + + return $query->execute(); +} + +function insertImage($url, $src, $alt, $title) { + global $con; + + $query = $con->prepare("INSERT INTO images(siteUrl, imageUrl, alt, title) + VALUES(:siteUrl, :imageUrl, :alt, :title)"); + + $query->bindParam(":siteUrl", $url); + $query->bindParam(":imageUrl", $src); + $query->bindParam(":alt", $alt); + $query->bindParam(":title", $title); + + return $query->execute(); +} + +function createLink($src, $url) { + $scheme = parse_url($url)["scheme"]; // http + $host = parse_url($url)["host"]; // www.wsj.com + + if(substr($src, 0, 2) == "//") { + $src = $scheme . ":" . $src; + } else if(substr($src, 0, 1) == "/") { + $src = $scheme . "://" . $host . $src; + } else if(substr($src, 0, 2) == "./") { + $src = $scheme . "://" . $host . dirname(parse_url($url)["path"]) . substr($src, 1); + } else if(substr($src, 0, 3) == "../") { + $src = $scheme . "://" . $host . "/" . $src; + } else if(substr($src, 0, 5) != "https" && substr($src, 0, 4) != "http") { + $src = $scheme . "://" . $host . "/" . $src; + } + + return $src; +} + +function getDetails($url) { + global $alreadyFoundImages; + $parser = new DomDocumentParser($url); + $titleArray = $parser->getTitleTags(); + + if(sizeof($titleArray) == 0 || $titleArray->item(0) == NULL) { + return; + } + + $title = $titleArray->item(0)->nodeValue; + $title = str_replace("\n", "", $title); + + if($title == "") { + return; + } + + $description = ""; + $keywords = ""; + + $metasArray = $parser->getMetatags(); + + foreach($metasArray as $meta) { + if($meta->getAttribute("name") == "description") { + $description = $meta->getAttribute("content"); + } + if($meta->getAttribute("name") == "keywords") { + $keywords = $meta->getAttribute("content"); + } + } + + $description = str_replace("\n", "", $description); + $keywords = str_replace("\n", "", $keywords); + + if(linkExists($url)) { + echo "$url already exists
"; + } else if(insertLink($url, $title, $description, $keywords)) { + echo "SUCCESS: $url
"; + } else { + echo "ERROR: Failed to insert $url
"; + } + + $imageArray = $parser->getImages(); + foreach($imageArray as $image) { + $src = $image->getAttribute("src"); + $alt = $image->getAttribute("alt"); + $title = $image->getAttribute("title"); + + if(!$title && !$alt) { + continue; + } + + $src = createLink($src, $url); + + if(!in_array($src, $alreadyFoundImages)) { + $alreadyFoundImages[] = $src; + // insert the image + echo "INSERT: " . insertImage($url, $src, $alt, $title); + } + } +} + +function followLinks($url) { + global $alreadyCrawled; + global $crawling; + $parser = new DomDocumentParser($url); + $linkList = $parser->getLinks(); + + foreach($linkList as $link) { + $href = $link->getAttribute("href"); + + if(strpos($href, "#") !== false) { + continue; + } else if(substr($href, 0, 11) == "javascript:") { + continue; + } + + $href = createLink($href, $url); + + if(!in_array($href, $alreadyCrawled)) { + $alreadyCrawled[] = $href; + $crawling[] = $href; + + getDetails($href); + } + } + + array_shift($crawling); + + foreach($crawling as $site) { + followLinks($site); + } +} + +$startUrl = "https://www.wsj.com/"; +followLinks($startUrl); +?> \ No newline at end of file diff --git a/Yo/index.php b/Yo/index.php new file mode 100644 index 0000000..3c2f0b5 --- /dev/null +++ b/Yo/index.php @@ -0,0 +1,36 @@ + + + + Yo! + + + + + + + + + + + +
+ +
+
+ Site logo +
+ +
+
+ + + + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/Yo/search.php b/Yo/search.php new file mode 100644 index 0000000..3a01de7 --- /dev/null +++ b/Yo/search.php @@ -0,0 +1,157 @@ + + + + + + Yo!What's up? + + + + + + + +
+ +
+ +
+ +
+ + + +
+ +
+ +
+ +
+ + + +
+ +
+ +
+ +
+ + +
+ + + + +
+
+ +
+ + getNumResults($term); + + echo "

$numResults results found

"; + echo $resultsProvider->getResultsHtml($page, $pageSize, $term); + ?> + +
+ +
+ +
+ +
+ +
+ + $numPages + 1) { + $currentPage = $numPages + 1 - $pagesLeft; + } + + while($pagesLeft != 0 && $currentPage <= $numPages) { + + if($currentPage == $page) { + echo "
+ + $currentPage +
"; + } + else { + echo ""; + } + + + $currentPage++; + $pagesLeft--; + + } + ?> + +
+ +
+ +
+
+ + + + + \ No newline at end of file