Browse Source

Merge branch 'master' of https://github.com/tomleb/netrunner

pull/2/head
Odilitime 2 years ago
parent
commit
f3db7a692f

+ 2
- 0
.gitignore View File

@@ -4,3 +4,5 @@ gen
src/graphics/opengl/shaders/gen
netrunner
*.iml
tags
src/networking/URI

+ 7
- 3
src/Log.cpp View File

@@ -28,7 +28,7 @@ namespace {
}

Logger::Logger() :
logType(LogType::DEBUG),
logType(LogType::DBUG),
outStream(std::cout),
shouldLog(true) {
}
@@ -44,7 +44,7 @@ Logger::Logger(LogType lt, std::ostream& out) :
} else if (specifiedLog == "info") {
logLevel = LogType::INFO;
} else if (specifiedLog == "debug") {
logLevel = LogType::DEBUG;
logLevel = LogType::DBUG;
}

if (lt <= logLevel) {
@@ -67,10 +67,14 @@ std::ostream& logWarning() {
return log(LogType::WARNING);
}

std::ostream& logNotice() {
return log(LogType::NOTICE);
}

std::ostream& logInfo() {
return log(LogType::INFO);
}

std::ostream& logDebug() {
return log(LogType::DEBUG);
return log(LogType::DBUG);
}

+ 11
- 5
src/Log.h View File

@@ -20,13 +20,16 @@
than error. For example, if you specify "-log info", then the program
will print out info, and all lower prioritized logtypes (warning+error).
*/
// I'd like logging macro(s) that auto include __FILE__ and __LINE__ for where the output is coming from (would be cool if we could include function/method name (and class if method)) - odilitime 17/08/02
enum class LogType {
ERROR,
WARNING,
INFO,
DEBUG,
ERROR, // issue
WARNING, // potential issue
NOTICE, // basic user messages, Default include NOTICE, WARNING, ERROR
INFO, // basic 10k ft overview of what's going on
DBUG, // can't be DEBUG in clang
CALLLIST // track each function call entrance and exit
};
// network logging should be separate

class Logger {
public:
@@ -39,8 +42,11 @@ private:
bool shouldLog;
};

// can we have some sort of macro to make these noOPs if compile as such
// no need to compile in all the debug logging calls in release
std::ostream& logError();
std::ostream& logWarning();
std::ostream& logNotice();
std::ostream& logInfo();
std::ostream& logDebug();


+ 8
- 0
src/StringUtils.cpp View File

@@ -1,4 +1,6 @@
#include "StringUtils.h"

#include <algorithm>
#include <iostream>

#include <iterator>
@@ -79,4 +81,10 @@ const std::string toLowercase(const std::string &str) {
back_inserter(returnString),
tolower);
return returnString;
/*
std::string stringToLower(std::string s) {
std::transform(s.begin(), s.end(), s.begin(),
[](unsigned char c){ return std::tolower(c); });
return s;
*/
}

+ 2
- 0
src/URL.h View File

@@ -4,6 +4,8 @@
#include <string>
#include <iostream>

// I'm really mixed about this being a struct like this
// probably fine for now
struct URL {
URL();
URL(std::string const& url);

+ 6
- 2
src/WebResource.cpp View File

@@ -75,8 +75,12 @@ WebResource getLocalWebResource(URL const& url) {
"Could not open file " + url.document);
}

