Can you help explain the following construct in d3.....packages.root(classes)? - javascript

Can you explain the following in d3?
var nodes = cluster.nodes(packages.root(classes)),
links = packages.imports(nodes);
I can't seem to find the proper information on the packages.root and packages.imports.
I think I know what the code is doing.
This is from the bundle-radial.js in the d3 examples.

The packages object is defined in packages.js, which each of the bundle example html files includes ahead of their respective bundle-X.js.

Related

JavaScript JSON - Value from nested data - SyntaxError in CodePens debug mode

I am no JavaScript expert, but after a long time of reading, experimenting and the power of Google and especially the results of stackoverflow I managed to work with the data of a REST API.
I made everything with CodePen, because it's nice to understand what I was doing.
Now I came to a problem that I can't solve myself. I tried to google it, but I think I just don't know the right keywords.
My problem is a SyntaxError which only occurs in debug mode. But I think my main problem is, that I understand how to get all values and work with all Object.keys and Object.values but not the correct way to get 1 specific value.
Uncaught SyntaxError: Unexpected token '['
The JSON file looks like this:
[{"label":"Value","next":Value, ...},{"label":"Value","next":Value, ...}, ...]
My JavaScript Code looks like this:
const api_url = 'external json file';
async function getBrowsersData() {
const response_api_url = await fetch(api_url_api_url);
const data_api_url = await response_api_url.json();
const data = data_api_url.[0].label;
The SyntaxError comes from the [0], what is the explained way here, if I understand it right.
If I use ["0"] as described here, I get a SyntaxError in CodePen without Debug Mode.
Can someone please explain how I select the first label and, more importantly, why this works in CodePen, but not in its debug mode?
A link with a detailed description would help me too. I know it's probably a very simple question, but I am stuck and out of keywords I could search.
I have read this excellent and very detailed answer several times, but I do not understand my mistake.
Can you provide the codepen? It's hard to see exactly what you're doing wrong without full sample data
A quick issue I see is this though:
const data = data_browsers_30.[0].label;
should probably be:
const data = data_browsers_30[0].label;
That's the reason you get the SyntaxError; you don't need the . before [0].
if you think the label key is the issue this syntax is generally also valid:
const data = data_browsers_30[0]["label"]

Jasper Reports - HTML5 Reports(highcharts) - String Replace for Labels

Hoping someone can help. Trying to do a string replace on the labels for my bar chart. So this is built on jasper studio and is a html5 report.
Trying to add the replace function as a javascript function in the report "Advanced Properties". Previously I have successfully set a function here for xAxis.labels.formatter to append labels,
"function(){return this.value.toString().substring(0,5)}"
I have tried to update this for string replace and came up with the below:
"function(){return this.value.toString().str.replace("Section7","W3Schools")}"
This is not working.I dont have much javascript experience and I have tried different formats of the above but no luck so far, any suggestions would be much appreciated?
Got it working. The replace function, works with the below:
Set property name as:
xAxis.labels.formatter
Use as expression:
true
3.Property Value:
"function(){return this.value.replace(\"Section 7\",\"W3Schools\")}"
Or
<hc:chartProperty name="xAxis.labels.formatter">
<hc:propertyExpression><![CDATA["function(){return this.value.replace(\"Section 7\",\"W3Schools\")}"]]></hc:propertyExpression>
</hc:chartProperty>

methods of Underscore.js in parse cloud code

I am trying to retrieve random 200 objects from the array returned to me by query.find() method. First i tried to implement all random number generation and all . And just now i got introduced to underscore.js method "_.sample" .
But something is going wrong. I dont have much knowledge of underscore.js. So if someone could help that will be great.
When i try to sun _.sample method it give me the error :
TypeError: Object function (e){if(e instanceof T)return e;if(!(this instanceof T))return new T(e);this._wrapped=e} has no method 'sample'
Someone please explain what exactly this error is. I tried searching but didn't get explanatory content. Thank you in advance.
Here's the code :
var queryPhrases = new Parse.Query("Phrases");
queryPhrases.select("phraseId");
queryPhrases.find().then(function(phrases){
var arrayOfUnused = _.sample(phrases,request.params.count);
user.add("usedPhrases",arrayOfUnused);
user.save();
response.success(arrayOfUnused) ;
});
Parse Cloud Code includes an outdated version of Underscore, but frustratingly, I can't find anything stating which version. While Underscore no longer ships with the Parse Javascript SDK as of v1.6.0 (late 2015), previously it had only used UnderscoreJS v1.4.4 (early 2013), so I'd expect Cloud Code to be using something from around then.
Adding the latest Underscore source to your Cloud Code is always an option, and then require it like any other of your own files.
Alternatively, I used the following to show a list of functions available in the included Underscore Cloud Code module.
var _ = require('underscore');
var availableFunctions = _.functions(_);
console.log('Available Underscore Functions: ' + JSON.stringify(availableFunctions));
Thanks a lot guys for your responses. I couldn't find the reason or the solution to run _.sample in my code. So i implemented it the other way. Here's what i did.
var arrayOfUnused = _.first(_.shuffle(phrases),request.params.count);
This works. :-)

