11 #include <CoreFoundation/CoreFoundation.h>
23 return wholeString.length() >= beginning.length() && wholeString.substr(0, beginning.length()) == beginning;
31 if (wholeString.length() < ending.length())
34 return wholeString.compare(wholeString.length()-ending.length(), ending.length(), ending) == 0;
46 return wholeString.substr(beginning.length());
58 return wholeString.substr(0, wholeString.length()-ending.length());
67 string outString = wholeString;
69 while ((pos = wholeString.find_first_of(originalChar, pos)) != string::npos)
71 outString[pos] = replacementChar;
84 size_t replacementCount = 0;
86 while ((startPos = wholeString.find(originalSubstring, startPos)) != string::npos)
88 wholeString.replace(startPos, originalSubstring.length(), replacementSubstring);
89 startPos += replacementSubstring.length();
92 return replacementCount;
100 vector<string> tokens;
101 istringstream iss(wholeString);
103 while( getline(iss, token, delimiter) )
104 tokens.push_back(token);
113 string delimiterStr(1, delimiter);
114 return join(partialStrings, delimiterStr);
123 for (vector<string>::iterator i = partialStrings.begin(); i != partialStrings.end(); )
126 if (++i != partialStrings.end())
127 wholeString += delimiter;
138 for (set<string>::iterator i = partialStrings.begin(); i != partialStrings.end(); )
141 if (++i != partialStrings.end())
142 wholeString += delimiter;
156 string whitespace =
" \t\v\n\r\f";
158 string::size_type begin = originalString.find_first_not_of(whitespace);
159 if (begin == std::string::npos)
162 string::size_type end = originalString.find_last_not_of(whitespace);
164 return originalString.substr(begin, end - begin + 1);
175 return parentCompositionIdentifier +
"/" + nodeIdentifier;
184 return nodeIdentifier +
":" + portName;
204 CFMutableStringRef strCF = CFStringCreateMutable(NULL, 0);
205 CFStringAppendCString(strCF, str.c_str(), kCFStringEncodingUTF8);
207 CFStringNormalize(strCF, kCFStringNormalizationFormD);
209 CFIndex strLength = CFStringGetLength(strCF);
210 UniChar *strBuf = (UniChar *)malloc(strLength *
sizeof(UniChar));
216 CFStringGetCharacters(strCF, CFRangeMake(0, strLength), strBuf);
218 CFStringRef empty = CFStringCreateWithCString(NULL,
"", kCFStringEncodingUTF8);
219 CFStringRef underscore = CFStringCreateWithCString(NULL,
"_", kCFStringEncodingUTF8);
220 CFStringRef doubleUnderscore = CFStringCreateWithCString(NULL,
"__", kCFStringEncodingUTF8);
221 if (!empty || !underscore || !doubleUnderscore)
224 for (CFIndex i = strLength-1; i >= 0; --i)
226 UniChar c = strBuf[i];
228 CFStringRef replacement = NULL;
231 else if (c ==
'.' || isspace(c))
232 replacement = underscore;
233 else if (c ==
'/' || c ==
':')
234 replacement = doubleUnderscore;
239 CFStringReplace(strCF, CFRangeMake(i, 1), replacement);
246 CFRelease(underscore);
247 CFRelease(doubleUnderscore);
258 return isalnum(ch) || ch ==
'_';
266 string escapedString = originalString;
267 for (string::size_type i = 0; (i = escapedString.find(
"\\", i)) != std::string::npos; i += 2)
268 escapedString.replace(i, 1,
"\\\\");
269 for (string::size_type i = 0; (i = escapedString.find(
"\"", i)) != std::string::npos; i += 2)
270 escapedString.replace(i, 1,
"\\\"");
271 for (string::size_type i = 0; (i = escapedString.find(
"{", i)) != std::string::npos; i += 2)
272 escapedString.replace(i, 1,
"\\{");
273 for (string::size_type i = 0; (i = escapedString.find(
"}", i)) != std::string::npos; i += 2)
274 escapedString.replace(i, 1,
"\\}");
275 for (string::size_type i = 0; (i = escapedString.find(
"<", i)) != std::string::npos; i += 2)
276 escapedString.replace(i, 1,
"\\<");
277 for (string::size_type i = 0; (i = escapedString.find(
">", i)) != std::string::npos; i += 2)
278 escapedString.replace(i, 1,
"\\>");
279 for (string::size_type i = 0; (i = escapedString.find(
"|", i)) != std::string::npos; i += 2)
280 escapedString.replace(i, 1,
"\\|");
281 for (string::size_type i = 0; (i = escapedString.find(
" ", i)) != std::string::npos; i += 3)
282 escapedString.replace(i, 2,
" \\ ");
283 return escapedString;
291 string unescapedString;
292 bool inEscape =
false;
293 for (string::const_iterator i = graphvizIdentifier.begin(); i != graphvizIdentifier.end(); ++i)
298 unescapedString += *i;
308 unescapedString += *i;
310 return unescapedString;
319 const string &preferredIdentifier,
const string &identifierPrefix)
321 auto isIdentifierAvailable = [&takenIdentifiers] (
const string &identifier)
323 return takenIdentifiers.find(identifier) == takenIdentifiers.end();
326 string uniqueIdentifier =
formUniqueIdentifier(isIdentifierAvailable, preferredIdentifier, identifierPrefix);
327 takenIdentifiers.insert(uniqueIdentifier);
328 return uniqueIdentifier;
337 const string &preferredIdentifier,
const string &identifierPrefix)
339 string unique = preferredIdentifier;
340 string prefix = (! identifierPrefix.empty() ? identifierPrefix : preferredIdentifier);
343 while (! isIdentifierAvailable(unique))
346 oss << prefix << suffix++;
360 MMIOT *doc = mkd_string(markdownString.c_str(), markdownString.length(), MKD_NOPANTS);
363 mkd_document(doc, &html);
364 string htmlString(html);
369 replaceAll(htmlString,
"\n</code></pre>",
"</code></pre>");
381 size_t length = markdownString.length();
386 mkd_line((
char *)markdownString.c_str(), length, &html, MKD_NOPANTS);
387 string htmlString(html);
406 bool forceFirstLetterToUpper,
bool forceFirstLetterToLower,
bool forceInterveningLettersToLower,
407 bool allowSeparatorDots)
409 string camelCaseString;
411 bool uppercaseNext = forceFirstLetterToUpper;
412 bool lowercaseNext = forceFirstLetterToLower;
413 bool previousWasDot =
false;
414 for (string::const_iterator i = originalString.begin(); i != originalString.end(); ++i)
416 if (first && !isalpha(*i))
420 bool isDot = *i ==
'.';
421 if (allowSeparatorDots && isDot)
425 uppercaseNext =
false;
427 else if (!isalnum(*i))
429 uppercaseNext =
true;
434 camelCaseString += toupper(*i);
435 else if (lowercaseNext)
436 camelCaseString += tolower(*i);
438 camelCaseString += *i;
440 uppercaseNext =
false;
441 lowercaseNext = forceInterveningLettersToLower;
442 previousWasDot = isDot;
446 if (allowSeparatorDots)
447 while (
endsWith(camelCaseString,
"."))
450 return camelCaseString;
463 if (camelCaseString ==
"x")
465 else if (camelCaseString ==
"y")
467 else if (camelCaseString ==
"z")
469 else if (camelCaseString ==
"w")
471 else if (camelCaseString ==
"xy")
473 else if (camelCaseString ==
"osc")
477 out += toupper(camelCaseString[0]);
479 size_t length = camelCaseString.length();
480 for (
int i = 1; i < length; ++i)
482 char c = camelCaseString[i];
483 if (isupper(c) || (isdigit(c) && !isdigit(camelCaseString[i-1])))
515 for (
auto lower : allCaps)
517 string upper = lower;
518 std::transform(upper.begin(), upper.end(), upper.begin(), ::toupper);
533 CFStringRef cfString = (CFStringRef)cfs;
536 const char *utf8StringPtr = CFStringGetCStringPtr(cfString, kCFStringEncodingUTF8);
538 return utf8StringPtr;
541 CFIndex maxBytes = CFStringGetMaximumSizeForEncoding(CFStringGetLength(cfString), kCFStringEncodingUTF8) + 1;
542 char *t = (
char *)calloc(1, maxBytes);
543 CFStringGetCString(cfString, t, maxBytes, kCFStringEncodingUTF8);
555 static const char alphanum[] =
557 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
558 "abcdefghijklmnopqrstuvwxyz";
560 string hash(length, 0);
561 for (
int i = 0; i < length; ++i)
562 hash[i] = alphanum[arc4random_uniform(
sizeof(alphanum)-1)];