mirror of
https://github.com/vishalxl/nostr_console.git
synced 2025-06-12 18:01:24 +02:00
added utils.dart
moved string related and other such code to utils.dart
This commit is contained in:
parent
c54e36c603
commit
f1ab310630
@ -4,6 +4,7 @@ import 'package:nostr_console/event_ds.dart';
|
|||||||
import 'package:nostr_console/tree_ds.dart';
|
import 'package:nostr_console/tree_ds.dart';
|
||||||
import 'package:nostr_console/relays.dart';
|
import 'package:nostr_console/relays.dart';
|
||||||
import 'package:nostr_console/settings.dart';
|
import 'package:nostr_console/settings.dart';
|
||||||
|
import 'package:nostr_console/utils.dart';
|
||||||
import 'package:bip340/bip340.dart';
|
import 'package:bip340/bip340.dart';
|
||||||
import 'package:qr/qr.dart';
|
import 'package:qr/qr.dart';
|
||||||
|
|
||||||
@ -1474,9 +1475,6 @@ Future<void> socialMenuUi(Store node) async {
|
|||||||
} // end while
|
} // end while
|
||||||
} // end mainMenuUi()
|
} // end mainMenuUi()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void showInitialNotifications(Store node) {
|
void showInitialNotifications(Store node) {
|
||||||
|
|
||||||
bool hasNotifications (Tree t) => t.treeSelectorNotifications();
|
bool hasNotifications (Tree t) => t.treeSelectorNotifications();
|
||||||
|
@ -4,6 +4,7 @@ import 'dart:math';
|
|||||||
import 'package:bip340/bip340.dart';
|
import 'package:bip340/bip340.dart';
|
||||||
import 'package:intl/intl.dart';
|
import 'package:intl/intl.dart';
|
||||||
import 'package:nostr_console/tree_ds.dart';
|
import 'package:nostr_console/tree_ds.dart';
|
||||||
|
import 'package:nostr_console/utils.dart';
|
||||||
import 'package:translator/translator.dart';
|
import 'package:translator/translator.dart';
|
||||||
import 'package:crypto/crypto.dart';
|
import 'package:crypto/crypto.dart';
|
||||||
import 'package:nostr_console/settings.dart';
|
import 'package:nostr_console/settings.dart';
|
||||||
@ -13,7 +14,6 @@ import "package:pointycastle/export.dart";
|
|||||||
import 'package:kepler/kepler.dart';
|
import 'package:kepler/kepler.dart';
|
||||||
import 'package:http/http.dart' as http;
|
import 'package:http/http.dart' as http;
|
||||||
|
|
||||||
|
|
||||||
String getStrInColor(String s, String commentColor) => stdout.supportsAnsiEscapes ?"$commentColor$s$gColorEndMarker":s;
|
String getStrInColor(String s, String commentColor) => stdout.supportsAnsiEscapes ?"$commentColor$s$gColorEndMarker":s;
|
||||||
void printInColor(String s, String commentColor) => stdout.supportsAnsiEscapes ?stdout.write("$commentColor$s$gColorEndMarker"):stdout.write(s);
|
void printInColor(String s, String commentColor) => stdout.supportsAnsiEscapes ?stdout.write("$commentColor$s$gColorEndMarker"):stdout.write(s);
|
||||||
void printWarning(String s) => stdout.supportsAnsiEscapes ?stdout.write("$gWarningColor$s$gColorEndMarker\n"):stdout.write("$s\n");
|
void printWarning(String s) => stdout.supportsAnsiEscapes ?stdout.write("$gWarningColor$s$gColorEndMarker\n"):stdout.write("$s\n");
|
||||||
@ -54,42 +54,6 @@ Map< String, List<List<String>> > gReactions = {};
|
|||||||
// is updated as kind 3 events are received
|
// is updated as kind 3 events are received
|
||||||
Map< String, List<Contact>> gContactLists = {};
|
Map< String, List<Contact>> gContactLists = {};
|
||||||
|
|
||||||
String myPadRight(String str, int width) {
|
|
||||||
String newStr = "";
|
|
||||||
|
|
||||||
if( str.length < width) {
|
|
||||||
newStr = str.padRight(width);
|
|
||||||
} else {
|
|
||||||
newStr = str.substring(0, width);
|
|
||||||
}
|
|
||||||
return newStr;
|
|
||||||
}
|
|
||||||
|
|
||||||
// returns tags as string that can be used to calculate event has. called from EventData constructor
|
|
||||||
String getStrTagsFromJson(dynamic json) {
|
|
||||||
String str = "";
|
|
||||||
|
|
||||||
int i = 0;
|
|
||||||
for( dynamic tag in json ) {
|
|
||||||
if( i != 0) {
|
|
||||||
str += ",";
|
|
||||||
}
|
|
||||||
|
|
||||||
str += "[";
|
|
||||||
int j = 0;
|
|
||||||
for(dynamic element in tag) {
|
|
||||||
if( j != 0) {
|
|
||||||
str += ",";
|
|
||||||
}
|
|
||||||
str += "\"${element.toString()}\"";
|
|
||||||
j++;
|
|
||||||
}
|
|
||||||
str += "]";
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool verifyEvent(dynamic json) {
|
bool verifyEvent(dynamic json) {
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
@ -1000,21 +964,6 @@ void addToHistogram(Map<String, int> histogram, List<String> pTags) {
|
|||||||
//return histogram;
|
//return histogram;
|
||||||
}
|
}
|
||||||
|
|
||||||
class HistogramEntry {
|
|
||||||
String str;
|
|
||||||
int count;
|
|
||||||
HistogramEntry(this.str, this.count);
|
|
||||||
static int histogramSorter(HistogramEntry a, HistogramEntry b) {
|
|
||||||
if( a.count < b.count ) {
|
|
||||||
return 1;
|
|
||||||
} if( a.count == b.count ) {
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// return the numMostFrequent number of most frequent p tags ( user pubkeys) in the given events
|
// return the numMostFrequent number of most frequent p tags ( user pubkeys) in the given events
|
||||||
List<String> getpTags(Set<Event> events, int numMostFrequent) {
|
List<String> getpTags(Set<Event> events, int numMostFrequent) {
|
||||||
List<HistogramEntry> listHistogram = [];
|
List<HistogramEntry> listHistogram = [];
|
||||||
@ -1268,7 +1217,6 @@ int getSecondsDaysAgo( int N) {
|
|||||||
return DateTime.now().subtract(Duration(days: N)).millisecondsSinceEpoch ~/ 1000;
|
return DateTime.now().subtract(Duration(days: N)).millisecondsSinceEpoch ~/ 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
void printUnderlined(String x) => { stdout.write("$x\n${getNumDashes(x.length)}\n")};
|
|
||||||
|
|
||||||
void printDepth(int d) {
|
void printDepth(int d) {
|
||||||
for( int i = 0; i < gSpacesPerDepth * d + gNumLeftMarginSpaces; i++) {
|
for( int i = 0; i < gSpacesPerDepth * d + gNumLeftMarginSpaces; i++) {
|
||||||
@ -1294,34 +1242,6 @@ String getDepthSpaces(int d) {
|
|||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
String getNumSpaces(int num) {
|
|
||||||
String s = "";
|
|
||||||
for( int i = 0; i < num; i++) {
|
|
||||||
s += " ";
|
|
||||||
}
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
String getNumDashes(int num, [String dashType = "-"]) {
|
|
||||||
String s = "";
|
|
||||||
for( int i = 0; i < num; i++) {
|
|
||||||
s += dashType;
|
|
||||||
}
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
List<List<int>> getUrlRanges(String s) {
|
|
||||||
List<List<int>> urlRanges = [];
|
|
||||||
String regexp1 = "http[s]*:\/\/[a-zA-Z0-9]+([.a-zA-Z0-9/_\\-\\#\\+=\\&\\?]*)";
|
|
||||||
|
|
||||||
RegExp httpRegExp = RegExp(regexp1);
|
|
||||||
for( var match in httpRegExp.allMatches(s) ) {
|
|
||||||
List<int> entry = [match.start, match.end];
|
|
||||||
urlRanges.add(entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
return urlRanges;
|
|
||||||
}
|
|
||||||
|
|
||||||
// make a paragraph of s that starts at numSpaces ( from screen left), and does not extend beyond gTextWidth+gNumLeftMarginSpaces. break it, or add
|
// make a paragraph of s that starts at numSpaces ( from screen left), and does not extend beyond gTextWidth+gNumLeftMarginSpaces. break it, or add
|
||||||
// a newline if it goes beyond gTextWidth + gNumLeftMarginSpaces
|
// a newline if it goes beyond gTextWidth + gNumLeftMarginSpaces
|
||||||
@ -1351,16 +1271,6 @@ String makeParagraphAtDepth(String s, int depthInSpaces) {
|
|||||||
return newString;
|
return newString;
|
||||||
}
|
}
|
||||||
|
|
||||||
// returns true if n is in any of the ranges given in list
|
|
||||||
int isInRange( int n, List<List<int>> ranges ) {
|
|
||||||
for( int i = 0; i < ranges.length; i++) {
|
|
||||||
if( n >= ranges[i][0] && n < ranges[i][1]) {
|
|
||||||
return ranges[i][1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// returns from string[startIndex:] the first len number of chars. no newline is added.
|
// returns from string[startIndex:] the first len number of chars. no newline is added.
|
||||||
List getLineWithMaxLen(String s, int startIndex, int lenPerLine, String spacesString, List<List<int>> urlRanges) {
|
List getLineWithMaxLen(String s, int startIndex, int lenPerLine, String spacesString, List<List<int>> urlRanges) {
|
||||||
|
|
||||||
@ -1431,104 +1341,6 @@ List getLineWithMaxLen(String s, int startIndex, int lenPerLine, String spacesSt
|
|||||||
return [line, i - startIndex];
|
return [line, i - startIndex];
|
||||||
}
|
}
|
||||||
|
|
||||||
bool nonEnglish(String str) {
|
|
||||||
bool result = false;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isNumeric(String s) {
|
|
||||||
return double.tryParse(s) != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isWordSeparater(String s) {
|
|
||||||
if( s.length != 1) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return s[0] == ' ' || s[0] == '\n' || s[0] == '\r' || s[0] == '\t'
|
|
||||||
|| s[0] == ',' || s[0] == '.' || s[0] == '-' || s[0] == '('|| s[0] == ')';
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool isWhitespace(String s) {
|
|
||||||
if( s.length != 1) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return s[0] == ' ' || s[0] == '\n' || s[0] == '\r' || s[0] == '\t';
|
|
||||||
}
|
|
||||||
|
|
||||||
extension StringX on String {
|
|
||||||
|
|
||||||
|
|
||||||
int isChannelPageNumber(int max) {
|
|
||||||
|
|
||||||
if(this.length < 2 || this[0] != '/') {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
String rest = this.substring(1);
|
|
||||||
|
|
||||||
//print("rest = $rest");
|
|
||||||
int? n = int.tryParse(rest);
|
|
||||||
if( n != null) {
|
|
||||||
if( n < max)
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
isEnglish( ) {
|
|
||||||
// since smaller words can be smileys they should not be translated
|
|
||||||
if( length < 10)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if( !isLatinAlphabet())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (isRomanceLanguage())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
isPortugese() {
|
|
||||||
false; // https://1000mostcommonwords.com/1000-most-common-portuguese-words/
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isRomanceLanguage() {
|
|
||||||
|
|
||||||
// https://www.thoughtco.com/most-common-french-words-1372759
|
|
||||||
Set<String> frenchWords = {"oui", "je", "le", "un", "de", "merci", "une", "ce", "pas"}; // "et" is in 'et al'
|
|
||||||
Set<String> spanishWords = {"y", "se", "el", "uso", "que", "te", "los", "va", "ser", "si", "por", "lo", "es", "era", "un", "o"};
|
|
||||||
Set<String> portugeseWords = {"como", "seu", "que", "ele", "foi", "eles", "tem", "este", "por", "quente", "vai",
|
|
||||||
"ter", "mas", "ou", "teve", "fora", "é", "te", "mais"};
|
|
||||||
|
|
||||||
Set<String> romanceWords = frenchWords.union(spanishWords).union(portugeseWords);
|
|
||||||
for( String word in romanceWords) {
|
|
||||||
if( this.toLowerCase().contains(" $word ")) {
|
|
||||||
if( gDebug > 0) print("isRomanceLanguage: Found ${this.toString()} is romance language");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
isLatinAlphabet({caseSensitive = false}) {
|
|
||||||
int countLatinletters = 0;
|
|
||||||
for (int i = 0; i < length; i++) {
|
|
||||||
final target = caseSensitive ? this[i] : this[i].toLowerCase();
|
|
||||||
if ( (target.codeUnitAt(0) > 96 && target.codeUnitAt(0) < 123) || ( isNumeric(target) ) || isWhitespace(target)) {
|
|
||||||
countLatinletters++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( countLatinletters < ( 40.0/100 ) * length ) {
|
|
||||||
if( gDebug > 0) print("in isLatinAlphabet: latin letters: $countLatinletters and total = $length ");
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// The contact only stores id and relay of contact. The actual name is stored in a global variable/map
|
// The contact only stores id and relay of contact. The actual name is stored in a global variable/map
|
||||||
class Contact {
|
class Contact {
|
||||||
@ -1542,23 +1354,6 @@ class Contact {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
String addEscapeChars(String str) {
|
|
||||||
String temp = "";
|
|
||||||
//temp = temp.replaceAll("\\", "\\\\");
|
|
||||||
temp = str.replaceAll("\"", "\\\"");
|
|
||||||
return temp.replaceAll("\n", "\\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
String unEscapeChars(String str) {
|
|
||||||
//print("in unEscape: |$str|");
|
|
||||||
String temp = str.replaceAll("\"", "\\\"");
|
|
||||||
//temp = temp.replaceAll("\\\\", "\\");
|
|
||||||
temp = temp.replaceAll("\n", "\\n");
|
|
||||||
//print("returning |$temp|\n");
|
|
||||||
return temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
String getShaId(String pubkey, String createdAt, String kind, String strTags, String content) {
|
String getShaId(String pubkey, String createdAt, String kind, String strTags, String content) {
|
||||||
String buf = '[0,"$pubkey",$createdAt,$kind,[$strTags],"$content"]';
|
String buf = '[0,"$pubkey",$createdAt,$kind,[$strTags],"$content"]';
|
||||||
if(gSpecificDebug > 0) print("in getShaId for buf: |$buf|");
|
if(gSpecificDebug > 0) print("in getShaId for buf: |$buf|");
|
||||||
@ -1777,14 +1572,6 @@ Set<Event> readEventsFromFile(String filename) {
|
|||||||
return events;
|
return events;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isValidPubkey(String pubkey) {
|
|
||||||
if( pubkey.length == 64) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
List<String> getEncryptedChannelKeys(List<String> secretMessageIds, Map<String, Tree> tempChildEventsMap, String channelId) {
|
List<String> getEncryptedChannelKeys(List<String> secretMessageIds, Map<String, Tree> tempChildEventsMap, String channelId) {
|
||||||
Event? e = tempChildEventsMap[channelId]?.event;
|
Event? e = tempChildEventsMap[channelId]?.event;
|
||||||
|
@ -2,6 +2,7 @@ import 'dart:io';
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'package:nostr_console/event_ds.dart';
|
import 'package:nostr_console/event_ds.dart';
|
||||||
import 'package:nostr_console/settings.dart';
|
import 'package:nostr_console/settings.dart';
|
||||||
|
import 'package:nostr_console/utils.dart';
|
||||||
import 'package:web_socket_channel/io.dart';
|
import 'package:web_socket_channel/io.dart';
|
||||||
|
|
||||||
class Relay {
|
class Relay {
|
||||||
|
@ -3,6 +3,7 @@ import 'dart:convert';
|
|||||||
import 'package:nostr_console/event_ds.dart';
|
import 'package:nostr_console/event_ds.dart';
|
||||||
import 'package:nostr_console/relays.dart';
|
import 'package:nostr_console/relays.dart';
|
||||||
import 'package:nostr_console/settings.dart';
|
import 'package:nostr_console/settings.dart';
|
||||||
|
import 'package:nostr_console/utils.dart';
|
||||||
|
|
||||||
typedef fTreeSelector = bool Function(Tree a);
|
typedef fTreeSelector = bool Function(Tree a);
|
||||||
typedef fRoomSelector = bool Function(ScrollableMessages room);
|
typedef fRoomSelector = bool Function(ScrollableMessages room);
|
||||||
|
218
lib/utils.dart
Normal file
218
lib/utils.dart
Normal file
@ -0,0 +1,218 @@
|
|||||||
|
import 'dart:io';
|
||||||
|
|
||||||
|
class HistogramEntry {
|
||||||
|
String str;
|
||||||
|
int count;
|
||||||
|
HistogramEntry(this.str, this.count);
|
||||||
|
static int histogramSorter(HistogramEntry a, HistogramEntry b) {
|
||||||
|
if( a.count < b.count ) {
|
||||||
|
return 1;
|
||||||
|
} if( a.count == b.count ) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool nonEnglish(String str) {
|
||||||
|
bool result = false;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isNumeric(String s) {
|
||||||
|
return double.tryParse(s) != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isWordSeparater(String s) {
|
||||||
|
if( s.length != 1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return s[0] == ' ' || s[0] == '\n' || s[0] == '\r' || s[0] == '\t'
|
||||||
|
|| s[0] == ',' || s[0] == '.' || s[0] == '-' || s[0] == '('|| s[0] == ')';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool isWhitespace(String s) {
|
||||||
|
if( s.length != 1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return s[0] == ' ' || s[0] == '\n' || s[0] == '\r' || s[0] == '\t';
|
||||||
|
}
|
||||||
|
|
||||||
|
extension StringX on String {
|
||||||
|
|
||||||
|
int isChannelPageNumber(int max) {
|
||||||
|
|
||||||
|
if(this.length < 2 || this[0] != '/') {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
String rest = this.substring(1);
|
||||||
|
|
||||||
|
//print("rest = $rest");
|
||||||
|
int? n = int.tryParse(rest);
|
||||||
|
if( n != null) {
|
||||||
|
if( n < max)
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
isEnglish( ) {
|
||||||
|
// since smaller words can be smileys they should not be translated
|
||||||
|
if( length < 10)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if( !isLatinAlphabet())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (isRomanceLanguage())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
isPortugese() {
|
||||||
|
false; // https://1000mostcommonwords.com/1000-most-common-portuguese-words/
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isRomanceLanguage() {
|
||||||
|
|
||||||
|
// https://www.thoughtco.com/most-common-french-words-1372759
|
||||||
|
Set<String> frenchWords = {"oui", "je", "le", "un", "de", "merci", "une", "ce", "pas"}; // "et" is in 'et al'
|
||||||
|
Set<String> spanishWords = {"y", "se", "el", "uso", "que", "te", "los", "va", "ser", "si", "por", "lo", "es", "era", "un", "o"};
|
||||||
|
Set<String> portugeseWords = {"como", "seu", "que", "ele", "foi", "eles", "tem", "este", "por", "quente", "vai",
|
||||||
|
"ter", "mas", "ou", "teve", "fora", "é", "te", "mais"};
|
||||||
|
|
||||||
|
Set<String> romanceWords = frenchWords.union(spanishWords).union(portugeseWords);
|
||||||
|
for( String word in romanceWords) {
|
||||||
|
if( this.toLowerCase().contains(" $word ")) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
isLatinAlphabet({caseSensitive = false}) {
|
||||||
|
int countLatinletters = 0;
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
final target = caseSensitive ? this[i] : this[i].toLowerCase();
|
||||||
|
if ( (target.codeUnitAt(0) > 96 && target.codeUnitAt(0) < 123) || ( isNumeric(target) ) || isWhitespace(target)) {
|
||||||
|
countLatinletters++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( countLatinletters < ( 40.0/100 ) * length ) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool isValidPubkey(String pubkey) {
|
||||||
|
if( pubkey.length == 64) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
String myPadRight(String str, int width) {
|
||||||
|
String newStr = "";
|
||||||
|
|
||||||
|
if( str.length < width) {
|
||||||
|
newStr = str.padRight(width);
|
||||||
|
} else {
|
||||||
|
newStr = str.substring(0, width);
|
||||||
|
}
|
||||||
|
return newStr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns tags as string that can be used to calculate event has. called from EventData constructor
|
||||||
|
String getStrTagsFromJson(dynamic json) {
|
||||||
|
String str = "";
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
for( dynamic tag in json ) {
|
||||||
|
if( i != 0) {
|
||||||
|
str += ",";
|
||||||
|
}
|
||||||
|
|
||||||
|
str += "[";
|
||||||
|
int j = 0;
|
||||||
|
for(dynamic element in tag) {
|
||||||
|
if( j != 0) {
|
||||||
|
str += ",";
|
||||||
|
}
|
||||||
|
str += "\"${element.toString()}\"";
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
str += "]";
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
String addEscapeChars(String str) {
|
||||||
|
String temp = "";
|
||||||
|
//temp = temp.replaceAll("\\", "\\\\");
|
||||||
|
temp = str.replaceAll("\"", "\\\"");
|
||||||
|
return temp.replaceAll("\n", "\\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
String unEscapeChars(String str) {
|
||||||
|
//print("in unEscape: |$str|");
|
||||||
|
String temp = str.replaceAll("\"", "\\\"");
|
||||||
|
//temp = temp.replaceAll("\\\\", "\\");
|
||||||
|
temp = temp.replaceAll("\n", "\\n");
|
||||||
|
//print("returning |$temp|\n");
|
||||||
|
return temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
void printUnderlined(String x) => { stdout.write("$x\n${getNumDashes(x.length)}\n")};
|
||||||
|
|
||||||
|
String getNumSpaces(int num) {
|
||||||
|
String s = "";
|
||||||
|
for( int i = 0; i < num; i++) {
|
||||||
|
s += " ";
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
String getNumDashes(int num, [String dashType = "-"]) {
|
||||||
|
String s = "";
|
||||||
|
for( int i = 0; i < num; i++) {
|
||||||
|
s += dashType;
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
List<List<int>> getUrlRanges(String s) {
|
||||||
|
List<List<int>> urlRanges = [];
|
||||||
|
String regexp1 = "http[s]*:\/\/[a-zA-Z0-9]+([.a-zA-Z0-9/_\\-\\#\\+=\\&\\?]*)";
|
||||||
|
|
||||||
|
RegExp httpRegExp = RegExp(regexp1);
|
||||||
|
for( var match in httpRegExp.allMatches(s) ) {
|
||||||
|
List<int> entry = [match.start, match.end];
|
||||||
|
urlRanges.add(entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
return urlRanges;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// returns true if n is in any of the ranges given in list
|
||||||
|
int isInRange( int n, List<List<int>> ranges ) {
|
||||||
|
for( int i = 0; i < ranges.length; i++) {
|
||||||
|
if( n >= ranges[i][0] && n < ranges[i][1]) {
|
||||||
|
return ranges[i][1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
@ -3,12 +3,9 @@ description: A multi-platform nostr client built for terminal/console
|
|||||||
version: 0.1.9-beta
|
version: 0.1.9-beta
|
||||||
homepage: https://github.com/vishalxl/nostr_console
|
homepage: https://github.com/vishalxl/nostr_console
|
||||||
|
|
||||||
# Release 0.1.9-beta
|
# Release 0.2.0-beta
|
||||||
# used kind 104
|
# added utils.dart
|
||||||
# fix for tag related test fail
|
# reply shortended
|
||||||
# default without argument invocation now possible with no pubkey
|
|
||||||
# fixed issues that made channels act wonky ( not update properly when created)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -52,6 +52,20 @@ void main() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
test('createNodeTree_unordered1', () {
|
test('createNodeTree_unordered1', () {
|
||||||
|
/**
|
||||||
|
▄────────────
|
||||||
|
█ 137: nostr is not federated is it? this is like a global feed of all nostr freaks?
|
||||||
|
|id: 1670 , 11:29 PM Aug 5
|
||||||
|
|
||||||
|
137: I don’t get the technical stuff about relays and things
|
||||||
|
|id: f3a2 , 11:31 PM Aug 5
|
||||||
|
|
||||||
|
137: different clients make sense to me. I can use different clients to
|
||||||
|
access nostr but is just one giant soup like twitter
|
||||||
|
|id: dfc5 , 11:32 PM Aug 5
|
||||||
|
█
|
||||||
|
────────────▀
|
||||||
|
* */
|
||||||
|
|
||||||
Event exampleEvent1 = Event.fromJson('["EVENT","latest",{"id":"167063f491c41b7b8f79bc74f318e8a8b0a802bf8364b8bb7d19c887d59ec5de","pubkey":"137d948a0eee45e6cd113faaad934fcf17a97de2236c655b70650d4252daa9d3","created_at":1659722388,"kind":1,"tags":[],"content":"nostr is not federated is it? this is like a global feed of all nostr freaks?","sig":"6db0b287015d9529dfbacef91561cb4e32afd6968edd8454867b8482bde01452e17b6f3de69bffcb2d9deba2a52d3c9ff82e04f7b18eb32428daf7eab5fd27c5"}]', "");
|
Event exampleEvent1 = Event.fromJson('["EVENT","latest",{"id":"167063f491c41b7b8f79bc74f318e8a8b0a802bf8364b8bb7d19c887d59ec5de","pubkey":"137d948a0eee45e6cd113faaad934fcf17a97de2236c655b70650d4252daa9d3","created_at":1659722388,"kind":1,"tags":[],"content":"nostr is not federated is it? this is like a global feed of all nostr freaks?","sig":"6db0b287015d9529dfbacef91561cb4e32afd6968edd8454867b8482bde01452e17b6f3de69bffcb2d9deba2a52d3c9ff82e04f7b18eb32428daf7eab5fd27c5"}]', "");
|
||||||
Event exampleEvent2 = Event.fromJson('["EVENT","latest",{"id":"f3a267ecbb631012da618de620bc1fe265f6429f412359bf02330b437cf88e67","pubkey":"137d948a0eee45e6cd113faaad934fcf17a97de2236c655b70650d4252daa9d3","created_at":1659722463,"kind":1,"tags":[["e","167063f491c41b7b8f79bc74f318e8a8b0a802bf8364b8bb7d19c887d59ec5de"]],"content":"I don’t get the technical stuff about relays and things","sig":"9f68031687214a24862226f291e3baadd956dc14ba9c5c552f8c881a40aacd34feda667ef4e4b09711cd43950eec2d272d5b11bd7636de5f457f38f31eaff398"}]', "");
|
Event exampleEvent2 = Event.fromJson('["EVENT","latest",{"id":"f3a267ecbb631012da618de620bc1fe265f6429f412359bf02330b437cf88e67","pubkey":"137d948a0eee45e6cd113faaad934fcf17a97de2236c655b70650d4252daa9d3","created_at":1659722463,"kind":1,"tags":[["e","167063f491c41b7b8f79bc74f318e8a8b0a802bf8364b8bb7d19c887d59ec5de"]],"content":"I don’t get the technical stuff about relays and things","sig":"9f68031687214a24862226f291e3baadd956dc14ba9c5c552f8c881a40aacd34feda667ef4e4b09711cd43950eec2d272d5b11bd7636de5f457f38f31eaff398"}]', "");
|
||||||
@ -60,7 +74,11 @@ void main() {
|
|||||||
Set<Event> listEvents = { exampleEvent3, exampleEvent2, exampleEvent1};
|
Set<Event> listEvents = { exampleEvent3, exampleEvent2, exampleEvent1};
|
||||||
|
|
||||||
Store node = Store.fromEvents(listEvents);
|
Store node = Store.fromEvents(listEvents);
|
||||||
node.printTree(0, DateTime.now().subtract(Duration(days:1000)), selectorTrees_all); // will test for ~1000 days
|
expect(node.topPosts.length, 1);
|
||||||
|
expect ( node.topPosts[0].children.length, 1);
|
||||||
|
expect ( node.topPosts[0].children[0].children.length, 1);
|
||||||
|
|
||||||
|
//node.printTree(0, DateTime.now().subtract(Duration(days:1000)), selectorTrees_all); // will test for ~1000 days
|
||||||
});
|
});
|
||||||
|
|
||||||
test('make_paragraph', () {
|
test('make_paragraph', () {
|
||||||
@ -216,7 +234,7 @@ String expectedResult =
|
|||||||
test('url_break2 ', () {
|
test('url_break2 ', () {
|
||||||
gTextWidth = 92;
|
gTextWidth = 92;
|
||||||
|
|
||||||
print("123456789|123456789|123456789|123456789|123456789|123456789|123456789|123456789|123456789|");
|
//print("123456789|123456789|123456789|123456789|123456789|123456789|123456789|123456789|123456789|");
|
||||||
List<String> urls = ["https://news.bitcoin.com/former-us-treasury-secretary-larry-summers-compares-ftx-collapse-to-enron-fraud/",
|
List<String> urls = ["https://news.bitcoin.com/former-us-treasury-secretary-larry-summers-compares-ftx-collapse-to-enron-fraud/",
|
||||||
"https://chromium.googlesource.com/chromium/src/net/+/259a070267d5966ba5ce4bbeb0a9c17b854f8000",
|
"https://chromium.googlesource.com/chromium/src/net/+/259a070267d5966ba5ce4bbeb0a9c17b854f8000",
|
||||||
" https://i.imgflip.com/71o242.jpg",
|
" https://i.imgflip.com/71o242.jpg",
|
||||||
@ -226,9 +244,7 @@ String expectedResult =
|
|||||||
|
|
||||||
urls.forEach((url) {
|
urls.forEach((url) {
|
||||||
String res = makeParagraphAtDepth(url, 30);
|
String res = makeParagraphAtDepth(url, 30);
|
||||||
print(url);
|
//print(url); print(res);print("");
|
||||||
print(res);
|
|
||||||
print("");
|
|
||||||
expect( res, url);
|
expect( res, url);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user