In javascript: Changing "src" for a newly created script-element doesn't work..?

I'm very new to javascript, but I've managed to stitch the following together from different code-snippets, and forum-posts:
var s = document.createElement("script");
s.src = "http://service.somewebsite.com/?api-key=4P1k3y5R4w50m3";
document.getElementsByTagName("body")[0].appendChild(s);
However - it doesn't work.
The source-attribute is obviously not real (the service asked me to not share the API-key), but pasting the actual one into a browser, I get the excact script I want - with the right callback and everything.
I find it odd that this code doesn't work since the very similar
var i = document.createElement("img");
i.src = "http://i.imgur.com/TsCGbsy.jpg";
document.getElementsByTagName("body")[0].appendChild(i);
...executes just fine, when it takes its place. Is there something I don't know about changing the source of a script-element, or is there something else I've overlooked?
On a side note: I want to end up having "s.src" rely on some variables like the method, the api-key etc. (which is why I define it like this). If anyone has some other elegant solution to this, I'd be thankful as well. Any tips on syntax etc. are also very welcome.
Thanks in advance for any sort of help on this!
EDIT: I maybe should have mentioned that I'm trying to execute code from a source that consists of a JSON-object wrapped in a callback-function. The link itself works fine, and the function is executed properly when using
<script src = "http://service.somewebsite.com/?api-key=
k3y&callback=myFunction">
</script>
I'm basically attempting to do the same thing, only with (src) being stitched together from a string and one or more variables.
Try using setAttribute:
var s = document.createElement('script');
s.setAttribute("type","text/javascript");
s.setAttribute("src", "http://service.somewebsite.com/?api-key=4P1k3y5R4w50m3");

How can I make vim's taglist plugin show useful information for javascript?