WebResource getOnlineWebResource(URL const& url) {
HTTPRequest request (url.host, url.document);
//WebResource getOnlineWebResource(URL const& url) {
// HTTPRequest request (url.host, url.document);
WebResource getOnlineWebResource(std::string url) {
std::shared_ptr<URI> uri = parseUri(url);
HTTPRequest request (uri);

WebResource returnRes;

std::string redirectLocation = "";

+ 1
- 1
src/graphics/components/Component.h View File

@@ -84,7 +84,7 @@ public:
unsigned int bottomPadding = 0;
// x + left margin + left padding = start x for texture
// size preference (could also prefer t/b, l/r)
bool growRight = false;
bool growRight = false; // if less than windowWidth, why not be greedy?
bool growLeft = false;
bool growTop = false; // if top/bott grow from center
bool growBottom = false;

+ 4
- 1
src/graphics/elements/AElement.cpp View File

@@ -1,6 +1,9 @@
#include "AElement.h"
#include "../../html/TagNode.h"
#include <iostream>
#include "../opengl/Window.h"

extern const std::unique_ptr<Window> window;

AElement::AElement() {
isInline = true;
@@ -16,7 +19,7 @@ std::unique_ptr<Component> AElement::renderer(const std::shared_ptr<Node> node,
if (hrefPair != tagNode->properties.end()) {
component->onClick = [hrefPair]() {
std::cout << "Direct to: " << hrefPair->second << std::endl;
navTo(hrefPair->second);
window->navTo(hrefPair->second);
};
}
}

+ 47
- 0
src/graphics/opengl/Window.cpp View File

@@ -3,9 +3,14 @@
#include "shaders/gen/TextureShader.h"
#include "../../html/TagNode.h"
#include "../../html/TextNode.h"
#include "../../networking/HTTPRequest.h"
#include "../../html/HTMLParser.h"
#include "StringUtils.h"
#include <cmath>
#include <ctime>
#include <iostream>
#include "URL.h"
#include "Log.h"

void deleteComponent(std::shared_ptr<Component> &component);
void deleteNode(std::shared_ptr<Node> node);
@@ -396,3 +401,45 @@ std::shared_ptr<Component> Window::searchComponentTree(const std::shared_ptr<Com
}
return nullptr;
}

void Window::navTo(std::string url) {
logDebug() << "navTo(" << url << ")" << std::endl;
currentURL = currentURL.merge(URL(url));
logDebug() << "go to: " << currentURL << std::endl;
setWindowContent(currentURL);
}

void handleRequest(const HTTPResponse &response) {
std::cout << "main:::handleRequest - statusCode: " << response.statusCode << std::endl;
if (response.statusCode == 200) {
const std::unique_ptr<HTMLParser> parser = std::make_unique<HTMLParser>();
const std::clock_t begin = clock();
std::shared_ptr<Node> rootNode = parser->parse(response.body);
const std::clock_t end = clock();
std::cout << "Parsed document in: " << std::fixed << ((static_cast<double>(end - begin)) / CLOCKS_PER_SEC) << std::scientific << " seconds" << std::endl;
window->setDOM(rootNode);
}
else if (response.statusCode == 301) {
std::string location;
if (response.properties.find("Location")==response.properties.end()) {
if (response.properties.find("location")==response.properties.end()) {
std::cout << "::handleRequest - got 301 without a location" << std::endl;
for(auto const &row : response.properties) {
std::cout << "::handleRequest - " << row.first << "=" << response.properties.at(row.first) << std::endl;
}
return;
} else {
location = response.properties.at("location");
}
} else {
location = response.properties.at("Location");
}
std::cout << "Redirect To: " << location << std::endl;
const std::unique_ptr<HTTPRequest> request = std::make_unique<HTTPRequest>(getHostFromURL(location), getDocumentFromURL(location));
request->sendRequest(handleRequest);
return;
}
else {
std::cout << "Unknown Status Code: " << response.statusCode << std::endl;
}
}

+ 9
- 1
src/graphics/opengl/Window.h View File

@@ -12,7 +12,8 @@
#include <memory>
#include <vector>
#include <algorithm>

#include "../../networking/HTTPResponse.h"
#include "../../URL.h"

class Window {
private:
@@ -33,6 +34,8 @@ public:
void renderComponents(std::shared_ptr<Component> component);
void resizeComponentTree(const std::shared_ptr<Component> &component, const int windowWidth, const int windowHeight);
std::shared_ptr<Component> searchComponentTree(const std::shared_ptr<Component> &component, const int x, const int y);
void navTo(std::string url);
// properties
float transformMatrix[16] = {
1, 0, 0, 0,
0, 1, 0, 0,
@@ -55,6 +58,11 @@ public:
GLFWcursor* cursorHand;
GLFWcursor* cursorArrow;
GLFWcursor* cursorIbeam;
URL currentURL;
};

bool setWindowContent(URL const& url);
void handleRequest(const HTTPResponse &response);
extern const std::unique_ptr<Window> window;

#endif

+ 1
- 1
src/html/Node.cpp View File

@@ -11,7 +11,7 @@ std::vector<std::string> Node::getSourceList() {
std::vector<std::string> returnVec;

for (std::shared_ptr<Node>& child : children) {
auto childSrcs = std::move(child->getSourceList());
auto childSrcs = child->getSourceList();
returnVec.insert(returnVec.end(),
childSrcs.begin(),
childSrcs.end());

+ 1
- 1
src/html/TagNode.cpp View File

@@ -12,7 +12,7 @@ std::vector<std::string> TagNode::getSourceList() {
}

for (std::shared_ptr<Node>& child : children) {
auto childSrcs = std::move(child->getSourceList());
auto childSrcs = child->getSourceList();
returnVec.insert(returnVec.end(),
childSrcs.begin(),
childSrcs.end());

+ 59
- 9
src/main.cpp View File

@@ -8,9 +8,7 @@
#include "Log.h"

const std::unique_ptr<Window> window = std::make_unique<Window>();
URL currentURL;

bool setWindowContent(URL const& url);
//URL currentURL;

bool setWindowContent(URL const& url) {
WebResource res = getWebResource(url);
@@ -28,32 +26,84 @@ bool setWindowContent(URL const& url) {
return true;
}

/*
void navTo(std::string url) {
logDebug() << "navTo(" << url << ")" << std::endl;
currentURL = currentURL.merge(URL(url));
logDebug() << "go to: " << currentURL << std::endl;
setWindowContent(currentURL);
//std::shared_ptr<URI> uri = parseUri(url);
//const std::shared_ptr<HTTPRequest> request = std::make_shared<HTTPRequest>(uri);
//currentURL=url;
//request->sendRequest(handleRequest);
}
*/

/*
void handleRequest(const HTTPResponse &response) {
std::cout << "main:::handleRequest - statusCode: " << response.statusCode << std::endl;
if (response.statusCode == 200) {
const std::unique_ptr<HTMLParser> parser = std::make_unique<HTMLParser>();
const std::clock_t begin = clock();
std::shared_ptr<Node> rootNode = parser->parse(response.body);
const std::clock_t end = clock();
std::cout << "Parsed document in: " << std::fixed << ((static_cast<double>(end - begin)) / CLOCKS_PER_SEC) << std::scientific << " seconds" << std::endl;
window->setDOM(rootNode);
}
else if (response.statusCode == 301) {
std::string location;
if (response.properties.find("Location")==response.properties.end()) {
if (response.properties.find("location")==response.properties.end()) {
std::cout << "::handleRequest - got 301 without a location" << std::endl;
for(auto const &row : response.properties) {
std::cout << "::handleRequest - " << row.first << "=" << response.properties.at(row.first) << std::endl;
}
return;
} else {
location = response.properties.at("location");
}
} else {
location = response.properties.at("Location");
}
std::cout << "Redirect To: " << location << std::endl;
std::shared_ptr<URI> uri = parseUri(location);
const std::unique_ptr<HTTPRequest> request = std::make_unique<HTTPRequest>(uri);
request->sendRequest(handleRequest);
return;
}
else {
std::cout << "Unknown Status Code: " << response.statusCode << std::endl;
}
}
*/

int main(int argc, char *argv[]) {
if (argc == 1) {
std::cout << "./netrunner <url|file.html> [-log <error|warning|info|debug>]" << std::endl;
std::cout << "./netrunner <url|file.html> [-log <error|warning|notice|info|debug>]" << std::endl;
return 1;
}
std::cout << "/g/ntr - NetRunner build " << __DATE__ << std::endl;
initCLParams(argc, argv);
std::string url = getCLParamByIndex(1);
if (url[0] == '/') {
url = "file://" + url;
}
currentURL=URL(url);
logDebug() << "loading [" << currentURL << "]" << std::endl;
//currentURL=URL(url);
window->currentURL=URL(argv[1]);
logDebug() << "loading [" << window->currentURL << "]" << std::endl;

if (!setWindowContent(currentURL)) {
if (!setWindowContent(window->currentURL)) {
return 1;
}

WebResource res = getWebResource(window->currentURL);
if (res.resourceType == ResourceType::INVALID) {
std::cout << "Invalid resource type" << std::endl;
return 1;
}

window->init();
if (!window->window) {
return 1;

+ 5
- 4
src/networking/HTTPRequest.cpp View File

@@ -22,28 +22,29 @@ WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
#endif

HTTPRequest::HTTPRequest(const std::string &hostName, const std::string &doc) {
HTTPRequest::HTTPRequest(const std::shared_ptr<URI> u) {
#ifdef WIN32
if (iResult != 0) {
std::cout << "WSAStartup failed: " << iResult << std::endl;
return;
}
#endif
document = doc;
uri = u;
version = Version::HTTP10;
method = Method::GET;
host = hostName;
userAgent = "NetRunner";
}

bool HTTPRequest::sendRequest(std::function<void(const HTTPResponse&)> responseCallback) const {
struct addrinfo hints;
struct addrinfo *serverInfo = nullptr;
std::string host = uri->authority.host;
std::string document = uri->path;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
const int res = getaddrinfo(host.c_str(), "80", &hints, &serverInfo);
const int res = getaddrinfo(uri->authority.host.c_str(), std::to_string(uri->authority.port).c_str(), &hints, &serverInfo);
if (res != 0) {
std::cout << "Could not lookup " << host << ": " << res << std::endl;
freeaddrinfo(serverInfo);

+ 4
- 3
src/networking/HTTPRequest.h View File

@@ -2,6 +2,8 @@
#define HTTPREQUEST_H

#include "HTTPResponse.h"
#include "URI.h"

#include <functional>
#include <string>

@@ -16,16 +18,15 @@ enum class Method {

class HTTPRequest {
public:
HTTPRequest(const std::string &hostName, const std::string &doc);
HTTPRequest(const std::shared_ptr<URI> u);
bool sendRequest(std::function<void(const HTTPResponse&)> responseCallback) const;
const std::string versionToString(const Version version) const;
const std::string methodToString(const Method method) const;
private:
std::string document;
Version version;
Method method;
std::string host;
std::string userAgent;
std::shared_ptr<URI> uri;
};

#endif

+ 222
- 0
src/networking/URI.cpp View File

@@ -0,0 +1,222 @@
#include "../StringUtils.h"
#include "URI.h"

#include <algorithm>
#include <iostream>
#include <memory>
#include <string>

#ifndef VERSION
std::string stringToLower(std::string s);
std::string stringToLower(std::string s) {
std::transform(s.begin(), s.end(), s.begin(),
[](unsigned char c){ return std::tolower(c); });
return s;
}
#endif

/*
* From the following RFC: https://tools.ietf.org/html/rfc3986
*
* pct-encoded = "%" HEXDIG HEXDIG
* reserved = gen-delims / sub-delims
* gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
* sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
* / "*" / "+" / "," / ";" / "="
*
*/

enum uri_parse_state {
SCHEME,
FIRST_SLASH,
SECOND_SLASH_OR_ELSE,
AUTHORITY,
AUTHORITY_USERINFO, /* The part before '@' */
AUTHORITY_PASSWORD, /* RFC states that we should either reject or ignore it (We ignore it) */
AUTHORITY_HOST,
AUTHORITY_PORT,
PATH,
QUERY,
FRAGMENT,
};

std::unique_ptr<URI> parseUri(std::string raw) {
std::unique_ptr<URI> uri = std::make_unique<URI>();
uri->path = "/";
unsigned int cursor = 0;
unsigned int last = 0;
unsigned int last_semicolon = 0;
enum uri_parse_state state = SCHEME;
// First character of scheme MUST be alphabetic
if (!isalpha(raw[cursor])) {
std::cout << "parse scheme error" << std::endl;
return NULL;
}
for (cursor = 1; cursor < raw.length(); cursor++) {
/* TODO
* Allow scheme-less uri (and fallback to https/http) */
if (state == SCHEME) {
if (raw[cursor] == ':') {
uri->scheme = stringToLower(raw.substr(0, cursor));
/* TODO
* Put default port now (Should use a table for that but
* I don't know C++ enough) */
if (uri->scheme == "http") {
uri->authority.port = 80;
}
state = FIRST_SLASH;
} else if (!isalpha(raw[cursor]) && !isdigit(raw[cursor]) && raw[cursor] != '+' &&
raw[cursor] != '-' && raw[cursor] != '.') {
std::cout << "parse scheme error" << std::endl;
return NULL;
}
} else if (state == FIRST_SLASH) {
if (raw[cursor] == '/') {
state = SECOND_SLASH_OR_ELSE;
} else {
std::cout << "parse error" << std::endl;
}
} else if (state == SECOND_SLASH_OR_ELSE) {
if (raw[cursor] == '/') {
last = cursor + 1;
state = AUTHORITY;
} else {
// TODO Handle this, URI may have only one slash
}
} else if (state == AUTHORITY) {
/* At this point, this could either be the semi colon for
* the password or for the port*/
if (raw[cursor] == ':') {
last_semicolon = cursor;
} else if (raw[cursor] == '@') {
uri->authority.userinfo = raw.substr(last, cursor - last);
last = cursor + 1;
state = AUTHORITY_HOST;
// Authority is finished, everything should be considered as the host[port].
// TODO terminated by the next slash ("/"), question mark ("?"), or number sign ("#") character, or by the end of the URI.
// What to do when ? and # ?
} else if (raw[cursor] == '/') {
if (last_semicolon > 0) {
// TODO Validate port
if (cursor - last_semicolon - 1 > 0) {
uri->authority.port = std::stoi(raw.substr(last_semicolon+1, cursor - last_semicolon+1));
}
uri->authority.host = raw.substr(last, last_semicolon - last);
} else {
uri->authority.host = raw.substr(last, cursor - last);
}
last = cursor;
cursor--;
state = PATH;
} else if (raw[cursor] == '?' || raw[cursor] == '#') {
uri->authority.host = raw.substr(last, cursor - last);
last = cursor;
if (raw[cursor] == '?') {
state = QUERY;
} else {
state = FRAGMENT;
}
} else if (cursor + 1 == raw.length()) {
uri->authority.host = raw.substr(last, last_semicolon - last);
uri->path = "/";
break;
}
} else if (state == AUTHORITY_HOST) {
if (raw[cursor] == ':') {
uri->authority.host = raw.substr(last, cursor - last);
last = cursor+1;
state = AUTHORITY_PORT;
} else if (raw[cursor] == '/') {
uri->authority.host = raw.substr(last, cursor - last);
last = cursor;
cursor--;
state = PATH;
}
} else if (state == AUTHORITY_PORT) {
if (raw[cursor] == '/') {
if (cursor - last > 0) {
uri->authority.port = std::stoi(raw.substr(last, cursor - last));
}
last = cursor;
cursor--;
state = PATH;
} else if (!isdigit(raw[cursor])) {

}
} else if (state == PATH) {
if (raw[cursor] == '?' || raw[cursor] == '#') {
uri->path = raw.substr(last, cursor - last);
last = cursor;
if (raw[cursor] == '?') {
state = QUERY;
} else {
state = FRAGMENT;
}
} else if (cursor + 1 == raw.length()) {
uri->path = raw.substr(last, cursor + 1 - last);
break;
}
} else if (state == QUERY) {
if (raw[cursor] == '#') {
uri->query = raw.substr(last + 1, cursor - last - 1);
last = cursor;
state = FRAGMENT;
} else if (cursor + 1 == raw.length()) {
uri->query = raw.substr(last + 1, cursor + 1 - last);
break;
}
} else if (state == FRAGMENT) {
if (cursor + 1 == raw.length()) {
uri->fragment = raw.substr(last + 1, cursor + 1 - last);
break;
}
}
}
return uri;
}

#ifndef VERSION

void test_parser(std::string url, std::string scheme, std::string userinfo,
std::string host, int port, std::string path, std::string query, std::string fragment) {
std::unique_ptr<URI> uri = parseUri(url);
if (uri->scheme == scheme && uri->authority.userinfo == userinfo &&
uri->authority.host == host && uri->authority.port == port &&
uri->path == path && uri->query == query && uri->fragment == fragment) {
std::cout << "noice" << std::endl;
} else {
std::cout << "nope" << std::endl;
std::cout << uri->scheme << " vs " << scheme << std::endl;
std::cout << uri->authority.userinfo << " vs " << userinfo << std::endl;
std::cout << uri->authority.host << " vs " << host << std::endl;
std::cout << uri->authority.port << " vs " << port << std::endl;
std::cout << uri->path << " vs " << path << std::endl;
std::cout << uri->query << " vs " << query << std::endl;
std::cout << uri->fragment << " vs " << fragment << std::endl;
}
}

int
main(void) {
test_parser("HTTP://username:password@www.example.org:8080/", "http", "username:password", "www.example.org", 8080, "/", "", "");
test_parser("http://username:password@www.example.org:8080/", "http", "username:password", "www.example.org", 8080, "/", "", "");
test_parser("http://www.example.org:8080/", "http", "", "www.example.org", 8080, "/", "", "");
test_parser("http://www.example.org/", "http", "", "www.example.org", 80, "/", "", "");
test_parser("http://www.example.org", "http", "", "www.example.org", 80, "/", "", "");
//test_parser("http://www.example.org//", "http", "", "www.example.org", 80, "/", "", "");
test_parser("http://www.example.org/this/path", "http", "", "www.example.org", 80, "/this/path", "", "");
test_parser("http://www.example.org:/this/path", "http", "", "www.example.org", 80, "/this/path", "", "");
test_parser("http://username:password@www.example.org:/this/path", "http", "username:password", "www.example.org", 80, "/this/path", "", "");
test_parser("http://username:password@www.example.org/", "http", "username:password", "www.example.org", 80, "/", "", "");
test_parser("http://username:passwor:d@www.example.org/", "http", "username:passwor:d", "www.example.org", 80, "/", "", "");
test_parser("http://username:passwor:d@www.example.org:9090/", "http", "username:passwor:d", "www.example.org", 9090, "/", "", "");
test_parser("http://username:passwor:d@www.example.org:9090/this/path?query", "http", "username:passwor:d", "www.example.org", 9090, "/this/path", "query", "");
test_parser("http://www.example.org:9090/this/path?query", "http", "", "www.example.org", 9090, "/this/path", "query", "");
test_parser("http://www.example.org/this/path?query", "http", "", "www.example.org", 80, "/this/path", "query", "");
test_parser("http://www.example.org?query", "http", "", "www.example.org", 80, "/", "query", "");
test_parser("http://www.example.org/?query", "http", "", "www.example.org", 80, "/", "query", "");
test_parser("http://www.example.org?query#fragment", "http", "", "www.example.org", 80, "/", "query", "fragment");
test_parser("http://www.example.org/#fragment", "http", "", "www.example.org", 80, "/", "", "fragment");
test_parser("http://www.example.org#fragment", "http", "", "www.example.org", 80, "/", "", "fragment");
}
#endif

+ 23
- 0
src/networking/URI.h View File

@@ -0,0 +1,23 @@
#ifndef URI_H
#define URI_H

#include <memory>
#include <string>

struct Authority {
std::string userinfo;
std::string host;
int port;
};

struct URI {
std::string scheme;
struct Authority authority; /* Can be empty */
std::string path;
std::string query; // ?blablabla=asdfasf....
std::string fragment; // #asfawefm
};

std::unique_ptr<URI> parseUri(std::string raw);

#endif

+ 113
- 55
xcode/Saltasaurus.xcodeproj/project.pbxproj View File

@@ -7,35 +7,44 @@
objects = {

/* Begin PBXBuildFile section */
843369541F1D885F00840DA9 /* AnimeComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843369151F1D885F00840DA9 /* AnimeComponent.cpp */; };
843369551F1D885F00840DA9 /* BoxComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843369171F1D885F00840DA9 /* BoxComponent.cpp */; };
843369561F1D885F00840DA9 /* Component.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843369191F1D885F00840DA9 /* Component.cpp */; };
843369571F1D885F00840DA9 /* ComponentBuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8433691B1F1D885F00840DA9 /* ComponentBuilder.cpp */; };
843369581F1D885F00840DA9 /* TextComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8433691D1F1D885F00840DA9 /* TextComponent.cpp */; };
843369591F1D885F00840DA9 /* AElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843369201F1D885F00840DA9 /* AElement.cpp */; };
8433695A1F1D885F00840DA9 /* BLOCKQUOTEElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843369221F1D885F00840DA9 /* BLOCKQUOTEElement.cpp */; };
8433695C1F1D885F00840DA9 /* H1Element.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843369261F1D885F00840DA9 /* H1Element.cpp */; };
8433695D1F1D885F00840DA9 /* H2Element.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843369281F1D885F00840DA9 /* H2Element.cpp */; };
8433695E1F1D885F00840DA9 /* H3Element.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8433692A1F1D885F00840DA9 /* H3Element.cpp */; };
8433695F1F1D885F00840DA9 /* LIElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8433692C1F1D885F00840DA9 /* LIElement.cpp */; };
843369601F1D885F00840DA9 /* PElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8433692E1F1D885F00840DA9 /* PElement.cpp */; };
843369621F1D885F00840DA9 /* SPANElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843369321F1D885F00840DA9 /* SPANElement.cpp */; };
843369631F1D885F00840DA9 /* Window.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8433693E1F1D885F00840DA9 /* Window.cpp */; };
843369641F1D885F00840DA9 /* TextRasterizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843369411F1D885F00840DA9 /* TextRasterizer.cpp */; };
843369651F1D885F00840DA9 /* TextRasterizerCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843369431F1D885F00840DA9 /* TextRasterizerCache.cpp */; };
843369661F1D885F00840DA9 /* HTMLParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843369461F1D885F00840DA9 /* HTMLParser.cpp */; };
843369671F1D885F00840DA9 /* Node.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843369481F1D885F00840DA9 /* Node.cpp */; };
843369681F1D885F00840DA9 /* TagNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8433694A1F1D885F00840DA9 /* TagNode.cpp */; };
843369691F1D885F00840DA9 /* TextNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8433694C1F1D885F00840DA9 /* TextNode.cpp */; };
8433696A1F1D885F00840DA9 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8433694E1F1D885F00840DA9 /* main.cpp */; };
8433696B1F1D885F00840DA9 /* HTTPRequest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843369501F1D885F00840DA9 /* HTTPRequest.cpp */; };
8433696C1F1D885F00840DA9 /* HTTPResponse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843369521F1D885F00840DA9 /* HTTPResponse.cpp */; };
8433696F1F1D888E00840DA9 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8433696E1F1D888E00840DA9 /* OpenGL.framework */; };
843369711F1D889C00840DA9 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 843369701F1D889C00840DA9 /* Cocoa.framework */; };
843369731F1D88A000840DA9 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 843369721F1D88A000840DA9 /* IOKit.framework */; };
843369751F1D88A800840DA9 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 843369741F1D88A800840DA9 /* CoreVideo.framework */; };
8437F8981F2F540300E89305 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8433694E1F1D885F00840DA9 /* main.cpp */; };
8437F89A1F2F543400E89305 /* StringUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8437F8991F2F543400E89305 /* StringUtils.cpp */; };
8437F89C1F2F54B600E89305 /* HTTPRequest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843369501F1D885F00840DA9 /* HTTPRequest.cpp */; };
8437F89D1F2F54B900E89305 /* HTTPResponse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843369521F1D885F00840DA9 /* HTTPResponse.cpp */; };
8437F89E1F2F54BE00E89305 /* WebResource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843C30E71F2F5110006F00B3 /* WebResource.cpp */; };
8437F89F1F2F552500E89305 /* AnimeComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843369151F1D885F00840DA9 /* AnimeComponent.cpp */; };
8437F8A01F2F552900E89305 /* BoxComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843369171F1D885F00840DA9 /* BoxComponent.cpp */; };
8437F8A11F2F552C00E89305 /* Component.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843369191F1D885F00840DA9 /* Component.cpp */; };
8437F8A21F2F552E00E89305 /* ComponentBuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8433691B1F1D885F00840DA9 /* ComponentBuilder.cpp */; };
8437F8A31F2F553100E89305 /* TextComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8433691D1F1D885F00840DA9 /* TextComponent.cpp */; };
8437F8A41F2F555600E89305 /* DIVElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 849C756A1F2BF9580082827A /* DIVElement.cpp */; };
8437F8A51F2F555600E89305 /* Element.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 849C756C1F2BF9580082827A /* Element.cpp */; };
8437F8A61F2F555600E89305 /* STRONGElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 849C756E1F2BF9580082827A /* STRONGElement.cpp */; };
8437F8A71F2F555600E89305 /* AElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843369201F1D885F00840DA9 /* AElement.cpp */; };
8437F8A81F2F555600E89305 /* BLOCKQUOTEElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843369221F1D885F00840DA9 /* BLOCKQUOTEElement.cpp */; };
8437F8A91F2F555600E89305 /* H1Element.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843369261F1D885F00840DA9 /* H1Element.cpp */; };
8437F8AA1F2F555600E89305 /* H2Element.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843369281F1D885F00840DA9 /* H2Element.cpp */; };
8437F8AB1F2F555600E89305 /* H3Element.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8433692A1F1D885F00840DA9 /* H3Element.cpp */; };
8437F8AC1F2F555600E89305 /* LIElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8433692C1F1D885F00840DA9 /* LIElement.cpp */; };
8437F8AD1F2F555600E89305 /* PElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8433692E1F1D885F00840DA9 /* PElement.cpp */; };
8437F8AE1F2F555600E89305 /* SPANElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843369321F1D885F00840DA9 /* SPANElement.cpp */; };
8437F8AF1F2F555600E89305 /* Window.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8433693E1F1D885F00840DA9 /* Window.cpp */; };
8437F8B01F2F555600E89305 /* TextRasterizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843369411F1D885F00840DA9 /* TextRasterizer.cpp */; };
8437F8B11F2F555600E89305 /* TextRasterizerCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843369431F1D885F00840DA9 /* TextRasterizerCache.cpp */; };
8437F8B21F2F555600E89305 /* HTMLParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843369461F1D885F00840DA9 /* HTMLParser.cpp */; };
8437F8B31F2F555600E89305 /* Node.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843369481F1D885F00840DA9 /* Node.cpp */; };
8437F8B41F2F555600E89305 /* TagNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8433694A1F1D885F00840DA9 /* TagNode.cpp */; };
8437F8B51F2F555600E89305 /* TextNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8433694C1F1D885F00840DA9 /* TextNode.cpp */; };
844925051F1D94ED007E8644 /* DejaVuSerif-Bold.ttf in CopyFiles */ = {isa = PBXBuildFile; fileRef = 84B6602B1F1D8DF000AEFBEC /* DejaVuSerif-Bold.ttf */; };
844925061F1D94EF007E8644 /* DejaVuSerif.ttf in CopyFiles */ = {isa = PBXBuildFile; fileRef = 844925041F1D9478007E8644 /* DejaVuSerif.ttf */; };
846965401F32A9EF00980986 /* BrowsingHistory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 846965391F32A9EF00980986 /* BrowsingHistory.cpp */; };
846965411F32A9EF00980986 /* CommandLineParams.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8469653B1F32A9EF00980986 /* CommandLineParams.cpp */; };
846965421F32A9EF00980986 /* Log.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8469653D1F32A9EF00980986 /* Log.cpp */; };
846965431F32A9EF00980986 /* URL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8469653E1F32A9EF00980986 /* URL.cpp */; };
/* End PBXBuildFile section */