I've recently abandoned mouse-driven, platform-specific GUI editors and committed entirely to vim. The experience so far has been fantastic, but I'm stuck when it comes to Javascript.
The ever-popular taglist utility (using Exuberant Ctags) has been great for everything but Javascript. With the language's overly-free form and structure, taglist could only pick up a handful of functions when I opened it up -- only those defined in the format:
function FUNCNAME (arg1, arg2) {
but no variables or function objects defined like:
var myFunc = function (arg1, arg2) {
So I googled a bit and found the following definition set for ctags, which I put in my ~/.ctags file:
--langdef=js
--langmap=js:.js
--regex-js=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*\{/\1/,object/
--regex-js=/([A-Za-z0-9._$()]+)[ \t]*[:=][ \t]*function[ \t]*\(/\1/,function/
--regex-js=/function[ \t]+([A-Za-z0-9._$]+)[ \t]*([^])])/\1/,function/
--regex-js=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*\[/\1/,array/
--regex-js=/([^= ]+)[ \t]*=[ \t]*[^""]'[^'']*/\1/,string/
--regex-js=/([^= ]+)[ \t]*=[ \t]*[^'']"[^""]*/\1/,string/
After that, running ctags from the command line was fantastic. It found every function and object that I needed it to find.
The problem is that the taglist.vim plugin isn't seeing those new results. When I open my javascript file in vim and hit :TlistToggle, I get the exact same meager handful of functions I got before. I hit 'u' to update the list, with no effect.
Digging into taglist.vim, I found this:
" java language
let s:tlist_def_java_settings = 'java;p:package;c:class;i:interface;' .
\ 'f:field;m:method'
" javascript language
let s:tlist_def_javascript_settings = 'javascript;f:function'
...which implies we're only looking at one specific kind of output from the ctags utility for javascript. Unfortunately, I'm not savvy enough with taglist or vim in general (yet) to discover what change I can make to get all those wonderful ctags command-line results to show up in vim.
Help appreciated!
Got it! I dove into the taglist.vim code for awhile, and this is what I found:
taglist.vim forces ctags to use the same filetype that vim is using. So even though the ~/.ctags snippet I found via google is assigning my much-needed definitions to the new "js" language and applying it to files that end in .js, taglist is forcing ctags into using the "JavaScript" filetype that vim is using -- which is built right into ctags already.
The solution is to change the ~/.ctags file from what I've posted above to this:
--regex-JavaScript=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*new[ \t]+Object\(/\1/o,object/
--regex-JavaScript=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*\{/\1/o,object/
--regex-JavaScript=/([A-Za-z0-9._$()]+)[ \t]*[:=][ \t]*function[ \t]*\(/\1/f,function/
--regex-JavaScript=/function[ \t]+([A-Za-z0-9._$]+)[ \t]*\([^\]\)]*\)/\1/f,function/
--regex-JavaScript=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*new[ \t]+Array\(/\1/a,array/
--regex-JavaScript=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*\[/\1/a,array/
--regex-JavaScript=/([^= ]+)[ \t]*=[ \t]*[^""]'[^'']*/\1/s,string/
--regex-JavaScript=/([^= ]+)[ \t]*=[ \t]*[^'']"[^""]*/\1/s,string/
which alters the pre-existing JavaScript language definition directly, rather than creating a new language definition within ctags. Now, when taglib forces vim's registered filetype, the new definitions are used. Also missing from the previously posted ~/.ctags lines was the "kind" letter that Al mentioned in his answer, so those are included in my updated version as well.
From there, drop the following into your ~/.vimrc to activate the new types:
let g:tlist_javascript_settings = 'javascript;s:string;a:array;o:object;f:function'
All-in-all, the new regex lines aren't perfect -- they'll definitely need some tweaking to avoid a lot of false positives, and it might be nice to separate out constants and such. But now, at least, I have the ability to do that :).
Edit: Added instructions on how to activate types without editing the plugin, and vastly improved the main ctags function regex to avoid some false-positives.
Edit 2: Added more array and object definitions to the ctags regex.
I ran into this post on a google search, and although your findings are excellent, I think we can improve them. This is the results of a bit of hacking on your solution:
.ctags
--regex-JavaScript=/^var[ \t]+([a-zA-Z0-9_$]+) = \[/\1/a,array/
--regex-JavaScript=/^var[ \t]+([a-zA-Z0-9_$]+) = \{/\1/o,object/
--regex-JavaScript=/^var[ \t]+([a-zA-Z0-9_$]+) = (^{^[)+/\1/r,var/
--regex-JavaScript=/^[ \t]*(this\.)?([A-Za-z0-9_$()]+)[ \t]*[:=][ \t]*function[ \t]*\(\)/\2/u,function/
--regex-JavaScript=/^[ \t]*function ([a-z0-9]+[A-Za-z0-9_]*)/\1/u,function/
--regex-JavaScript=/^[ \t]*([A-Za-z0-9]+)\.prototype\.([a-z0-9]+[A-Za-z0-9_]*)/\1 : \2/u,function/
--regex-JavaScript=/^[ \t]*function ([A-Z]+[A-Za-z0-9_]*)/\1/o,object/
.vimrc
let g:tlist_javascript_settings = 'javascript;r:var;s:string;a:array;o:object;u:function'
This gets rid of a few more false positives, and adds some more features in, as a tradeoff for getting rid of some of the more problematic regexes. I'll keep updating if I find I need more.
Edit: I've gotten everything working really nicely now; I feel like this result is solid. The only major deficiency is that it doesn't work on comma separated variable definitions. That seems particularly nasty. Maybe another day. :)
Note also that I changed the .vimrc. This isn't because I'm a freak; it's because somehow taglist or ctags or something has some default values set, and if you don't change it, then you get a lot of doubles where functions and vars are concerned, which really drives me insane (I pay super attention to detail.. :P )
Edit: More tweaks. It picks up on prototype function declarations now, and doesn't do some other stupid stuff.
The best-practice solution, which is also very new, neat and easy way to get JavaScript source-code browsing / tag-list in Vim, is using Mozilla's DoctorJS (formerly known as jsctags).
See my answer for this question for more info.
Enjoy. :)
I've not used javascript or taglist much, but looking through :help taglist-extend, it looks like your definitions (listed above) rename the javascript output to js, so you'll probably need something like (in your vimrc):
let tlist_js_settings = 'js;f:function;m:method'
This is assuming that the ctags 'kind' is 'f' for function and 'm' for method. Have a look at your tags file and see what the 'kind' column looks like. By way of example, my C code tags file includes this line:
ADC_CR1_AWDCH_0 .\LibraryModules\CMSIS\Headers\stm32f10x.h 2871;" d
This is a #define of a symbol ADC_CR1_AWDCH_0, which is in the listed file at line 2871. The 'd' is the ctags 'kind' for a defined name. Hopefully that will give you enough to get you going.
As an aside, I'm not sure whether the override will work correctly, so it might be worth naming your file 'myfile.mjs' and changing your langmap to js:.mjs until it's working properly. Then at least you'll know whether your problems are associated with misidentification of files or the actual parsing.
Hi thanks to Tom Frost for his question and research, I think there is a little problem with the 4th line regexp of your final answer:
--regex-JavaScript=/function[ \t]+([A-Za-z0-9._$]+)[ \t]*\([^\]\)]*\)/\1/f,function/
Doesn't worked for me, I pulled it a bit and now works ok:
--regex-JavaScript=/function[ \t]+([A-Za-z0-9._$]+)[ \t]*\([^\)]*\)/\1/f,function/
PD. The others answers' regexps posted here doesn't work at all at least for me :-?
To avoid duplicate entries from ctags' built in javascript support I define 'js' language as in original post and help taglist use ctags with it. I also make sure that tagnames are stripped from some less useful bits (quotes, "this.", ".prototype"). I don't use object/array/string/var regexps, but it's easy to combine my regexps with the other suggestions.
~/.ctags:
--langdef=js
--langmap=js:.js
--regex-js=/["']?(this\.)?([A-Za-z0-9_$]+)["']?((\.prototype)?(\.[A-Za-z0-9_$]+))?[ \t]*[:=][ \t]*function/\2\5/f,function/
--regex-js=/function[ \t]+([A-Za-z0-9_$]+)/\1/f,function/
~/.vimrc:
let g:tlist_javascript_settings = 'js;f:function'

Categories