/* Begin PBXCopyFilesBuildPhase section */
@@ -110,7 +119,26 @@
843369701F1D889C00840DA9 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
843369721F1D88A000840DA9 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; };
843369741F1D88A800840DA9 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; };
8437F8991F2F543400E89305 /* StringUtils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = StringUtils.cpp; path = "/Users/admin/Sites/nr-textwork170728/xcode/../src/StringUtils.cpp"; sourceTree = "<absolute>"; };
8437F89B1F2F545D00E89305 /* StringUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = StringUtils.h; path = "/Users/admin/Sites/nr-textwork170728/xcode/../src/StringUtils.h"; sourceTree = "<absolute>"; };
843C30E71F2F5110006F00B3 /* WebResource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WebResource.cpp; path = "/Users/admin/Sites/nr-textwork170728/xcode/../src/WebResource.cpp"; sourceTree = "<absolute>"; };
843C30E81F2F5110006F00B3 /* WebResource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebResource.h; path = "/Users/admin/Sites/nr-textwork170728/xcode/../src/WebResource.h"; sourceTree = "<absolute>"; };
843C31291F2F5307006F00B3 /* info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = info.plist; path = xcode/info.plist; sourceTree = "<group>"; };
844925041F1D9478007E8644 /* DejaVuSerif.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = DejaVuSerif.ttf; path = ../DejaVuSerif.ttf; sourceTree = SOURCE_ROOT; };
846965381F32A9EF00980986 /* Log.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Log.h; sourceTree = "<group>"; };
846965391F32A9EF00980986 /* BrowsingHistory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BrowsingHistory.cpp; sourceTree = "<group>"; };
8469653A1F32A9EF00980986 /* BrowsingHistory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BrowsingHistory.h; sourceTree = "<group>"; };
8469653B1F32A9EF00980986 /* CommandLineParams.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CommandLineParams.cpp; sourceTree = "<group>"; };
8469653C1F32A9EF00980986 /* CommandLineParams.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CommandLineParams.h; sourceTree = "<group>"; };
8469653D1F32A9EF00980986 /* Log.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Log.cpp; sourceTree = "<group>"; };
8469653E1F32A9EF00980986 /* URL.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = URL.cpp; sourceTree = "<group>"; };
8469653F1F32A9EF00980986 /* URL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = URL.h; sourceTree = "<group>"; };
849C756A1F2BF9580082827A /* DIVElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DIVElement.cpp; sourceTree = "<group>"; };
849C756B1F2BF9580082827A /* DIVElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DIVElement.h; sourceTree = "<group>"; };
849C756C1F2BF9580082827A /* Element.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Element.cpp; sourceTree = "<group>"; };
849C756D1F2BF9580082827A /* Element.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Element.h; sourceTree = "<group>"; };
849C756E1F2BF9580082827A /* STRONGElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = STRONGElement.cpp; sourceTree = "<group>"; };
849C756F1F2BF9580082827A /* STRONGElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = STRONGElement.h; sourceTree = "<group>"; };
84B6602B1F1D8DF000AEFBEC /* DejaVuSerif-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "DejaVuSerif-Bold.ttf"; path = "../DejaVuSerif-Bold.ttf"; sourceTree = SOURCE_ROOT; };
/* End PBXFileReference section */

@@ -149,23 +177,36 @@
8433690A1F1D881B00840DA9 /* Saltasaurus */ = {
isa = PBXGroup;
children = (
843C31291F2F5307006F00B3 /* info.plist */,
84B6602B1F1D8DF000AEFBEC /* DejaVuSerif-Bold.ttf */,
844925041F1D9478007E8644 /* DejaVuSerif.ttf */,
843369121F1D885F00840DA9 /* src */,
);
path = Saltasaurus;
sourceTree = "<group>";
name = Saltasaurus;
path = "/Users/admin/Sites/nr-textwork170728";
sourceTree = "<absolute>";
};
843369121F1D885F00840DA9 /* src */ = {
isa = PBXGroup;
children = (
843369131F1D885F00840DA9 /* graphics */,
843369451F1D885F00840DA9 /* html */,
8433694E1F1D885F00840DA9 /* main.cpp */,
8433694F1F1D885F00840DA9 /* networking */,
8433694E1F1D885F00840DA9 /* main.cpp */,
8437F8991F2F543400E89305 /* StringUtils.cpp */,
8437F89B1F2F545D00E89305 /* StringUtils.h */,
843C30E71F2F5110006F00B3 /* WebResource.cpp */,
843C30E81F2F5110006F00B3 /* WebResource.h */,
846965391F32A9EF00980986 /* BrowsingHistory.cpp */,
8469653A1F32A9EF00980986 /* BrowsingHistory.h */,
8469653B1F32A9EF00980986 /* CommandLineParams.cpp */,
8469653C1F32A9EF00980986 /* CommandLineParams.h */,
8469653D1F32A9EF00980986 /* Log.cpp */,
846965381F32A9EF00980986 /* Log.h */,
8469653E1F32A9EF00980986 /* URL.cpp */,
8469653F1F32A9EF00980986 /* URL.h */,
);
name = src;
path = ../../src;
path = src;
sourceTree = "<group>";
};
843369131F1D885F00840DA9 /* graphics */ = {
@@ -176,8 +217,7 @@
843369341F1D885F00840DA9 /* opengl */,
843369401F1D885F00840DA9 /* text */,
);
name = graphics;
path = ../src/graphics;
path = graphics;
sourceTree = "<group>";
};
843369141F1D885F00840DA9 /* components */ = {
@@ -200,6 +240,12 @@
8433691F1F1D885F00840DA9 /* elements */ = {
isa = PBXGroup;
children = (
849C756A1F2BF9580082827A /* DIVElement.cpp */,
849C756B1F2BF9580082827A /* DIVElement.h */,
849C756C1F2BF9580082827A /* Element.cpp */,
849C756D1F2BF9580082827A /* Element.h */,
849C756E1F2BF9580082827A /* STRONGElement.cpp */,
849C756F1F2BF9580082827A /* STRONGElement.h */,
843369201F1D885F00840DA9 /* AElement.cpp */,
843369211F1D885F00840DA9 /* AElement.h */,
843369221F1D885F00840DA9 /* BLOCKQUOTEElement.cpp */,
@@ -287,8 +333,7 @@
843369521F1D885F00840DA9 /* HTTPResponse.cpp */,
843369531F1D885F00840DA9 /* HTTPResponse.h */,
);
name = networking;
path = ../src/networking;
path = networking;
sourceTree = "<group>";
};
8433696D1F1D888E00840DA9 /* Frameworks */ = {
@@ -359,29 +404,38 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
843369641F1D885F00840DA9 /* TextRasterizer.cpp in Sources */,
843369591F1D885F00840DA9 /* AElement.cpp in Sources */,
8433695A1F1D885F00840DA9 /* BLOCKQUOTEElement.cpp in Sources */,
8433695C1F1D885F00840DA9 /* H1Element.cpp in Sources */,
843369631F1D885F00840DA9 /* Window.cpp in Sources */,
843369541F1D885F00840DA9 /* AnimeComponent.cpp in Sources */,
843369651F1D885F00840DA9 /* TextRasterizerCache.cpp in Sources */,
8433696A1F1D885F00840DA9 /* main.cpp in Sources */,
843369561F1D885F00840DA9 /* Component.cpp in Sources */,
8433696B1F1D885F00840DA9 /* HTTPRequest.cpp in Sources */,
8433695F1F1D885F00840DA9 /* LIElement.cpp in Sources */,
843369661F1D885F00840DA9 /* HTMLParser.cpp in Sources */,
843369581F1D885F00840DA9 /* TextComponent.cpp in Sources */,
8433695E1F1D885F00840DA9 /* H3Element.cpp in Sources */,
8433695D1F1D885F00840DA9 /* H2Element.cpp in Sources */,
843369601F1D885F00840DA9 /* PElement.cpp in Sources */,
843369551F1D885F00840DA9 /* BoxComponent.cpp in Sources */,
843369691F1D885F00840DA9 /* TextNode.cpp in Sources */,
843369571F1D885F00840DA9 /* ComponentBuilder.cpp in Sources */,
8433696C1F1D885F00840DA9 /* HTTPResponse.cpp in Sources */,
843369621F1D885F00840DA9 /* SPANElement.cpp in Sources */,
843369681F1D885F00840DA9 /* TagNode.cpp in Sources */,
843369671F1D885F00840DA9 /* Node.cpp in Sources */,
8437F8A41F2F555600E89305 /* DIVElement.cpp in Sources */,
8437F8A51F2F555600E89305 /* Element.cpp in Sources */,
8437F8A61F2F555600E89305 /* STRONGElement.cpp in Sources */,
8437F8A71F2F555600E89305 /* AElement.cpp in Sources */,
8437F8A81F2F555600E89305 /* BLOCKQUOTEElement.cpp in Sources */,
8437F8A91F2F555600E89305 /* H1Element.cpp in Sources */,
8437F8AA1F2F555600E89305 /* H2Element.cpp in Sources */,
846965411F32A9EF00980986 /* CommandLineParams.cpp in Sources */,
8437F8AB1F2F555600E89305 /* H3Element.cpp in Sources */,
8437F8AC1F2F555600E89305 /* LIElement.cpp in Sources */,
8437F8AD1F2F555600E89305 /* PElement.cpp in Sources */,
846965431F32A9EF00980986 /* URL.cpp in Sources */,
8437F8AE1F2F555600E89305 /* SPANElement.cpp in Sources */,
8437F8AF1F2F555600E89305 /* Window.cpp in Sources */,
8437F8B01F2F555600E89305 /* TextRasterizer.cpp in Sources */,
8437F8B11F2F555600E89305 /* TextRasterizerCache.cpp in Sources */,
8437F8B21F2F555600E89305 /* HTMLParser.cpp in Sources */,
8437F8B31F2F555600E89305 /* Node.cpp in Sources */,
8437F8B41F2F555600E89305 /* TagNode.cpp in Sources */,
8437F8B51F2F555600E89305 /* TextNode.cpp in Sources */,
8437F8A21F2F552E00E89305 /* ComponentBuilder.cpp in Sources */,
8437F89A1F2F543400E89305 /* StringUtils.cpp in Sources */,
846965421F32A9EF00980986 /* Log.cpp in Sources */,
8437F8981F2F540300E89305 /* main.cpp in Sources */,
8437F89D1F2F54B900E89305 /* HTTPResponse.cpp in Sources */,
8437F89C1F2F54B600E89305 /* HTTPRequest.cpp in Sources */,
8437F89E1F2F54BE00E89305 /* WebResource.cpp in Sources */,
846965401F32A9EF00980986 /* BrowsingHistory.cpp in Sources */,
8437F89F1F2F552500E89305 /* AnimeComponent.cpp in Sources */,
8437F8A01F2F552900E89305 /* BoxComponent.cpp in Sources */,
8437F8A11F2F552C00E89305 /* Component.cpp in Sources */,
8437F8A31F2F553100E89305 /* TextComponent.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -487,7 +541,9 @@
/usr/local/include/harfbuzz,
/usr/local/include/,
);
INFOPLIST_FILE = "$(SRCROOT)/info.plist";
LIBRARY_SEARCH_PATHS = /usr/local/lib;
MACOSX_DEPLOYMENT_TARGET = 10.12;
OTHER_LDFLAGS = (
"-lglfw3",
"-lharfbuzz",
@@ -509,7 +565,9 @@
/usr/local/include/harfbuzz,
/usr/local/include/,
);
INFOPLIST_FILE = "$(SRCROOT)/info.plist";
LIBRARY_SEARCH_PATHS = /usr/local/lib;
MACOSX_DEPLOYMENT_TARGET = 10.12;
OTHER_LDFLAGS = (
"-lglfw3",
"-lharfbuzz",

BIN
xcode/Saltasaurus.xcodeproj/project.xcworkspace/xcuserdata/admin.xcuserdatad/UserInterfaceState.xcuserstate View File


+ 33
- 0
xcode/Saltasaurus.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/Saltasaurus.xcscheme View File

@@ -49,6 +49,7 @@
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
enableAddressSanitizer = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
@@ -64,8 +65,40 @@
<CommandLineArguments>
<CommandLineArgument
argument = "http://endchan.xyz/"
isEnabled = "NO">
</CommandLineArgument>
<CommandLineArgument
argument = "http://www.browserscope.org/"
isEnabled = "YES">
</CommandLineArgument>
<CommandLineArgument
argument = "http://Anhai.org/"
isEnabled = "NO">
</CommandLineArgument>
<CommandLineArgument
argument = "http://A\han.org/"
isEnabled = "NO">
</CommandLineArgument>
<CommandLineArgument
argument = "ittp://4chon.org/"
isEnabled = "NO">
</CommandLineArgument>
<CommandLineArgument
argument = "motherfuckingpebsitehttp://4chon.org/"
isEnabled = "NO">
</CommandLineArgument>
<CommandLineArgument
argument = "http://Drhan.org/"
isEnabled = "NO">
</CommandLineArgument>
<CommandLineArgument
argument = "http://FchIp.org/"
isEnabled = "NO">
</CommandLineArgument>
<CommandLineArgument
argument = "http://ccfaa.org/"
isEnabled = "NO">
</CommandLineArgument>
<CommandLineArgument
argument = "http://motherfuckingwebsite.com/"
isEnabled = "NO">

Loading…
Cancel
Save